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

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

?? expr.c

?? sqlite 3.3.8 支持加密的版本
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*
** 2001 September 15
**
** The author disclaims copyright to this source code.  In place of
** a legal notice, here is a blessing:
**
**    May you do good and not evil.
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
**
*************************************************************************
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
**
** $Id: expr.c,v 1.31 2006/10/12 21:34:21 rmsimpson Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>

/*
** Return the 'affinity' of the expression pExpr if any.
**
** If pExpr is a column, a reference to a column via an 'AS' alias,
** or a sub-select with a column as the return value, then the 
** affinity of that column is returned. Otherwise, 0x00 is returned,
** indicating no affinity for the expression.
**
** i.e. the WHERE clause expresssions in the following statements all
** have an affinity:
**
** CREATE TABLE t1(a);
** SELECT * FROM t1 WHERE a;
** SELECT a AS b FROM t1 WHERE b;
** SELECT * FROM t1 WHERE (select a from t1);
*/
char sqlite3ExprAffinity(Expr *pExpr){
  int op = pExpr->op;
  if( op==TK_AS ){
    return sqlite3ExprAffinity(pExpr->pLeft);
  }
  if( op==TK_SELECT ){
    return sqlite3ExprAffinity(pExpr->pSelect->pEList->a[0].pExpr);
  }
#ifndef SQLITE_OMIT_CAST
  if( op==TK_CAST ){
    return sqlite3AffinityType(&pExpr->token);
  }
#endif
  return pExpr->affinity;
}

/*
** Return the default collation sequence for the expression pExpr. If
** there is no default collation type, return 0.
*/
CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){
  CollSeq *pColl = 0;
  if( pExpr ){
    pColl = pExpr->pColl;
    if( (pExpr->op==TK_AS || pExpr->op==TK_CAST) && !pColl ){
      return sqlite3ExprCollSeq(pParse, pExpr->pLeft);
    }
  }
  if( sqlite3CheckCollSeq(pParse, pColl) ){ 
    pColl = 0;
  }
  return pColl;
}

/*
** pExpr is an operand of a comparison operator.  aff2 is the
** type affinity of the other operand.  This routine returns the
** type affinity that should be used for the comparison operator.
*/
char sqlite3CompareAffinity(Expr *pExpr, char aff2){
  char aff1 = sqlite3ExprAffinity(pExpr);
  if( aff1 && aff2 ){
    /* Both sides of the comparison are columns. If one has numeric
    ** affinity, use that. Otherwise use no affinity.
    */
    if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){
      return SQLITE_AFF_NUMERIC;
    }else{
      return SQLITE_AFF_NONE;
    }
  }else if( !aff1 && !aff2 ){
    /* Neither side of the comparison is a column.  Compare the
    ** results directly.
    */
    return SQLITE_AFF_NONE;
  }else{
    /* One side is a column, the other is not. Use the columns affinity. */
    assert( aff1==0 || aff2==0 );
    return (aff1 + aff2);
  }
}

/*
** pExpr is a comparison operator.  Return the type affinity that should
** be applied to both operands prior to doing the comparison.
*/
static char comparisonAffinity(Expr *pExpr){
  char aff;
  assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT ||
          pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE ||
          pExpr->op==TK_NE );
  assert( pExpr->pLeft );
  aff = sqlite3ExprAffinity(pExpr->pLeft);
  if( pExpr->pRight ){
    aff = sqlite3CompareAffinity(pExpr->pRight, aff);
  }
  else if( pExpr->pSelect ){
    aff = sqlite3CompareAffinity(pExpr->pSelect->pEList->a[0].pExpr, aff);
  }
  else if( !aff ){
    aff = SQLITE_AFF_NUMERIC;
  }
  return aff;
}

/*
** pExpr is a comparison expression, eg. '=', '<', IN(...) etc.
** idx_affinity is the affinity of an indexed column. Return true
** if the index with affinity idx_affinity may be used to implement
** the comparison in pExpr.
*/
int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){
  char aff = comparisonAffinity(pExpr);
  switch( aff ){
    case SQLITE_AFF_NONE:
      return 1;
    case SQLITE_AFF_TEXT:
      return idx_affinity==SQLITE_AFF_TEXT;
    default:
      return sqlite3IsNumericAffinity(idx_affinity);
  }
}

