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

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

?? expr.c

?? sqlite 嵌入式數據庫的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
      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 );         sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn,                        pExpr->token.z, pExpr->token.n);         sqlite3VdbeDequoteP3(v, -1);      } else {         assert( pExpr->iColumn == OE_Ignore );         sqlite3VdbeAddOp(v, OP_ContextPop, 0, 0);         sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump);         VdbeComment((v, "# raise(IGNORE)"));      }    }#endif    break;  }}#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;  Vdbe *v;  if( pList==0 ) return 0;  v = sqlite3GetVdbe(pParse);  n = pList->nExpr;  for(pItem=pList->a, i=0; i<n; 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;  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);      sqlite3VdbeChangeP2(v, addr, sqlite3VdbeCurrentAddr(v));      sqlite3VdbeAddOp(v, OP_Pop, 1, 0);      break;    }    default: {      sqlite3ExprCode(pParse, pExpr);      sqlite3VdbeAddOp(v, OP_If, jumpIfNull, dest);      break;    }  }}/*** 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;  if( v==0 || pExpr==0 ) return;  /* The value of pExpr->op and op are related as follows:  **  **       pExpr->op            op  **       ---------          ----------  **       TK_ISNULL          OP_NotNull  **       TK_NOTNULL         OP_IsNull  **       TK_NE              OP_Eq  **       TK_EQ              OP_Ne  **       TK_GT              OP_Le  **       TK_LE              OP_Gt  **       TK_GE              OP_Lt  **       TK_LT              OP_Ge  **  ** For other values of pExpr->op, op is undefined and unused.  ** The value of TK_ and OP_ constants are arranged such that we  ** can compute the mapping above using the following expression.  ** Assert()s verify that the computation is correct.  */  op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1);  /* Verify correct alignment of TK_ and OP_ constants  */  assert( pExpr->op!=TK_ISNULL || op==OP_NotNull );  assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull );  assert( pExpr->op!=TK_NE || op==OP_Eq );  assert( pExpr->op!=TK_EQ || op==OP_Ne );  assert( pExpr->op!=TK_LT || op==OP_Ge );  assert( pExpr->op!=TK_LE || op==OP_Gt );  assert( pExpr->op!=TK_GT || op==OP_Le );  assert( pExpr->op!=TK_GE || op==OP_Lt );  switch( pExpr->op ){    case TK_AND: {      sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);      sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);      break;    }    case TK_OR: {      int d2 = sqlite3VdbeMakeLabel(v);      sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);      sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);      sqlite3VdbeResolveLabel(v, d2);      break;    }    case TK_NOT: {      sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);      break;    }    case TK_LT:    case TK_LE:    case TK_GT:    case TK_GE:    case TK_NE:    case TK_EQ: {      sqlite3ExprCode(pParse, pExpr->pLeft);      sqlite3ExprCode(pParse, pExpr->pRight);      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, dest, jumpIfNull);      break;    }    case TK_ISNULL:    case TK_NOTNULL: {      sqlite3ExprCode(pParse, pExpr->pLeft);      sqlite3VdbeAddOp(v, op, 1, dest);      break;    }    case TK_BETWEEN: {      /* The expression is "x BETWEEN y AND z". It is implemented as:      **      ** 1 IF (x >= y) GOTO 3      ** 2 GOTO <dest>      ** 3 IF (x > z) GOTO <dest>      */      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 = sqlite3VdbeCurrentAddr(v);      codeCompare(pParse, pLeft, pRight, OP_Ge, addr+3, !jumpIfNull);      sqlite3VdbeAddOp(v, OP_Pop, 1, 0);      sqlite3VdbeAddOp(v, OP_Goto, 0, dest);      pRight = pExpr->pList->a[1].pExpr;      sqlite3ExprCode(pParse, pRight);      codeCompare(pParse, pLeft, pRight, OP_Gt, dest, jumpIfNull);      break;    }    default: {      sqlite3ExprCode(pParse, pExpr);      sqlite3VdbeAddOp(v, OP_IfNot, jumpIfNull, dest);      break;    }  }}/*** Do a deep comparison of two expression trees.  Return TRUE (non-zero)** if they are identical and return FALSE if they differ in any way.*/int sqlite3ExprCompare(Expr *pA, Expr *pB){  int i;  if( pA==0 ){    return pB==0;  }else if( pB==0 ){    return 0;  }  if( pA->op!=pB->op ) return 0;  if( !sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 0;  if( !sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 0;  if( pA->pList ){    if( pB->pList==0 ) return 0;    if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;    for(i=0; i<pA->pList->nExpr; i++){      if( !sqlite3ExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){        return 0;      }    }  }else if( pB->pList ){    return 0;  }  if( pA->pSelect || pB->pSelect ) return 0;  if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;  if( pA->token.z ){    if( pB->token.z==0 ) return 0;    if( pB->token.n!=pA->token.n ) return 0;    if( sqlite3StrNICmp(pA->token.z, pB->token.z, pB->token.n)!=0 ) return 0;  }  return 1;}/*** Add a new element to the pParse->aAgg[] array and return its index.** The new element is initialized to zero.  The calling function is** expected to fill it in.*/static int appendAggInfo(Parse *pParse){  if( (pParse->nAgg & 0x7)==0 ){    int amt = pParse->nAgg + 8;    AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));    if( aAgg==0 ){      return -1;    }    pParse->aAgg = aAgg;  }  memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));  return pParse->nAgg++;}/*** This is an xFunc for walkExprTree() used to implement ** sqlite3ExprAnalyzeAggregates().  See sqlite3ExprAnalyzeAggregates** for additional information.**** This routine analyzes the aggregate function at pExpr.*/static int analyzeAggregate(void *pArg, Expr *pExpr){  int i;  AggExpr *aAgg;  NameContext *pNC = (NameContext *)pArg;  Parse *pParse = pNC->pParse;  SrcList *pSrcList = pNC->pSrcList;  switch( pExpr->op ){    case TK_COLUMN: {      for(i=0; pSrcList && i<pSrcList->nSrc; i++){        if( pExpr->iTable==pSrcList->a[i].iCursor ){          aAgg = pParse->aAgg;          for(i=0; i<pParse->nAgg; i++){            if( aAgg[i].isAgg ) continue;            if( aAgg[i].pExpr->iTable==pExpr->iTable             && aAgg[i].pExpr->iColumn==pExpr->iColumn ){              break;            }          }          if( i>=pParse->nAgg ){            i = appendAggInfo(pParse);            if( i<0 ) return 1;            pParse->aAgg[i].isAgg = 0;            pParse->aAgg[i].pExpr = pExpr;          }          pExpr->iAgg = i;          pExpr->iAggCtx = pNC->nDepth;          return 1;        }      }      return 1;    }    case TK_AGG_FUNCTION: {      if( pNC->nDepth==0 ){        aAgg = pParse->aAgg;        for(i=0; i<pParse->nAgg; i++){          if( !aAgg[i].isAgg ) continue;          if( sqlite3ExprCompare(aAgg[i].pExpr, pExpr) ){            break;          }        }        if( i>=pParse->nAgg ){          u8 enc = pParse->db->enc;          i = appendAggInfo(pParse);          if( i<0 ) return 1;          pParse->aAgg[i].isAgg = 1;          pParse->aAgg[i].pExpr = pExpr;          pParse->aAgg[i].pFunc = sqlite3FindFunction(pParse->db,               pExpr->token.z, pExpr->token.n,               pExpr->pList ? pExpr->pList->nExpr : 0, enc, 0);        }        pExpr->iAgg = i;        return 1;      }    }  }  if( pExpr->pSelect ){    pNC->nDepth++;    walkSelectExpr(pExpr->pSelect, analyzeAggregate, pNC);    pNC->nDepth--;  }  return 0;}/*** Analyze the given expression looking for aggregate functions and** for variables that need to be added to the pParse->aAgg[] array.** Make additional entries to the pParse->aAgg[] array as necessary.**** This routine should only be called after the expression has been** analyzed by sqlite3ExprResolveNames().**

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精品超碰| 免费人成黄页网站在线一区二区| 国产伦精品一区二区三区免费| 韩国女主播一区| 色94色欧美sute亚洲线路一久| 精品乱码亚洲一区二区不卡| 亚洲柠檬福利资源导航| 精品一区二区三区视频在线观看| 一本一本大道香蕉久在线精品| 久久蜜桃一区二区| 视频一区二区不卡| 色悠悠亚洲一区二区| 久久久久97国产精华液好用吗| 调教+趴+乳夹+国产+精品| 99国产欧美另类久久久精品| 久久精品欧美日韩| 极品瑜伽女神91| 91麻豆精品91久久久久同性| 亚洲午夜视频在线| 99综合影院在线| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩激情一区二区| 欧美日精品一区视频| 一区二区三区**美女毛片| 97精品久久久午夜一区二区三区| 亚洲国产精品国自产拍av| 国产一区二区三区在线观看免费| 日韩精品资源二区在线| 美女尤物国产一区| 日韩亚洲欧美综合| 久久国产婷婷国产香蕉| 欧美xxxxx牲另类人与| 奇米777欧美一区二区| 91超碰这里只有精品国产| 亚洲成a人v欧美综合天堂下载 | 国产视频视频一区| 精品一区二区三区视频在线观看 | 91麻豆国产福利精品| 国产精品国产三级国产普通话三级| 国产精品系列在线观看| 国产欧美精品日韩区二区麻豆天美| 国产黄人亚洲片| 国产精品美女久久久久高潮| 北条麻妃国产九九精品视频| 18欧美乱大交hd1984| 色系网站成人免费| 亚洲国产欧美另类丝袜| 欧美精品1区2区| 精品一区二区三区不卡| 国产亚洲欧美色| av亚洲精华国产精华| 亚洲一区二区三区四区的| 6080亚洲精品一区二区| 国产精品影视在线| 亚洲女与黑人做爰| 欧美妇女性影城| 精品一区二区三区日韩| 国产精品国产三级国产| 欧美日韩在线播放一区| 六月丁香综合在线视频| 国产精品美女www爽爽爽| 色88888久久久久久影院按摩| 日韩精品乱码免费| 日本一区二区在线不卡| 91福利资源站| 国产在线日韩欧美| 洋洋成人永久网站入口| 亚洲精品一区二区三区在线观看| 99精品视频中文字幕| 日本网站在线观看一区二区三区| 国产欧美久久久精品影院| 91国偷自产一区二区三区观看 | 国产精品久久久久国产精品日日 | 亚洲一区二区三区精品在线| 2020国产精品| 欧美午夜电影一区| 国产精品自在欧美一区| 午夜精品久久久久久久久久| 国产区在线观看成人精品 | 久久综合中文字幕| 在线亚洲一区二区| 国产盗摄视频一区二区三区| 亚洲香蕉伊在人在线观| 欧美国产乱子伦| 日韩视频免费观看高清在线视频| 99热99精品| 精品系列免费在线观看| 一区二区三区免费在线观看| 国产日韩一级二级三级| 91精品国产入口| 91黄视频在线| 99久久精品情趣| 国产激情精品久久久第一区二区| 三级久久三级久久| 亚洲欧美日韩国产综合| 国产亚洲精品资源在线26u| 欧美一区二区三区免费观看视频 | 日韩写真欧美这视频| 日本精品一级二级| 不卡视频在线观看| 国产福利一区二区| 国产一区在线视频| 开心九九激情九九欧美日韩精美视频电影| 一区二区三区欧美激情| 亚洲激情在线播放| 亚洲天天做日日做天天谢日日欢| 国产调教视频一区| 久久精品夜色噜噜亚洲aⅴ| 精品嫩草影院久久| 日韩免费看的电影| 欧美va亚洲va| 精品久久久久99| 久久欧美中文字幕| 久久亚洲一级片| 国产日韩欧美精品综合| 久久久精品tv| 国产日韩精品一区二区三区| 久久精品一级爱片| 中文欧美字幕免费| 中文字幕一区视频| 亚洲日本在线看| 一区二区高清视频在线观看| 亚洲一区二区三区三| 午夜av电影一区| 奇米一区二区三区| 狠狠色综合色综合网络| 处破女av一区二区| 91视频.com| 欧美日韩免费一区二区三区| 91精品久久久久久久99蜜桃 | 午夜视频一区在线观看| 日韩在线观看一区二区| 美女一区二区三区在线观看| 久久99久久精品| 成人午夜激情影院| 色狠狠色噜噜噜综合网| 911精品国产一区二区在线| 日韩一区二区三区电影在线观看 | 国产麻豆成人精品| 成年人国产精品| 欧美亚洲图片小说| 日韩欧美色综合| 国产精品久久影院| 亚洲国产成人tv| 国产在线视频一区二区| 99精品久久99久久久久| 在线91免费看| 国产精品卡一卡二| 日韩黄色免费电影| 成人黄动漫网站免费app| 在线观看91精品国产入口| 国产精品久久久久久久久图文区| 亚洲综合色丁香婷婷六月图片| 视频在线观看91| 成人网男人的天堂| 欧美日韩免费观看一区二区三区 | 亚洲欧美电影一区二区| 免费成人在线播放| 91在线观看成人| 欧美军同video69gay| 国产免费观看久久| 五月天国产精品| av亚洲精华国产精华精华| 欧美一区永久视频免费观看| 国产精品久久久久久久浪潮网站 | 亚洲国产日产av| 国产成a人亚洲| 91精品国产乱| 亚洲一区二区在线播放相泽 | 极品少妇一区二区| 欧美日韩一区二区在线观看视频 | 亚洲狼人国产精品| 国产一本一道久久香蕉| 欧美性videosxxxxx| 欧美国产一区在线| 久久国产成人午夜av影院| 欧美吻胸吃奶大尺度电影| 国产欧美精品一区二区色综合| 日本91福利区| 欧美三级韩国三级日本三斤 | 蜜臀久久99精品久久久画质超高清| 波多野结衣欧美| 久久久一区二区| 精品一区二区国语对白| 91精品国产高清一区二区三区蜜臀| 亚洲久草在线视频| 91亚洲国产成人精品一区二区三| 久久久久国产免费免费| 理论电影国产精品| 91精品国产综合久久婷婷香蕉| 亚洲已满18点击进入久久| 色综合久久综合| 亚洲人亚洲人成电影网站色| 丁香另类激情小说| 国产亚洲女人久久久久毛片| 久久成人麻豆午夜电影| 日韩美一区二区三区| 久久国产麻豆精品| www久久精品| 国产精品一区在线观看你懂的|