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

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

?? expr.c

?? 一個小型嵌入式數據庫SQLite的源碼,C語言
?? C
?? 第 1 頁 / 共 5 頁
字號:
      assert( TK_RSHIFT==OP_ShiftRight );      assert( TK_CONCAT==OP_Concat );      sqlite3ExprCode(pParse, pExpr->pLeft);      sqlite3ExprCode(pParse, pExpr->pRight);      sqlite3VdbeAddOp(v, op, 0, 0);      stackChng = -1;      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 = sqlite3MPrintf("-%.*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);      stackChng = 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);      stackChng = 0;      break;    }    case TK_AGG_FUNCTION: {      AggInfo *pInfo = pExpr->pAggInfo;      if( pInfo==0 ){        sqlite3ErrorMsg(pParse, "misuse of aggregate: %T",            &pExpr->span);      }else{        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 = ENC(pParse->db);      CollSeq *pColl = 0;      zId = (char*)pExpr->token.z;      nId = pExpr->token.n;      pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, enc, 0);      assert( pDef!=0 );      nExpr = sqlite3ExprCodeExprList(pParse, pList);#ifndef SQLITE_OMIT_VIRTUALTABLE      /* Possibly overload the function if the first argument is      ** a virtual table column.      **      ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the      ** second argument, not the first, as the argument to test to      ** see if it is a column in a virtual table.  This is done because      ** the left operand of infix functions (the operand we want to      ** control overloading) ends up as the second argument to the      ** function.  The expression "A glob B" is equivalent to       ** "glob(B,A).  We want to use the A in "A glob B" to test      ** for function overloading.  But we use the B term in "glob(B,A)".      */      if( nExpr>=2 && (pExpr->flags & EP_InfixFunc) ){        pDef = sqlite3VtabOverloadFunction(pDef, nExpr, pList->a[1].pExpr);      }else if( nExpr>0 ){        pDef = sqlite3VtabOverloadFunction(pDef, nExpr, pList->a[0].pExpr);      }#endif      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);      }      sqlite3VdbeOp3(v, OP_Function, constMask, nExpr, (char*)pDef, P3_FUNCDEF);      stackChng = 1-nExpr;      break;    }#ifndef SQLITE_OMIT_SUBQUERY    case TK_EXISTS:    case TK_SELECT: {      if( pExpr->iColumn==0 ){        sqlite3CodeSubselect(pParse, pExpr);      }      sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);      VdbeComment((v, "# load subquery result"));      break;    }    case TK_IN: {      int addr;      char affinity;      int ckOffset = pParse->ckOffset;      sqlite3CodeSubselect(pParse, pExpr);      /* Figure out the affinity to use to create a key from the results      ** of the expression. affinityStr stores a static string suitable for      ** P3 of OP_MakeRecord.      */      affinity = comparisonAffinity(pExpr);      sqlite3VdbeAddOp(v, OP_Integer, 1, 0);      pParse->ckOffset = ckOffset+1;      /* Code the <expr> from "<expr> IN (...)". The temporary table      ** pExpr->iTable contains the values that make up the (...) set.      */      sqlite3ExprCode(pParse, pExpr->pLeft);      addr = sqlite3VdbeCurrentAddr(v);      sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+4);            /* addr + 0 */      sqlite3VdbeAddOp(v, OP_Pop, 2, 0);      sqlite3VdbeAddOp(v, OP_Null, 0, 0);      sqlite3VdbeAddOp(v, OP_Goto, 0, addr+7);      sqlite3VdbeOp3(v, OP_MakeRecord, 1, 0, &affinity, 1);   /* addr + 4 */      sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, addr+7);      sqlite3VdbeAddOp(v, OP_AddImm, -1, 0);                  /* addr + 6 */      break;    }#endif    case TK_BETWEEN: {      Expr *pLeft = pExpr->pLeft;      struct ExprList_item *pLItem = pExpr->pList->a;      Expr *pRight = pLItem->pExpr;      sqlite3ExprCode(pParse, pLeft);      sqlite3VdbeAddOp(v, OP_Dup, 0, 0);      sqlite3ExprCode(pParse, pRight);      codeCompare(pParse, pLeft, pRight, OP_Ge, 0, 0);      sqlite3VdbeAddOp(v, OP_Pull, 1, 0);      pLItem++;      pRight = pLItem->pExpr;      sqlite3ExprCode(pParse, pRight);      codeCompare(pParse, pLeft, pRight, OP_Le, 0, 0);      sqlite3VdbeAddOp(v, OP_And, 0, 0);      break;    }    case TK_UPLUS:    case TK_AS: {      sqlite3ExprCode(pParse, pExpr->pLeft);      stackChng = 0;      break;    }    case TK_CASE: {      int expr_end_label;      int jumpInst;      int nExpr;      int i;      ExprList *pEList;      struct ExprList_item *aListelem;      assert(pExpr->pList);      assert((pExpr->pList->nExpr % 2) == 0);      assert(pExpr->pList->nExpr > 0);      pEList = pExpr->pList;      aListelem = pEList->a;      nExpr = pEList->nExpr;      expr_end_label = sqlite3VdbeMakeLabel(v);      if( pExpr->pLeft ){        sqlite3ExprCode(pParse, pExpr->pLeft);      }      for(i=0; i<nExpr; i=i+2){        sqlite3ExprCode(pParse, aListelem[i].pExpr);        if( pExpr->pLeft ){          sqlite3VdbeAddOp(v, OP_Dup, 1, 1);          jumpInst = codeCompare(pParse, pExpr->pLeft, aListelem[i].pExpr,                                 OP_Ne, 0, 1);          sqlite3VdbeAddOp(v, OP_Pop, 1, 0);        }else{          jumpInst = sqlite3VdbeAddOp(v, OP_IfNot, 1, 0);        }        sqlite3ExprCode(pParse, aListelem[i+1].pExpr);        sqlite3VdbeAddOp(v, OP_Goto, 0, expr_end_label);        sqlite3VdbeJumpHere(v, jumpInst);      }      if( pExpr->pLeft ){        sqlite3VdbeAddOp(v, OP_Pop, 1, 0);      }      if( pExpr->pRight ){        sqlite3ExprCode(pParse, pExpr->pRight);      }else{        sqlite3VdbeAddOp(v, OP_Null, 0, 0);      }      sqlite3VdbeResolveLabel(v, expr_end_label);      break;    }#ifndef SQLITE_OMIT_TRIGGER    case TK_RAISE: {      if( !pParse->trigStack ){        sqlite3ErrorMsg(pParse,                       "RAISE() may only be used within a trigger-program");	return;      }      if( pExpr->iColumn!=OE_Ignore ){         assert( pExpr->iColumn==OE_Rollback ||                 pExpr->iColumn == OE_Abort ||                 pExpr->iColumn == OE_Fail );         sqlite3DequoteExpr(pExpr);         sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn,                        (char*)pExpr->token.z, pExpr->token.n);      } else {         assert( pExpr->iColumn == OE_Ignore );         sqlite3VdbeAddOp(v, OP_ContextPop, 0, 0);         sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump);         VdbeComment((v, "# raise(IGNORE)"));      }      stackChng = 0;      break;    }#endif  }  if( pParse->ckOffset ){    pParse->ckOffset += stackChng;    assert( pParse->ckOffset );  }}#ifndef SQLITE_OMIT_TRIGGER/*** Generate code that evalutes the given expression and leaves the result** on the stack.  See also sqlite3ExprCode().**** This routine might also cache the result and modify the pExpr tree** so that it will make use of the cached result on subsequent evaluations** rather than evaluate the whole expression again.  Trivial expressions are** not cached.  If the expression is cached, its result is stored in a ** memory location.*/void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr){  Vdbe *v = pParse->pVdbe;  int iMem;  int addr1, addr2;  if( v==0 ) return;  addr1 = sqlite3VdbeCurrentAddr(v);  sqlite3ExprCode(pParse, pExpr);  addr2 = sqlite3VdbeCurrentAddr(v);  if( addr2>addr1+1 || sqlite3VdbeGetOp(v, addr1)->opcode==OP_Function ){    iMem = pExpr->iTable = pParse->nMem++;    sqlite3VdbeAddOp(v, OP_MemStore, iMem, 0);    pExpr->op = TK_REGISTER;  }}#endif/*** Generate code that pushes the value of every element of the given** expression list onto the stack.**** Return the number of elements pushed onto the stack.*/int sqlite3ExprCodeExprList(  Parse *pParse,     /* Parsing context */  ExprList *pList    /* The expression list to be coded */){  struct ExprList_item *pItem;  int i, n;  if( pList==0 ) return 0;  n = pList->nExpr;  for(pItem=pList->a, i=n; i>0; i--, pItem++){    sqlite3ExprCode(pParse, pItem->pExpr);  }  return n;}/*** Generate code for a boolean expression such that a jump is made** to the label "dest" if the expression is true but execution** continues straight thru if the expression is false.**** If the expression evaluates to NULL (neither true nor false), then** take the jump if the jumpIfNull flag is true.**** 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 sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){  Vdbe *v = pParse->pVdbe;  int op = 0;  int ckOffset = pParse->ckOffset;  if( v==0 || pExpr==0 ) return;  op = pExpr->op;  switch( op ){    case TK_AND: {      int d2 = sqlite3VdbeMakeLabel(v);      sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);      sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);      sqlite3VdbeResolveLabel(v, d2);      break;    }    case TK_OR: {      sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);      sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);      break;    }    case TK_NOT: {      sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);      break;    }    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, dest, jumpIfNull);      break;    }    case TK_ISNULL:    case TK_NOTNULL: {      assert( TK_ISNULL==OP_IsNull );      assert( TK_NOTNULL==OP_NotNull );      sqlite3ExprCode(pParse, pExpr->pLeft);      sqlite3VdbeAddOp(v, op, 1, dest);      break;    }    case TK_BETWEEN: {      /* The expression "x BETWEEN y AND z" is implemented as:      **      ** 1 IF (x < y) GOTO 3      ** 2 IF (x <= z) GOTO <dest>      ** 3 ...      */      int addr;      Expr *pLeft = pExpr->pLeft;      Expr *pRight = pExpr->pList->a[0].pExpr;      sqlite3ExprCode(pParse, pLeft);      sqlite3VdbeAddOp(v, OP_Dup, 0, 0);      sqlite3ExprCode(pParse, pRight);      addr = codeCompare(pParse, pLeft, pRight, OP_Lt, 0, !jumpIfNull);      pRight = pExpr->pList->a[1].pExpr;      sqlite3ExprCode(pParse, pRight);      codeCompare(pParse, pLeft, pRight, OP_Le, dest, jumpIfNull);      sqlite3VdbeAddOp(v, OP_Integer, 0, 0);      sqlite3VdbeJumpHere(v, addr);      sqlite3VdbeAddOp(v, OP_Pop, 1, 0);      break;    }    default: {      sqlite3ExprCode(pParse, pExpr);      sqlite3VdbeAddOp(v, OP_If, jumpIfNull, dest);      break;    }  }  pParse->ckOffset = ckOffset;}/*** Generate code for a boolean expression such that a jump is made** to the label "dest" if the expression is false but execution** continues straight thru if the expression is true.**** If the expression evaluates to NULL (neither true nor false) then** jump if jumpIfNull is true or fall through if jumpIfNull is false.*/void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){  Vdbe *v = pParse->pVdbe;  int op = 0;  int ckOffset = pParse->ckOffset;  if( v==0 || pExpr==0 ) return;  /* The value of pExpr->op and op are related as follows:  **  **       pExpr->op            op  **       ---------          ----------  *

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美va亚洲va香蕉在线| 亚洲激情中文1区| 亚洲婷婷综合色高清在线| 午夜激情综合网| 成人性生交大片免费看中文| 日本高清免费不卡视频| 久久久久久久久久久久久夜| 亚洲国产中文字幕| 成人美女视频在线看| 在线综合视频播放| 亚洲免费观看视频| 国产精品99久久久久| 91精品国产免费| 亚洲免费观看高清在线观看| 成人精品视频一区二区三区| 日韩欧美激情四射| 亚洲国产精品久久人人爱蜜臀 | 午夜精品爽啪视频| 99在线视频精品| 国产清纯美女被跳蛋高潮一区二区久久w | 久久精品人人爽人人爽| 午夜国产精品一区| 欧洲生活片亚洲生活在线观看| 国产亚洲短视频| 黄色日韩三级电影| 欧美tickle裸体挠脚心vk| 水蜜桃久久夜色精品一区的特点| 91在线国产福利| 国产精品久久久久国产精品日日| 国产在线国偷精品免费看| 91精品国产综合久久久久久 | 五月婷婷欧美视频| 欧美性生活久久| 亚洲一区在线观看网站| 色天使久久综合网天天| 亚洲男同1069视频| 91蜜桃婷婷狠狠久久综合9色| 国产精品久久久久久久浪潮网站| 国产精品自产自拍| 国产欧美日韩三区| 成+人+亚洲+综合天堂| 综合色中文字幕| 在线观看视频91| 亚洲国产精品视频| 日韩欧美电影一区| 国产精品白丝jk黑袜喷水| 亚洲国产成人在线| 91久久精品一区二区三| 亚洲成av人影院| 日韩一级片网址| 精品一区二区三区欧美| 中文字幕国产一区二区| 99久久精品国产导航| 一级女性全黄久久生活片免费| 色偷偷成人一区二区三区91| 亚洲国产一区二区视频| 99久久精品国产毛片| 亚洲人吸女人奶水| 91国在线观看| 91蝌蚪porny九色| 1000精品久久久久久久久| 99在线精品视频| 国产精品成人午夜| 91蜜桃网址入口| 中文字幕免费不卡| 91福利在线播放| 亚洲高清一区二区三区| 欧美一区二区三级| 精品一区二区三区视频在线观看 | 亚洲国产aⅴ天堂久久| 欧美日韩成人综合天天影院 | 欧美一区二区黄色| 九九九精品视频| 国产亚洲va综合人人澡精品| 成人免费av在线| 亚洲免费三区一区二区| 91免费在线看| 久久99蜜桃精品| 亚洲欧洲日韩在线| 精品1区2区3区| 精品一区二区在线播放| 国产精品久久久久久亚洲毛片 | 精品国产99国产精品| 国产乱人伦精品一区二区在线观看| 蜜乳av一区二区三区| 国产日韩综合av| 欧美性色综合网| 成人性生交大片免费看中文| 首页综合国产亚洲丝袜| 国产日韩在线不卡| 欧美日本在线看| 懂色av一区二区三区蜜臀| 一区二区三区在线视频播放| 日韩一二在线观看| 色综合色狠狠综合色| 精品亚洲成a人| 中文字幕一区视频| 欧美国产激情二区三区| 4438成人网| 91美女视频网站| 久久99精品国产麻豆婷婷| 亚洲欧美日本韩国| 国产午夜三级一区二区三| 欧美精品丝袜中出| 一本一道久久a久久精品| 麻豆国产精品视频| 日本特黄久久久高潮 | 成人亚洲一区二区一| 日本不卡在线视频| 亚洲国产中文字幕在线视频综合| 久久久另类综合| 日韩一级视频免费观看在线| 欧美性高清videossexo| 99视频有精品| 久久99久久精品欧美| 日日噜噜夜夜狠狠视频欧美人| 国产精品情趣视频| 久久久不卡网国产精品二区| 欧美一区二区三区四区久久| 欧美色中文字幕| 91美女蜜桃在线| 蜜臀av一区二区在线观看| 亚洲成人免费视| 亚洲一区二区中文在线| 亚洲一区二区免费视频| 亚洲欧美激情在线| 自拍偷拍亚洲激情| 亚洲日本护士毛茸茸| 亚洲成人精品一区二区| 伊人婷婷欧美激情| 亚洲欧美日韩中文字幕一区二区三区 | av在线播放不卡| 国产91高潮流白浆在线麻豆| 韩日精品视频一区| 精品一区二区三区免费播放| 久久精品久久99精品久久| 日韩综合小视频| 久久国产麻豆精品| 国产综合色产在线精品| 麻豆精品国产传媒mv男同| 国产一区二区精品在线观看| 国产一区不卡在线| 成人在线一区二区三区| 日韩欧美国产电影| 久久女同精品一区二区| 国产日韩欧美一区二区三区乱码| 国产女人aaa级久久久级| 国产色婷婷亚洲99精品小说| 国产精品传媒在线| 亚洲一区二区三区激情| 日韩电影一二三区| 国产尤物一区二区| 成人国产视频在线观看| 色999日韩国产欧美一区二区| 色欲综合视频天天天| 欧美肥大bbwbbw高潮| 欧美sm极限捆绑bd| 国产精品不卡视频| 五月天欧美精品| 国产一区二区精品久久91| 99re视频精品| 在线观看91av| 国产日产欧美一区二区视频| 亚洲人成小说网站色在线 | 色88888久久久久久影院按摩| 欧美视频在线一区| www一区二区| 最近日韩中文字幕| 日韩精品视频网| 国产成人精品亚洲777人妖| 波多野结衣中文字幕一区二区三区 | 久久九九久精品国产免费直播| 亚洲欧美日韩综合aⅴ视频| 日韩精品国产精品| 国产91露脸合集magnet| 制服丝袜亚洲色图| 国产欧美综合在线观看第十页| 亚洲最大成人网4388xx| 蜜乳av一区二区| 欧美日韩一区不卡| 日本一区二区三区四区在线视频| 一区二区三区精密机械公司| 精品在线播放午夜| 99国产精品久久久久久久久久久| 欧美精品vⅰdeose4hd| 国产精品青草综合久久久久99| 亚洲精品乱码久久久久| 不卡的av网站| 久久综合av免费| 水野朝阳av一区二区三区| 不卡视频在线看| 久久免费看少妇高潮| 亚洲乱码一区二区三区在线观看| 国产成人av电影在线观看| 9191成人精品久久| 亚洲天堂精品在线观看| 岛国av在线一区| 久久综合成人精品亚洲另类欧美| 亚洲福中文字幕伊人影院| 成人综合婷婷国产精品久久蜜臀 |