/*
** Return the P1 value that should be used for a binary comparison
** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2.
** If jumpIfNull is true, then set the low byte of the returned
** P1 value to tell the opcode to jump if either expression
** evaluates to NULL.
*/
static int binaryCompareP1(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){
  char aff = sqlite3ExprAffinity(pExpr2);
  return ((int)sqlite3CompareAffinity(pExpr1, aff))+(jumpIfNull?0x100:0);
}

/*
** Return a pointer to the collation sequence that should be used by
** a binary comparison operator comparing pLeft and pRight.
**
** If the left hand expression has a collating sequence type, then it is
** used. Otherwise the collation sequence for the right hand expression
** is used, or the default (BINARY) if neither expression has a collating
** type.
*/
static CollSeq* binaryCompareCollSeq(Parse *pParse, Expr *pLeft, Expr *pRight){
  CollSeq *pColl = sqlite3ExprCollSeq(pParse, pLeft);
  if( !pColl ){
    pColl = sqlite3ExprCollSeq(pParse, pRight);
  }
  return pColl;
}

/*
** Generate code for a comparison operator.
*/
static int codeCompare(
  Parse *pParse,    /* The parsing (and code generating) context */
  Expr *pLeft,      /* The left operand */
  Expr *pRight,     /* The right operand */
  int opcode,       /* The comparison opcode */
  int dest,         /* Jump here if true.  */
  int jumpIfNull    /* If true, jump if either operand is NULL */
){
  int p1 = binaryCompareP1(pLeft, pRight, jumpIfNull);
  CollSeq *p3 = binaryCompareCollSeq(pParse, pLeft, pRight);
  return sqlite3VdbeOp3(pParse->pVdbe, opcode, p1, dest, (void*)p3, P3_COLLSEQ);
}

/*
** Construct a new expression node and return a pointer to it.  Memory
** for this node is obtained from sqliteMalloc().  The calling function
** is responsible for making sure the node eventually gets freed.
*/
Expr *sqlite3Expr(int op, Expr *pLeft, Expr *pRight, const Token *pToken){
  Expr *pNew;
  pNew = sqliteMalloc( sizeof(Expr) );
  if( pNew==0 ){
    /* When malloc fails, delete pLeft and pRight. Expressions passed to 
    ** this function must always be allocated with sqlite3Expr() for this 
    ** reason. 
    */
    sqlite3ExprDelete(pLeft);
    sqlite3ExprDelete(pRight);
    return 0;
  }
  pNew->op = op;
  pNew->pLeft = pLeft;
  pNew->pRight = pRight;
  pNew->iAgg = -1;
  if( pToken ){
    assert( pToken->dyn==0 );
    pNew->span = pNew->token = *pToken;
  }else if( pLeft && pRight ){
    sqlite3ExprSpan(pNew, &pLeft->span, &pRight->span);
  }
  return pNew;
}

/*
** Works like sqlite3Expr() but frees its pLeft and pRight arguments
** if it fails due to a malloc problem.
*/
Expr *sqlite3ExprOrFree(int op, Expr *pLeft, Expr *pRight, const Token *pToken){
  Expr *pNew = sqlite3Expr(op, pLeft, pRight, pToken);
  if( pNew==0 ){
    sqlite3ExprDelete(pLeft);
    sqlite3ExprDelete(pRight);
  }
  return pNew;
}

