亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? expr.c

?? 調用sqlite開源數據的小程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
  if( pExpr==0 ) return 0;  savedHasAgg = pNC->hasAgg;  pNC->hasAgg = 0;  walkExprTree(pExpr, nameResolverStep, pNC);  if( pNC->nErr>0 ){    ExprSetProperty(pExpr, EP_Error);  }  if( pNC->hasAgg ){    ExprSetProperty(pExpr, EP_Agg);  }else if( savedHasAgg ){    pNC->hasAgg = 1;  }  return ExprHasProperty(pExpr, EP_Error);}/*** A pointer instance of this structure is used to pass information** through walkExprTree into codeSubqueryStep().*/typedef struct QueryCoder QueryCoder;struct QueryCoder {  Parse *pParse;       /* The parsing context */  NameContext *pNC;    /* Namespace of first enclosing query */};/*** Generate code for subqueries and IN operators.**** IN operators comes in two forms:****           expr IN (exprlist)** and**           expr IN (SELECT ...)**** The first form is handled by creating a set holding the list** of allowed values.  The second form causes the SELECT to generate ** a temporary table.*/#ifndef SQLITE_OMIT_SUBQUERYvoid sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){  int testAddr = 0;                       /* One-time test address */  Vdbe *v = sqlite3GetVdbe(pParse);  if( v==0 ) return;  /* This code must be run in its entirety every time it is encountered  ** if any of the following is true:  **  **    *  The right-hand side is a correlated subquery  **    *  The right-hand side is an expression list containing variables  **    *  We are inside a trigger  **  ** If all of the above are false, then we can run this code just once  ** save the results, and reuse the same result on subsequent invocations.  */  if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->trigStack ){    int mem = pParse->nMem++;    sqlite3VdbeAddOp(v, OP_MemLoad, mem, 0);    testAddr = sqlite3VdbeAddOp(v, OP_If, 0, 0);    assert( testAddr>0 || sqlite3_malloc_failed );    sqlite3VdbeAddOp(v, OP_MemInt, 1, mem);  }  switch( pExpr->op ){    case TK_IN: {      char affinity;      KeyInfo keyInfo;      int addr;        /* Address of OP_OpenVirtual instruction */      affinity = sqlite3ExprAffinity(pExpr->pLeft);      /* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)'      ** expression it is handled the same way. A virtual table is       ** filled with single-field index keys representing the results      ** from the SELECT or the <exprlist>.      **      ** If the 'x' expression is a column value, or the SELECT...      ** statement returns a column value, then the affinity of that      ** column is used to build the index keys. If both 'x' and the      ** SELECT... statement are columns, then numeric affinity is used      ** if either column has NUMERIC or INTEGER affinity. If neither      ** 'x' nor the SELECT... statement are columns, then numeric affinity      ** is used.      */      pExpr->iTable = pParse->nTab++;      addr = sqlite3VdbeAddOp(v, OP_OpenVirtual, pExpr->iTable, 0);      memset(&keyInfo, 0, sizeof(keyInfo));      keyInfo.nField = 1;      sqlite3VdbeAddOp(v, OP_SetNumColumns, pExpr->iTable, 1);      if( pExpr->pSelect ){        /* Case 1:     expr IN (SELECT ...)        **        ** Generate code to write the results of the select into the temporary        ** table allocated and opened above.        */        int iParm = pExpr->iTable +  (((int)affinity)<<16);        ExprList *pEList;        assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable );        sqlite3Select(pParse, pExpr->pSelect, SRT_Set, iParm, 0, 0, 0, 0);        pEList = pExpr->pSelect->pEList;        if( pEList && pEList->nExpr>0 ){           keyInfo.aColl[0] = binaryCompareCollSeq(pParse, pExpr->pLeft,              pEList->a[0].pExpr);        }      }else if( pExpr->pList ){        /* Case 2:     expr IN (exprlist)        **	** For each expression, build an index key from the evaluation and        ** store it in the temporary table. If <expr> is a column, then use        ** that columns affinity when building index keys. If <expr> is not        ** a column, use numeric affinity.        */        int i;        ExprList *pList = pExpr->pList;        struct ExprList_item *pItem;        if( !affinity ){          affinity = SQLITE_AFF_NUMERIC;        }        keyInfo.aColl[0] = pExpr->pLeft->pColl;        /* Loop through each expression in <exprlist>. */        for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){          Expr *pE2 = pItem->pExpr;          /* If the expression is not constant then we will need to          ** disable the test that was generated above that makes sure          ** this code only executes once.  Because for a non-constant          ** expression we need to rerun this code each time.          */          if( testAddr>0 && !sqlite3ExprIsConstant(pE2) ){            VdbeOp *aOp = sqlite3VdbeGetOp(v, testAddr-1);            int i;            for(i=0; i<3; i++){              aOp[i].opcode = OP_Noop;            }            testAddr = 0;          }          /* Evaluate the expression and insert it into the temp table */          sqlite3ExprCode(pParse, pE2);          sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &affinity, 1);          sqlite3VdbeAddOp(v, OP_IdxInsert, pExpr->iTable, 0);        }      }      sqlite3VdbeChangeP3(v, addr, (void *)&keyInfo, P3_KEYINFO);      break;    }    case TK_EXISTS:    case TK_SELECT: {      /* This has to be a scalar SELECT.  Generate code to put the      ** value of this select in a memory cell and record the number      ** of the memory cell in iColumn.      */      int sop;      Select *pSel;      pExpr->iColumn = pParse->nMem++;      pSel = pExpr->pSelect;      if( pExpr->op==TK_SELECT ){        sop = SRT_Mem;      }else{        static const Token one = { "1", 0, 1 };        sop = SRT_Exists;        sqlite3ExprListDelete(pSel->pEList);        pSel->pEList = sqlite3ExprListAppend(0,                           sqlite3Expr(TK_INTEGER, 0, 0, &one), 0);      }      sqlite3Select(pParse, pSel, sop, pExpr->iColumn, 0, 0, 0, 0);      break;    }  }  if( testAddr ){    sqlite3VdbeJumpHere(v, testAddr);  }  return;}#endif /* SQLITE_OMIT_SUBQUERY *//*** Generate an instruction that will put the integer describe by** text z[0..n-1] on the stack.*/static void codeInteger(Vdbe *v, const char *z, int n){  int i;  if( sqlite3GetInt32(z, &i) ){    sqlite3VdbeAddOp(v, OP_Integer, i, 0);  }else if( sqlite3FitsIn64Bits(z) ){    sqlite3VdbeOp3(v, OP_Int64, 0, 0, z, n);  }else{    sqlite3VdbeOp3(v, OP_Real, 0, 0, z, n);  }}/*** Generate code into the current Vdbe to evaluate the given** expression and leave the result on the top of stack.**** This code depends on the fact that certain token values (ex: TK_EQ)** are the same as opcode values (ex: OP_Eq) that implement the corresponding** operation.  Special comments in vdbe.c and the mkopcodeh.awk script in** the make process cause these values to align.  Assert()s in the code** below verify that the numbers are aligned correctly.*/void sqlite3ExprCode(Parse *pParse, Expr *pExpr){  Vdbe *v = pParse->pVdbe;  int op;  if( v==0 ) return;  if( pExpr==0 ){    sqlite3VdbeAddOp(v, OP_Null, 0, 0);    return;  }  op = pExpr->op;  switch( op ){    case TK_AGG_COLUMN: {      AggInfo *pAggInfo = pExpr->pAggInfo;      struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg];      if( !pAggInfo->directMode ){        sqlite3VdbeAddOp(v, OP_MemLoad, pCol->iMem, 0);        break;      }else if( pAggInfo->useSortingIdx ){        sqlite3VdbeAddOp(v, OP_Column, pAggInfo->sortingIdx,                              pCol->iSorterColumn);        break;      }      /* Otherwise, fall thru into the TK_COLUMN case */    }    case TK_COLUMN: {      if( pExpr->iColumn>=0 ){        sqlite3VdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);        sqlite3ColumnDefault(v, pExpr->pTab, pExpr->iColumn);      }else{        sqlite3VdbeAddOp(v, OP_Rowid, pExpr->iTable, 0);      }      break;    }    case TK_INTEGER: {      codeInteger(v, pExpr->token.z, pExpr->token.n);      break;    }    case TK_FLOAT:    case TK_STRING: {      assert( TK_FLOAT==OP_Real );      assert( TK_STRING==OP_String8 );      sqlite3DequoteExpr(pExpr);      sqlite3VdbeOp3(v, op, 0, 0, pExpr->token.z, pExpr->token.n);      break;    }    case TK_NULL: {      sqlite3VdbeAddOp(v, OP_Null, 0, 0);      break;    }#ifndef SQLITE_OMIT_BLOB_LITERAL    case TK_BLOB: {      int n;      const char *z;      assert( TK_BLOB==OP_HexBlob );      n = pExpr->token.n - 3;      z = pExpr->token.z + 2;      assert( n>=0 );      if( n==0 ){        z = "";      }      sqlite3VdbeOp3(v, op, 0, 0, z, n);      break;    }#endif    case TK_VARIABLE: {      sqlite3VdbeAddOp(v, OP_Variable, pExpr->iTable, 0);      if( pExpr->token.n>1 ){        sqlite3VdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);      }      break;    }    case TK_REGISTER: {      sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iTable, 0);      break;    }#ifndef SQLITE_OMIT_CAST    case TK_CAST: {      /* Expressions of the form:   CAST(pLeft AS token) */      int aff, op;      sqlite3ExprCode(pParse, pExpr->pLeft);      aff = sqlite3AffinityType(&pExpr->token);      switch( aff ){        case SQLITE_AFF_INTEGER:   op = OP_ToInt;      break;        case SQLITE_AFF_NUMERIC:   op = OP_ToNumeric;  break;        case SQLITE_AFF_TEXT:      op = OP_ToText;     break;        case SQLITE_AFF_NONE:      op = OP_ToBlob;     break;      }      sqlite3VdbeAddOp(v, op, 0, 0);      break;    }#endif /* SQLITE_OMIT_CAST */    case TK_LT:    case TK_LE:    case TK_GT:    case TK_GE:    case TK_NE:    case TK_EQ: {      assert( TK_LT==OP_Lt );      assert( TK_LE==OP_Le );      assert( TK_GT==OP_Gt );      assert( TK_GE==OP_Ge );      assert( TK_EQ==OP_Eq );      assert( TK_NE==OP_Ne );      sqlite3ExprCode(pParse, pExpr->pLeft);      sqlite3ExprCode(pParse, pExpr->pRight);      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 0, 0);      break;    }    case TK_AND:    case TK_OR:    case TK_PLUS:    case TK_STAR:    case TK_MINUS:    case TK_REM:    case TK_BITAND:    case TK_BITOR:    case TK_SLASH:    case TK_LSHIFT:    case TK_RSHIFT:     case TK_CONCAT: {      assert( TK_AND==OP_And );      assert( TK_OR==OP_Or );      assert( TK_PLUS==OP_Add );      assert( TK_MINUS==OP_Subtract );      assert( TK_REM==OP_Remainder );      assert( TK_BITAND==OP_BitAnd );      assert( TK_BITOR==OP_BitOr );      assert( TK_SLASH==OP_Divide );      assert( TK_LSHIFT==OP_ShiftLeft );      assert( TK_RSHIFT==OP_ShiftRight );      assert( TK_CONCAT==OP_Concat );      sqlite3ExprCode(pParse, pExpr->pLeft);      sqlite3ExprCode(pParse, pExpr->pRight);      sqlite3VdbeAddOp(v, op, 0, 0);      break;    }    case TK_UMINUS: {      Expr *pLeft = pExpr->pLeft;      assert( pLeft );      if( pLeft->op==TK_FLOAT || pLeft->op==TK_INTEGER ){        Token *p = &pLeft->token;        char *z = sqliteMalloc( p->n + 2 );        sprintf(z, "-%.*s", p->n, p->z);        if( pLeft->op==TK_FLOAT ){          sqlite3VdbeOp3(v, OP_Real, 0, 0, z, p->n+1);        }else{          codeInteger(v, z, p->n+1);        }        sqliteFree(z);        break;      }      /* Fall through into TK_NOT */    }    case TK_BITNOT:    case TK_NOT: {      assert( TK_BITNOT==OP_BitNot );      assert( TK_NOT==OP_Not );      sqlite3ExprCode(pParse, pExpr->pLeft);      sqlite3VdbeAddOp(v, op, 0, 0);      break;    }    case TK_ISNULL:    case TK_NOTNULL: {      int dest;      assert( TK_ISNULL==OP_IsNull );      assert( TK_NOTNULL==OP_NotNull );      sqlite3VdbeAddOp(v, OP_Integer, 1, 0);      sqlite3ExprCode(pParse, pExpr->pLeft);      dest = sqlite3VdbeCurrentAddr(v) + 2;      sqlite3VdbeAddOp(v, op, 1, dest);      sqlite3VdbeAddOp(v, OP_AddImm, -1, 0);      break;    }    case TK_AGG_FUNCTION: {      AggInfo *pInfo = pExpr->pAggInfo;      sqlite3VdbeAddOp(v, OP_MemLoad, pInfo->aFunc[pExpr->iAgg].iMem, 0);      break;    }    case TK_CONST_FUNC:    case TK_FUNCTION: {      ExprList *pList = pExpr->pList;      int nExpr = pList ? pList->nExpr : 0;      FuncDef *pDef;      int nId;      const char *zId;      int constMask = 0;      int i;      u8 enc = pParse->db->enc;      CollSeq *pColl = 0;      zId = pExpr->token.z;      nId = pExpr->token.n;      pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, enc, 0);      assert( pDef!=0 );      nExpr = sqlite3ExprCodeExprList(pParse, pList);      for(i=0; i<nExpr && i<32; i++){        if( sqlite3ExprIsConstant(pList->a[i].pExpr) ){          constMask |= (1<<i);        }        if( pDef->needCollSeq && !pColl ){          pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr);        }      }      if( pDef->needCollSeq ){        if( !pColl ) pColl = pParse->db->pDfltColl;         sqlite3VdbeOp3(v, OP_CollSeq, 0, 0, (char *)pColl, P3_COLLSEQ);      }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩极品在线观看一区| 欧美日韩中文国产| 色呦呦国产精品| 日韩一区二区三区四区| 国产亚洲精品免费| 午夜久久久久久电影| 成a人片国产精品| 日韩欧美视频一区| 亚洲一区二区三区四区在线观看| 狠狠狠色丁香婷婷综合久久五月| 欧美在线不卡视频| 国产精品免费视频观看| 日韩影视精彩在线| 91免费精品国自产拍在线不卡| 欧美精品一区二区三区四区| 亚洲不卡av一区二区三区| 成人免费观看男女羞羞视频| 精品欧美乱码久久久久久| 亚洲国产aⅴ天堂久久| 成人av网址在线观看| 精品99久久久久久| 日日夜夜精品免费视频| 91久久精品国产91性色tv | 在线播放欧美女士性生活| 国产精品不卡在线| 国产高清视频一区| 亚洲男人的天堂在线观看| 五月激情综合网| 在线观看91视频| 亚洲欧洲综合另类在线| 成人午夜电影网站| 国产午夜亚洲精品理论片色戒| 国产又黄又大久久| 日韩女优电影在线观看| 日韩av不卡一区二区| 欧美日韩亚洲丝袜制服| 亚洲成人av免费| 欧美日韩一区在线| 亚洲一区在线电影| 在线播放中文字幕一区| 奇米777欧美一区二区| 91精品国产欧美一区二区成人| 日本大胆欧美人术艺术动态| 欧美一级一区二区| 国内成人免费视频| 久久综合狠狠综合| 国产精品影视在线观看| 久久九九久精品国产免费直播| 国产成人av电影在线观看| 国产丝袜欧美中文另类| 成人av在线资源网站| 一区二区三区毛片| 欧美一区日韩一区| 另类专区欧美蜜桃臀第一页| 欧美精品一区二区三区很污很色的 | 一区二区三区精品在线观看| 91黄色在线观看| 麻豆中文一区二区| 国产婷婷精品av在线| 91亚洲精品久久久蜜桃网站| 亚洲成人高清在线| 精品国产乱码久久久久久老虎| 国产成人av电影在线观看| 亚洲精品免费在线| 日韩精品影音先锋| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 亚洲欧美日韩在线不卡| 欧美亚洲国产一区二区三区va| 日韩综合在线视频| 日本一区二区在线不卡| 色嗨嗨av一区二区三区| 蜜乳av一区二区三区| 久久精品视频免费| 色丁香久综合在线久综合在线观看| 三级欧美在线一区| 欧美激情一区二区三区不卡 | 亚洲国产你懂的| 久久看人人爽人人| 精品视频1区2区| 国产高清亚洲一区| 丝袜美腿亚洲综合| 国产精品乱人伦中文| 宅男噜噜噜66一区二区66| 成人手机在线视频| 日本午夜一区二区| 成人欧美一区二区三区白人| 国模无码大尺度一区二区三区| 在线综合视频播放| 成人av免费在线观看| 日韩av不卡在线观看| 亚洲精品视频一区二区| 久久久精品影视| 日韩欧美一二区| 欧美三级三级三级| 99精品视频免费在线观看| 九九九久久久精品| 亚洲成av人片在线观看| 中文字幕色av一区二区三区| 欧美精品一区二区久久久| 欧美日韩一区 二区 三区 久久精品| 99在线精品视频| 国产乱码字幕精品高清av| 天天操天天干天天综合网| 亚洲人成网站色在线观看| 国产日产欧美精品一区二区三区| 欧美岛国在线观看| 欧美高清视频在线高清观看mv色露露十八| 91一区二区在线| 成av人片一区二区| 成人污污视频在线观看| 国产一区二区伦理片| 黄页视频在线91| 久久99久久99| 国产一区二区在线观看免费| 美日韩一区二区| 三级精品在线观看| 日本不卡的三区四区五区| 午夜影院久久久| 偷拍自拍另类欧美| 亚洲va欧美va国产va天堂影院| 亚洲国产成人精品视频| 一区二区三区丝袜| 亚洲一区二区三区国产| 亚洲男人天堂一区| 亚洲黄色录像片| 亚洲午夜精品17c| 午夜av一区二区| 日韩成人精品视频| 日韩不卡在线观看日韩不卡视频| 美美哒免费高清在线观看视频一区二区 | 美女在线一区二区| 奇米精品一区二区三区在线观看| 另类中文字幕网| 国产成人在线免费观看| 不卡av免费在线观看| 在线亚洲精品福利网址导航| 欧美日韩免费观看一区二区三区| 日韩视频免费观看高清完整版在线观看| 制服丝袜中文字幕一区| 欧美va亚洲va香蕉在线| 国产日韩成人精品| 一区二区三区国产精华| 亚洲高清视频在线| 韩国v欧美v日本v亚洲v| 波多野结衣在线一区| 欧美日韩一区三区四区| 精品免费视频.| 亚洲人成人一区二区在线观看 | 亚洲欧洲美洲综合色网| 亚洲男女一区二区三区| 五月婷婷激情综合网| 精久久久久久久久久久| 99精品久久只有精品| 欧美一级日韩一级| 另类人妖一区二区av| 国产白丝精品91爽爽久久| 色综合中文字幕国产| 在线观看www91| 久久综合五月天婷婷伊人| 中文字幕一区二区三区视频| 日本成人中文字幕在线视频| 波多野结衣在线aⅴ中文字幕不卡| 欧美色图一区二区三区| 久久欧美一区二区| 亚洲国产sm捆绑调教视频 | 国产精品无人区| 亚洲成人免费视| caoporen国产精品视频| 91精品欧美综合在线观看最新| 国产精品美女久久久久高潮| 日韩国产精品久久久久久亚洲| 91无套直看片红桃| www国产成人| 青青草原综合久久大伊人精品| 91在线porny国产在线看| 欧美精品一区男女天堂| 天天综合天天做天天综合| 99riav久久精品riav| 久久久精品日韩欧美| 日本不卡1234视频| 欧美在线你懂得| 亚洲精品菠萝久久久久久久| 国产成人免费在线| 日韩美女一区二区三区四区| 亚洲综合一二三区| 成人黄页在线观看| 精品国产一区二区三区久久影院| 亚洲成va人在线观看| 在线观看视频一区二区欧美日韩| 中文字幕精品综合| 国产一区欧美二区| 日韩精品中文字幕在线一区| 日韩精品每日更新| 欧美日韩一区在线观看| 亚洲精品国产精品乱码不99 | 亚洲精品大片www| 成人天堂资源www在线| 国产农村妇女毛片精品久久麻豆 | 久久久久免费观看| 国产剧情一区在线|