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

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

?? expr.c

?? sqlite 嵌入式數據庫的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
void sqlite3TokenCopy(Token *pTo, Token *pFrom){  if( pTo->dyn ) sqliteFree((char*)pTo->z);  if( pFrom->z ){    pTo->n = pFrom->n;    pTo->z = sqliteStrNDup(pFrom->z, pFrom->n);    pTo->dyn = 1;  }else{    pTo->z = 0;  }}ExprList *sqlite3ExprListDup(ExprList *p){  ExprList *pNew;  struct ExprList_item *pItem, *pOldItem;  int i;  if( p==0 ) return 0;  pNew = sqliteMalloc( sizeof(*pNew) );  if( pNew==0 ) return 0;  pNew->nExpr = pNew->nAlloc = p->nExpr;  pNew->a = pItem = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );  if( pItem==0 ){    sqliteFree(pNew);    return 0;  }   pOldItem = p->a;  for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){    Expr *pNewExpr, *pOldExpr;    pItem->pExpr = pNewExpr = sqlite3ExprDup(pOldExpr = pOldItem->pExpr);    if( pOldExpr->span.z!=0 && pNewExpr ){      /* Always make a copy of the span for top-level expressions in the      ** expression list.  The logic in SELECT processing that determines      ** the names of columns in the result set needs this information */      sqlite3TokenCopy(&pNewExpr->span, &pOldExpr->span);    }    assert( pNewExpr==0 || pNewExpr->span.z!=0             || pOldExpr->span.z==0 || sqlite3_malloc_failed );    pItem->zName = sqliteStrDup(pOldItem->zName);    pItem->sortOrder = pOldItem->sortOrder;    pItem->isAgg = pOldItem->isAgg;    pItem->done = 0;  }  return pNew;}/*** If cursors, triggers, views and subqueries are all omitted from** the build, then none of the following routines, except for ** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes** called with a NULL argument.*/#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ || !defined(SQLITE_OMIT_SUBQUERY)SrcList *sqlite3SrcListDup(SrcList *p){  SrcList *pNew;  int i;  int nByte;  if( p==0 ) return 0;  nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0);  pNew = sqliteMallocRaw( nByte );  if( pNew==0 ) return 0;  pNew->nSrc = pNew->nAlloc = p->nSrc;  for(i=0; i<p->nSrc; i++){    struct SrcList_item *pNewItem = &pNew->a[i];    struct SrcList_item *pOldItem = &p->a[i];    Table *pTab;    pNewItem->zDatabase = sqliteStrDup(pOldItem->zDatabase);    pNewItem->zName = sqliteStrDup(pOldItem->zName);    pNewItem->zAlias = sqliteStrDup(pOldItem->zAlias);    pNewItem->jointype = pOldItem->jointype;    pNewItem->iCursor = pOldItem->iCursor;    pTab = pNewItem->pTab = pOldItem->pTab;    if( pTab ){      pTab->nRef++;    }    pNewItem->pSelect = sqlite3SelectDup(pOldItem->pSelect);    pNewItem->pOn = sqlite3ExprDup(pOldItem->pOn);    pNewItem->pUsing = sqlite3IdListDup(pOldItem->pUsing);    pNewItem->colUsed = pOldItem->colUsed;  }  return pNew;}IdList *sqlite3IdListDup(IdList *p){  IdList *pNew;  int i;  if( p==0 ) return 0;  pNew = sqliteMallocRaw( sizeof(*pNew) );  if( pNew==0 ) return 0;  pNew->nId = pNew->nAlloc = p->nId;  pNew->a = sqliteMallocRaw( p->nId*sizeof(p->a[0]) );  if( pNew->a==0 ){    sqliteFree(pNew);    return 0;  }  for(i=0; i<p->nId; i++){    struct IdList_item *pNewItem = &pNew->a[i];    struct IdList_item *pOldItem = &p->a[i];    pNewItem->zName = sqliteStrDup(pOldItem->zName);    pNewItem->idx = pOldItem->idx;  }  return pNew;}Select *sqlite3SelectDup(Select *p){  Select *pNew;  if( p==0 ) return 0;  pNew = sqliteMallocRaw( sizeof(*p) );  if( pNew==0 ) return 0;  pNew->isDistinct = p->isDistinct;  pNew->pEList = sqlite3ExprListDup(p->pEList);  pNew->pSrc = sqlite3SrcListDup(p->pSrc);  pNew->pWhere = sqlite3ExprDup(p->pWhere);  pNew->pGroupBy = sqlite3ExprListDup(p->pGroupBy);  pNew->pHaving = sqlite3ExprDup(p->pHaving);  pNew->pOrderBy = sqlite3ExprListDup(p->pOrderBy);  pNew->op = p->op;  pNew->pPrior = sqlite3SelectDup(p->pPrior);  pNew->pLimit = sqlite3ExprDup(p->pLimit);  pNew->pOffset = sqlite3ExprDup(p->pOffset);  pNew->iLimit = -1;  pNew->iOffset = -1;  pNew->ppOpenTemp = 0;  pNew->isResolved = p->isResolved;  pNew->isAgg = p->isAgg;  return pNew;}#elseSelect *sqlite3SelectDup(Select *p){  assert( p==0 );  return 0;}#endif/*** Add a new element to the end of an expression list.  If pList is** initially NULL, then create a new expression list.*/ExprList *sqlite3ExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){  if( pList==0 ){    pList = sqliteMalloc( sizeof(ExprList) );    if( pList==0 ){      goto no_mem;    }    assert( pList->nAlloc==0 );  }  if( pList->nAlloc<=pList->nExpr ){    struct ExprList_item *a;    int n = pList->nAlloc*2 + 4;    a = sqliteRealloc(pList->a, n*sizeof(pList->a[0]));    if( a==0 ){      goto no_mem;    }    pList->a = a;    pList->nAlloc = n;  }  assert( pList->a!=0 );  if( pExpr || pName ){    struct ExprList_item *pItem = &pList->a[pList->nExpr++];    memset(pItem, 0, sizeof(*pItem));    pItem->zName = sqlite3NameFromToken(pName);    pItem->pExpr = pExpr;  }  return pList;no_mem:       /* Avoid leaking memory if malloc has failed. */  sqlite3ExprDelete(pExpr);  sqlite3ExprListDelete(pList);  return 0;}/*** Delete an entire expression list.*/void sqlite3ExprListDelete(ExprList *pList){  int i;  struct ExprList_item *pItem;  if( pList==0 ) return;  assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) );  assert( pList->nExpr<=pList->nAlloc );  for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){    sqlite3ExprDelete(pItem->pExpr);    sqliteFree(pItem->zName);  }  sqliteFree(pList->a);  sqliteFree(pList);}/*** Walk an expression tree.  Call xFunc for each node visited.**** The return value from xFunc determines whether the tree walk continues.** 0 means continue walking the tree.  1 means do not walk children** of the current node but continue with siblings.  2 means abandon** the tree walk completely.**** The return value from this routine is 1 to abandon the tree walk** and 0 to continue.*/static int walkExprList(ExprList *, int (*)(void *, Expr*), void *);static int walkExprTree(Expr *pExpr, int (*xFunc)(void*,Expr*), void *pArg){  int rc;  if( pExpr==0 ) return 0;  rc = (*xFunc)(pArg, pExpr);  if( rc==0 ){    if( walkExprTree(pExpr->pLeft, xFunc, pArg) ) return 1;    if( walkExprTree(pExpr->pRight, xFunc, pArg) ) return 1;    if( walkExprList(pExpr->pList, xFunc, pArg) ) return 1;  }  return rc>1;}/*** Call walkExprTree() for every expression in list p.*/static int walkExprList(ExprList *p, int (*xFunc)(void *, Expr*), void *pArg){  int i;  struct ExprList_item *pItem;  if( !p ) return 0;  for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){    if( walkExprTree(pItem->pExpr, xFunc, pArg) ) return 1;  }  return 0;}/*** Call walkExprTree() for every expression in Select p, not including** expressions that are part of sub-selects in any FROM clause or the LIMIT** or OFFSET expressions..*/static int walkSelectExpr(Select *p, int (*xFunc)(void *, Expr*), void *pArg){  walkExprList(p->pEList, xFunc, pArg);  walkExprTree(p->pWhere, xFunc, pArg);  walkExprList(p->pGroupBy, xFunc, pArg);  walkExprTree(p->pHaving, xFunc, pArg);  walkExprList(p->pOrderBy, xFunc, pArg);  return 0;}/*** This routine is designed as an xFunc for walkExprTree().**** pArg is really a pointer to an integer.  If we can tell by looking** at pExpr that the expression that contains pExpr is not a constant** expression, then set *pArg to 0 and return 2 to abandon the tree walk.** If pExpr does does not disqualify the expression from being a constant** then do nothing.**** After walking the whole tree, if no nodes are found that disqualify** the expression as constant, then we assume the whole expression** is constant.  See sqlite3ExprIsConstant() for additional information.*/static int exprNodeIsConstant(void *pArg, Expr *pExpr){  switch( pExpr->op ){    case TK_ID:    case TK_COLUMN:    case TK_DOT:    case TK_AGG_FUNCTION:    case TK_FUNCTION:#ifndef SQLITE_OMIT_SUBQUERY    case TK_SELECT:    case TK_EXISTS:#endif      *((int*)pArg) = 0;      return 2;    default:      return 0;  }}/*** Walk an expression tree.  Return 1 if the expression is constant** and 0 if it involves variables.**** For the purposes of this function, a double-quoted string (ex: "abc")** is considered a variable but a single-quoted string (ex: 'abc') is** a constant.*/int sqlite3ExprIsConstant(Expr *p){  int isConst = 1;  walkExprTree(p, exprNodeIsConstant, &isConst);  return isConst;}/*** If the expression p codes a constant integer that is small enough** to fit in a 32-bit integer, return 1 and put the value of the integer** in *pValue.  If the expression is not an integer or if it is too big** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.*/int sqlite3ExprIsInteger(Expr *p, int *pValue){  switch( p->op ){    case TK_INTEGER: {      if( sqlite3GetInt32(p->token.z, pValue) ){        return 1;      }      break;    }    case TK_UPLUS: {      return sqlite3ExprIsInteger(p->pLeft, pValue);    }    case TK_UMINUS: {      int v;      if( sqlite3ExprIsInteger(p->pLeft, &v) ){        *pValue = -v;        return 1;      }      break;    }    default: break;  }  return 0;}/*** Return TRUE if the given string is a row-id column name.*/int sqlite3IsRowid(const char *z){  if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1;  if( sqlite3StrICmp(z, "ROWID")==0 ) return 1;  if( sqlite3StrICmp(z, "OID")==0 ) return 1;  return 0;}/*** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up** that name in the set of source tables in pSrcList and make the pExpr ** expression node refer back to that source column.  The following changes** are made to pExpr:****    pExpr->iDb           Set the index in db->aDb[] of the database holding**                         the table.**    pExpr->iTable        Set to the cursor number for the table obtained**                         from pSrcList.**    pExpr->iColumn       Set to the column number within the table.**    pExpr->op            Set to TK_COLUMN.**    pExpr->pLeft         Any expression this points to is deleted**    pExpr->pRight        Any expression this points to is deleted.**** The pDbToken is the name of the database (the "X").  This value may be** NULL meaning that name is of the form Y.Z or Z.  Any available database** can be used.  The pTableToken is the name of the table (the "Y").  This** value can be NULL if pDbToken is also NULL.  If pTableToken is NULL it** means that the form of the name is Z and that columns from any table** can be used.**** If the name cannot be resolved unambiguously, leave an error message** in pParse and return non-zero.  Return zero on success.*/static int lookupName(  Parse *pParse,      /* The parsing context */  Token *pDbToken,     /* Name of the database containing table, or NULL */  Token *pTableToken,  /* Name of table containing column, or NULL */  Token *pColumnToken, /* Name of the column. */  NameContext *pNC,    /* The name context used to resolve the name */  Expr *pExpr          /* Make this EXPR node point to the selected column */){  char *zDb = 0;       /* Name of the database.  The "X" in X.Y.Z */  char *zTab = 0;      /* Name of the table.  The "Y" in X.Y.Z or Y.Z */  char *zCol = 0;      /* Name of the column.  The "Z" */  int i, j;            /* Loop counters */  int cnt = 0;         /* Number of matching column names */  int cntTab = 0;      /* Number of matching table names */  sqlite3 *db = pParse->db;  /* The database */  struct SrcList_item *pItem;       /* Use for looping over pSrcList items */  struct SrcList_item *pMatch = 0;  /* The matching pSrcList item */  NameContext *pTopNC = pNC;        /* First namecontext in the list */  assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */  zDb = sqlite3NameFromToken(pDbToken);  zTab = sqlite3NameFromToken(pTableToken);  zCol = sqlite3NameFromToken(pColumnToken);  if( sqlite3_malloc_failed ){    goto lookupname_end;  }  pExpr->iTable = -1;  while( pNC && cnt==0 ){    SrcList *pSrcList = pNC->pSrcList;    ExprList *pEList = pNC->pEList;    /* assert( zTab==0 || pEList==0 ); */    if( pSrcList ){      for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){        Table *pTab = pItem->pTab;        Column *pCol;          if( pTab==0 ) continue;        assert( pTab->nCol>0 );        if( zTab ){          if( pItem->zAlias ){            char *zTabName = pItem->zAlias;            if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue;          }else{            char *zTabName = pTab->zName;            if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue;            if( zDb!=0 && sqlite3StrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){              continue;            }          }        }        if( 0==(cntTab++) ){          pExpr->iTable = pItem->iCursor;          pExpr->iDb = pTab->iDb;          pMatch = pItem;        }        for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){          if( sqlite3StrICmp(pCol->zName, zCol)==0 ){            IdList *pUsing;            cnt++;            pExpr->iTable = pItem->iCursor;            pMatch = pItem;            pExpr->iDb = pTab->iDb;            /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一二三四区在线| 午夜不卡av免费| 亚洲乱码国产乱码精品精可以看| 亚洲一二三四区不卡| 久久99国产精品麻豆| 欧美最猛性xxxxx直播| 国产日韩三级在线| 蜜桃久久av一区| 欧美性生活久久| 国产精品家庭影院| 国产乱妇无码大片在线观看| 欧美久久久久免费| 亚洲精品国久久99热| 国产一区999| 欧美www视频| 亚洲成a人v欧美综合天堂下载| 成人黄色电影在线| 久久久精品人体av艺术| 日韩国产精品大片| 欧美日韩精品一区二区在线播放| 中文字幕五月欧美| 成人av综合一区| 久久亚洲精华国产精华液| 免费高清在线一区| 91精品国产入口在线| 午夜久久久影院| 欧美亚洲国产一区二区三区| 亚洲欧美日韩久久| 972aa.com艺术欧美| 国产精品午夜春色av| 国产精品一二三| 国产亚洲精品久| 国产精品自拍一区| 国产日韩成人精品| 国产成人精品影视| 中文子幕无线码一区tr| 成人一级视频在线观看| 欧美国产禁国产网站cc| 丁香激情综合五月| 亚洲欧美自拍偷拍| 91社区在线播放| 亚洲一区免费在线观看| 91久久香蕉国产日韩欧美9色| 亚洲精品免费在线播放| 一本色道久久综合狠狠躁的推荐| 亚洲码国产岛国毛片在线| 91欧美激情一区二区三区成人| 一区二区高清视频在线观看| 欧美一a一片一级一片| 日一区二区三区| 精品国产免费一区二区三区香蕉| 麻豆精品一区二区| 久久精品男人天堂av| 成人黄色小视频| 亚洲国产成人av网| 日韩欧美你懂的| 成人国产视频在线观看| 亚洲精品国产高清久久伦理二区| 欧美日韩国产a| 国产专区欧美精品| 一区二区视频在线看| 欧美另类高清zo欧美| 国产成人在线色| 一区二区三区四区激情| 日韩一区二区在线观看视频播放| 国产一区二区在线电影| 亚洲另类色综合网站| 日韩欧美在线123| 成人av电影免费观看| 日韩黄色小视频| 欧美激情一区在线| 欧美日高清视频| 国产宾馆实践打屁股91| 亚洲影院理伦片| 国产亚洲1区2区3区| 色屁屁一区二区| 国产精品一区二区在线观看网站 | 蜜臀av性久久久久蜜臀aⅴ流畅| 精品国产一区二区亚洲人成毛片| 91麻豆免费视频| 麻豆一区二区三区| 国产精品高潮呻吟| 欧美草草影院在线视频| 91在线丨porny丨国产| 麻豆精品新av中文字幕| 亚洲精品老司机| 欧美精彩视频一区二区三区| 91麻豆精品91久久久久同性| 99久久国产综合精品色伊 | 伊人开心综合网| 欧美一级欧美一级在线播放| 97久久精品人人做人人爽| 伦理电影国产精品| 亚洲综合免费观看高清在线观看| 国产亚洲欧美中文| 精品国产一区二区三区av性色 | 国产性色一区二区| 欧美日韩aaaaaa| 在线视频国内自拍亚洲视频| 福利一区二区在线| 韩国av一区二区| 日韩国产精品大片| 亚洲成人在线网站| 亚洲综合色噜噜狠狠| 国产精品卡一卡二卡三| 久久久久久免费网| 久久久青草青青国产亚洲免观| 欧美精品18+| 欧美浪妇xxxx高跟鞋交| 欧美亚洲国产bt| 在线观看av一区| 欧美日韩亚洲综合一区| 91极品美女在线| 色哟哟国产精品免费观看| 99久久婷婷国产综合精品| 99久久久无码国产精品| av中文字幕亚洲| 91美女片黄在线观看91美女| www.亚洲精品| 91在线视频免费观看| 91色九色蝌蚪| 欧美在线观看一区二区| 欧美性猛交xxxxxxxx| 欧美卡1卡2卡| 日韩一区二区视频| 亚洲精品一区二区三区在线观看| 欧美精品一区二区精品网| 久久色在线观看| 中文字幕亚洲一区二区va在线| 日韩毛片高清在线播放| 亚洲一区在线观看视频| 午夜精品一区二区三区三上悠亚| 日本欧美韩国一区三区| 极品少妇xxxx偷拍精品少妇| 成人性生交大合| 91精品福利视频| 日韩一区二区高清| 国产视频在线观看一区二区三区| 中文字幕一区二区三区视频| 一区二区三区视频在线看| 五月天视频一区| 国产在线精品一区二区不卡了 | 在线一区二区观看| 欧美日韩国产小视频| 欧美大黄免费观看| 国产精品久久午夜| 轻轻草成人在线| 国产精品2024| 欧洲一区在线观看| 久久这里只精品最新地址| 日韩理论在线观看| 久久精品久久99精品久久| 国产91精品露脸国语对白| 色哟哟国产精品| 精品sm捆绑视频| 洋洋av久久久久久久一区| 黄网站免费久久| 欧美日韩在线一区二区| 久久夜色精品一区| 国精产品一区一区三区mba视频| 成人深夜在线观看| 欧美美女一区二区在线观看| 久久尤物电影视频在线观看| 亚洲第一主播视频| 成人高清视频在线| 欧美成人精品福利| 一级中文字幕一区二区| 国产成人av电影在线播放| 91麻豆精品国产91久久久更新时间| 国产精品网曝门| 九九热在线视频观看这里只有精品| 91电影在线观看| 国产精品久久久久一区二区三区 | 欧美午夜精品一区二区三区| www久久久久| 亚洲444eee在线观看| 99久久精品国产网站| 亚洲精品一线二线三线| 午夜精品福利一区二区三区蜜桃| 不卡一区二区三区四区| 精品久久国产老人久久综合| 午夜国产不卡在线观看视频| 色综合婷婷久久| 亚洲婷婷综合久久一本伊一区| 国产传媒欧美日韩成人| 欧美大肚乱孕交hd孕妇| 日韩精品亚洲专区| 在线视频你懂得一区| 亚洲欧美一区二区三区极速播放| 国产高清亚洲一区| 日韩精品在线看片z| 日韩电影在线观看电影| 56国语精品自产拍在线观看| 一区二区三区四区在线免费观看| 97久久超碰国产精品电影| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产白丝精品91爽爽久久| 精品少妇一区二区三区 | 在线播放日韩导航| 一区二区三区中文字幕电影|