/*
** When doing a nested parse, you can include terms in an expression
** that look like this:   #0 #1 #2 ...  These terms refer to elements
** on the stack.  "#0" means the top of the stack.
** "#1" means the next down on the stack.  And so forth.
**
** This routine is called by the parser to deal with on of those terms.
** It immediately generates code to store the value in a memory location.
** The returns an expression that will code to extract the value from
** that memory location as needed.
*/
Expr *sqlite3RegisterExpr(Parse *pParse, Token *pToken){
  Vdbe *v = pParse->pVdbe;
  Expr *p;
  int depth;
  if( pParse->nested==0 ){
    sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", pToken);
    return 0;
  }
  if( v==0 ) return 0;
  p = sqlite3Expr(TK_REGISTER, 0, 0, pToken);
  if( p==0 ){
    return 0;  /* Malloc failed */
  }
  depth = atoi((char*)&pToken->z[1]);
  p->iTable = pParse->nMem++;
  sqlite3VdbeAddOp(v, OP_Dup, depth, 0);
  sqlite3VdbeAddOp(v, OP_MemStore, p->iTable, 1);
  return p;
}

/*
** Join two expressions using an AND operator.  If either expression is
** NULL, then just return the other expression.
*/
Expr *sqlite3ExprAnd(Expr *pLeft, Expr *pRight){
  if( pLeft==0 ){
    return pRight;
  }else if( pRight==0 ){
    return pLeft;
  }else{
    return sqlite3Expr(TK_AND, pLeft, pRight, 0);
  }
}

/*
** Set the Expr.span field of the given expression to span all
** text between the two given tokens.
*/
void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
  assert( pRight!=0 );
  assert( pLeft!=0 );
  if( !sqlite3MallocFailed() && pRight->z && pLeft->z ){
    assert( pLeft->dyn==0 || pLeft->z[pLeft->n]==0 );
    if( pLeft->dyn==0 && pRight->dyn==0 ){
      pExpr->span.z = pLeft->z;
      pExpr->span.n = pRight->n + (pRight->z - pLeft->z);
    }else{
      pExpr->span.z = 0;
    }
  }
}

/*
** Construct a new expression node for a function with multiple
** arguments.
*/
Expr *sqlite3ExprFunction(ExprList *pList, Token *pToken){
  Expr *pNew;
  assert( pToken );
  pNew = sqliteMalloc( sizeof(Expr) );
  if( pNew==0 ){
    sqlite3ExprListDelete(pList); /* Avoid leaking memory when malloc fails */
    return 0;
  }
  pNew->op = TK_FUNCTION;
  pNew->pList = pList;
  assert( pToken->dyn==0 );
  pNew->token = *pToken;
  pNew->span = pNew->token;
  return pNew;
}

/*
** Assign a variable number to an expression that encodes a wildcard
** in the original SQL statement.  
**
** Wildcards consisting of a single "?" are assigned the next sequential
** variable number.
**
** Wildcards of the form "?nnn" are assigned the number "nnn".  We make
** sure "nnn" is not too be to avoid a denial of service attack when
** the SQL statement comes from an external source.
**
** Wildcards of the form ":aaa" or "$aaa" are assigned the same number
** as the previous instance of the same wildcard.  Or if this is the first
** instance of the wildcard, the next sequenial variable number is
** assigned.
*/
void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
  Token *pToken;
  if( pExpr==0 ) return;
  pToken = &pExpr->token;
  assert( pToken->n>=1 );
  assert( pToken->z!=0 );
  assert( pToken->z[0]!=0 );
  if( pToken->n==1 ){
    /* Wildcard of the form "?".  Assign the next variable number */
    pExpr->iTable = ++pParse->nVar;
  }else if( pToken->z[0]=='?' ){
    /* Wildcard of the form "?nnn".  Convert "nnn" to an integer and
    ** use it as the variable number */
    int i;
    pExpr->iTable = i = atoi((char*)&pToken->z[1]);
    if( i<1 || i>SQLITE_MAX_VARIABLE_NUMBER ){
      sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d",
          SQLITE_MAX_VARIABLE_NUMBER);
    }
    if( i>pParse->nVar ){
      pParse->nVar = i;
    }
  }else{
    /* Wildcards of the form ":aaa" or "$aaa".  Reuse the same variable
    ** number as the prior appearance of the same name, or if the name
    ** has never appeared before, reuse the same variable number
    */
    int i, n;
    n = pToken->n;
    for(i=0; i<pParse->nVarExpr; i++){
      Expr *pE;
      if( (pE = pParse->apVarExpr[i])!=0
          && pE->token.n==n
          && memcmp(pE->token.z, pToken->z, n)==0 ){
        pExpr->iTable = pE->iTable;
        break;
      }
    }
    if( i>=pParse->nVarExpr ){
      pExpr->iTable = ++pParse->nVar;
      if( pParse->nVarExpr>=pParse->nVarExprAlloc-1 ){
        pParse->nVarExprAlloc += pParse->nVarExprAlloc + 10;
        sqliteReallocOrFree((void**)&pParse->apVarExpr,
                       pParse->nVarExprAlloc*sizeof(pParse->apVarExpr[0]) );
      }
      if( !sqlite3MallocFailed() ){
        assert( pParse->apVarExpr!=0 );
        pParse->apVarExpr[pParse->nVarExpr++] = pExpr;
      }
    }
  } 
}

/*
** Recursively delete an expression tree.
*/
void sqlite3ExprDelete(Expr *p){
  if( p==0 ) return;
  if( p->span.dyn ) sqliteFree((char*)p->span.z);
  if( p->token.dyn ) sqliteFree((char*)p->token.z);
  sqlite3ExprDelete(p->pLeft);
  sqlite3ExprDelete(p->pRight);
  sqlite3ExprListDelete(p->pList);
  sqlite3SelectDelete(p->pSelect);
  sqliteFree(p);
}

/*
** The Expr.token field might be a string literal that is quoted.
** If so, remove the quotation marks.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕免费不卡在线| 色偷偷成人一区二区三区91| 专区另类欧美日韩| 亚洲自拍偷拍欧美| 麻豆精品蜜桃视频网站| 成人18视频在线播放| 欧美色男人天堂| 久久综合九色综合97_久久久| 不卡的电影网站| 国产成人免费视频精品含羞草妖精| 国产精品久久一卡二卡| 一区二区三区国产精华| 综合色天天鬼久久鬼色| 亚洲va欧美va国产va天堂影院| 一区二区三区久久| 激情另类小说区图片区视频区| 一区二区中文视频| 午夜av一区二区| 亚洲一区二区成人在线观看| 国产一区二区三区香蕉| 一本色道久久综合亚洲aⅴ蜜桃| 99国产精品视频免费观看| 94色蜜桃网一区二区三区| 91啪九色porn原创视频在线观看| 免费人成在线不卡| av网站一区二区三区| 欧美一级久久久| 最新久久zyz资源站| 蜜臂av日日欢夜夜爽一区| 成人毛片在线观看| av在线播放不卡| 色婷婷av久久久久久久| 久久综合狠狠综合久久综合88| 国产日韩精品一区二区三区| 五月激情六月综合| 成人丝袜视频网| 日韩精品影音先锋| 欧美国产97人人爽人人喊| 日本网站在线观看一区二区三区| 亚洲精品你懂的| 激情图片小说一区| 欧美老年两性高潮| 中文字幕一区二区三区不卡| 激情综合亚洲精品| 337p亚洲精品色噜噜噜| 亚洲女同一区二区| 亚洲国产精品影院| 成人激情校园春色| 久久久亚洲欧洲日产国码αv| 国产精品久久久久四虎| 国产综合久久久久久鬼色 | 99精品偷自拍| www日韩大片| 亚洲欧洲中文日韩久久av乱码| 亚洲一区在线观看免费 | 日韩一级大片在线观看| 亚洲最新视频在线播放| 99精品视频一区二区三区| 欧美日韩高清一区二区| 一区二区三区不卡在线观看| 美女一区二区三区在线观看| 欧美视频中文字幕| 亚洲黄色录像片| 精品一区二区在线免费观看| 92国产精品观看| 自拍视频在线观看一区二区| bt7086福利一区国产| 7777精品伊人久久久大香线蕉经典版下载| 欧洲一区二区av| 久久久国产午夜精品| 精品无码三级在线观看视频| 日韩一区二区三区av| 国产精品久久夜| 成人av资源在线观看| 国产精品网站一区| www.日韩大片| ww亚洲ww在线观看国产| 亚洲国产精品人人做人人爽| 欧美日韩精品一区视频| 日韩高清不卡一区| 精品剧情在线观看| 国产传媒久久文化传媒| 91精品啪在线观看国产60岁| 成人免费在线播放视频| 91小视频免费观看| 亚洲福利一区二区| 欧美日韩一级片在线观看| 综合色天天鬼久久鬼色| 欧洲在线/亚洲| 18欧美亚洲精品| 日本高清无吗v一区| 香蕉成人啪国产精品视频综合网| 久久成人免费网| 欧美图区在线视频| 亚洲欧美视频一区| heyzo一本久久综合| 亚洲色图都市小说| 欧美性大战久久久久久久 | 大陆成人av片| 樱桃国产成人精品视频| 欧美日韩高清影院| 精品在线一区二区三区| 日韩一区二区三区免费观看| 国产精品系列在线观看| 亚洲视频你懂的| 欧美一区二区在线不卡| 亚洲高清一区二区三区| 日韩欧美黄色影院| 国产99久久久国产精品潘金网站| 精品国产精品网麻豆系列| 成人av小说网| 亚洲成人av一区二区三区| 精品国产一二三| 裸体歌舞表演一区二区| 欧美一级高清片| 成人毛片视频在线观看| 偷拍与自拍一区| 国产亚洲欧美色| 欧美日韩中字一区| 亚洲一区精品在线| 欧美老女人第四色| 首页国产欧美日韩丝袜| 国产午夜久久久久| 色菇凉天天综合网| 国内精品久久久久影院色| 337p日本欧洲亚洲大胆色噜噜| 亚洲综合激情网| 国产网站一区二区| 欧美乱妇20p| 久久精品久久精品| 精品成人在线观看| 高清不卡一区二区| 国产精品女主播av| 88在线观看91蜜桃国自产| 成人短视频下载| 亚洲欧美另类久久久精品2019 | 亚洲黄色尤物视频| 欧美色视频在线观看| 国产日韩欧美一区二区三区乱码 | 在线播放中文字幕一区| 日本va欧美va欧美va精品| 欧美v日韩v国产v| 色综合久久中文综合久久97| 久久99精品久久久久久动态图 | 国产白丝精品91爽爽久久| 亚洲福利电影网| 精品剧情v国产在线观看在线| 婷婷国产在线综合| 精品嫩草影院久久| 99久久精品国产麻豆演员表| 久久精品噜噜噜成人88aⅴ| 欧美激情中文字幕| 精品日韩在线观看| 制服丝袜亚洲色图| 欧美网站一区二区| 99re热这里只有精品视频| 国产乱码精品1区2区3区| 日本欧美肥老太交大片| 亚洲一区二区在线免费看| 884aa四虎影成人精品一区| 精品一区二区国语对白| 欧美mv日韩mv国产网站| av在线综合网| 日本v片在线高清不卡在线观看| 欧美日韩精品电影| 一本色道久久加勒比精品 | 欧美巨大另类极品videosbest| 美脚の诱脚舐め脚责91| 国产精品亲子乱子伦xxxx裸| 26uuu色噜噜精品一区| 91麻豆国产自产在线观看| 丁香另类激情小说| 国内成人精品2018免费看| 亚洲三级小视频| 日韩免费福利电影在线观看| 91精品国产91热久久久做人人| 国产精品538一区二区在线| 老司机精品视频线观看86| 日本不卡一区二区三区高清视频| 日韩一二三区视频| 67194成人在线观看| 制服.丝袜.亚洲.另类.中文| 成人h动漫精品| 久久99精品久久久久久久久久久久 | 一区二区三区在线视频观看| 亚洲欧美日韩一区二区| 亚洲欧洲精品天堂一级 | 久久97超碰国产精品超碰| 久久精品国产澳门| 亚洲美女电影在线| 26uuu精品一区二区在线观看| 97精品国产97久久久久久久久久久久| 一色桃子久久精品亚洲| 亚洲视频一区二区在线| 亚洲一区在线视频观看| 亚洲国产精品人人做人人爽| 蜜臀av在线播放一区二区三区| 亚洲一区二区精品视频| 国产精品久久久久久久久动漫| 在线观看中文字幕不卡|