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

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

?? select.c

?? 這是一個嵌入式系統上運行的輕量級數據庫
?? 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 C code routines that are called by the parser** to handle SELECT statements in SQLite.**** $Id: select.c,v 1.161.2.4 2004/07/20 01:45:49 drh Exp $*/#include "sqliteInt.h"/*** Allocate a new Select structure and return a pointer to that** structure.*/Select *sqliteSelectNew(  ExprList *pEList,     /* which columns to include in the result */  SrcList *pSrc,        /* the FROM clause -- which tables to scan */  Expr *pWhere,         /* the WHERE clause */  ExprList *pGroupBy,   /* the GROUP BY clause */  Expr *pHaving,        /* the HAVING clause */  ExprList *pOrderBy,   /* the ORDER BY clause */  int isDistinct,       /* true if the DISTINCT keyword is present */  int nLimit,           /* LIMIT value.  -1 means not used */  int nOffset           /* OFFSET value.  0 means no offset */){  Select *pNew;  pNew = sqliteMalloc( sizeof(*pNew) );  if( pNew==0 ){    sqliteExprListDelete(pEList);    sqliteSrcListDelete(pSrc);    sqliteExprDelete(pWhere);    sqliteExprListDelete(pGroupBy);    sqliteExprDelete(pHaving);    sqliteExprListDelete(pOrderBy);  }else{    if( pEList==0 ){      pEList = sqliteExprListAppend(0, sqliteExpr(TK_ALL,0,0,0), 0);    }    pNew->pEList = pEList;    pNew->pSrc = pSrc;    pNew->pWhere = pWhere;    pNew->pGroupBy = pGroupBy;    pNew->pHaving = pHaving;    pNew->pOrderBy = pOrderBy;    pNew->isDistinct = isDistinct;    pNew->op = TK_SELECT;    pNew->nLimit = nLimit;    pNew->nOffset = nOffset;    pNew->iLimit = -1;    pNew->iOffset = -1;  }  return pNew;}/*** Given 1 to 3 identifiers preceeding the JOIN keyword, determine the** type of join.  Return an integer constant that expresses that type** in terms of the following bit values:****     JT_INNER**     JT_OUTER**     JT_NATURAL**     JT_LEFT**     JT_RIGHT**** A full outer join is the combination of JT_LEFT and JT_RIGHT.**** If an illegal or unsupported join type is seen, then still return** a join type, but put an error in the pParse structure.*/int sqliteJoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){  int jointype = 0;  Token *apAll[3];  Token *p;  static struct {    const char *zKeyword;    int nChar;    int code;  } keywords[] = {    { "natural", 7, JT_NATURAL },    { "left",    4, JT_LEFT|JT_OUTER },    { "right",   5, JT_RIGHT|JT_OUTER },    { "full",    4, JT_LEFT|JT_RIGHT|JT_OUTER },    { "outer",   5, JT_OUTER },    { "inner",   5, JT_INNER },    { "cross",   5, JT_INNER },  };  int i, j;  apAll[0] = pA;  apAll[1] = pB;  apAll[2] = pC;  for(i=0; i<3 && apAll[i]; i++){    p = apAll[i];    for(j=0; j<sizeof(keywords)/sizeof(keywords[0]); j++){      if( p->n==keywords[j].nChar           && sqliteStrNICmp(p->z, keywords[j].zKeyword, p->n)==0 ){        jointype |= keywords[j].code;        break;      }    }    if( j>=sizeof(keywords)/sizeof(keywords[0]) ){      jointype |= JT_ERROR;      break;    }  }  if(     (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) ||     (jointype & JT_ERROR)!=0  ){    static Token dummy = { 0, 0 };    char *zSp1 = " ", *zSp2 = " ";    if( pB==0 ){ pB = &dummy; zSp1 = 0; }    if( pC==0 ){ pC = &dummy; zSp2 = 0; }    sqliteSetNString(&pParse->zErrMsg, "unknown or unsupported join type: ", 0,       pA->z, pA->n, zSp1, 1, pB->z, pB->n, zSp2, 1, pC->z, pC->n, 0);    pParse->nErr++;    jointype = JT_INNER;  }else if( jointype & JT_RIGHT ){    sqliteErrorMsg(pParse,       "RIGHT and FULL OUTER JOINs are not currently supported");    jointype = JT_INNER;  }  return jointype;}/*** Return the index of a column in a table.  Return -1 if the column** is not contained in the table.*/static int columnIndex(Table *pTab, const char *zCol){  int i;  for(i=0; i<pTab->nCol; i++){    if( sqliteStrICmp(pTab->aCol[i].zName, zCol)==0 ) return i;  }  return -1;}/*** Add a term to the WHERE expression in *ppExpr that requires the** zCol column to be equal in the two tables pTab1 and pTab2.*/static void addWhereTerm(  const char *zCol,        /* Name of the column */  const Table *pTab1,      /* First table */  const Table *pTab2,      /* Second table */  Expr **ppExpr            /* Add the equality term to this expression */){  Token dummy;  Expr *pE1a, *pE1b, *pE1c;  Expr *pE2a, *pE2b, *pE2c;  Expr *pE;  dummy.z = zCol;  dummy.n = strlen(zCol);  dummy.dyn = 0;  pE1a = sqliteExpr(TK_ID, 0, 0, &dummy);  pE2a = sqliteExpr(TK_ID, 0, 0, &dummy);  dummy.z = pTab1->zName;  dummy.n = strlen(dummy.z);  pE1b = sqliteExpr(TK_ID, 0, 0, &dummy);  dummy.z = pTab2->zName;  dummy.n = strlen(dummy.z);  pE2b = sqliteExpr(TK_ID, 0, 0, &dummy);  pE1c = sqliteExpr(TK_DOT, pE1b, pE1a, 0);  pE2c = sqliteExpr(TK_DOT, pE2b, pE2a, 0);  pE = sqliteExpr(TK_EQ, pE1c, pE2c, 0);  ExprSetProperty(pE, EP_FromJoin);  if( *ppExpr ){    *ppExpr = sqliteExpr(TK_AND, *ppExpr, pE, 0);  }else{    *ppExpr = pE;  }}/*** Set the EP_FromJoin property on all terms of the given expression.**** The EP_FromJoin property is used on terms of an expression to tell** the LEFT OUTER JOIN processing logic that this term is part of the** join restriction specified in the ON or USING clause and not a part** of the more general WHERE clause.  These terms are moved over to the** WHERE clause during join processing but we need to remember that they** originated in the ON or USING clause.*/static void setJoinExpr(Expr *p){  while( p ){    ExprSetProperty(p, EP_FromJoin);    setJoinExpr(p->pLeft);    p = p->pRight;  } }/*** This routine processes the join information for a SELECT statement.** ON and USING clauses are converted into extra terms of the WHERE clause.** NATURAL joins also create extra WHERE clause terms.**** This routine returns the number of errors encountered.*/static int sqliteProcessJoin(Parse *pParse, Select *p){  SrcList *pSrc;  int i, j;  pSrc = p->pSrc;  for(i=0; i<pSrc->nSrc-1; i++){    struct SrcList_item *pTerm = &pSrc->a[i];    struct SrcList_item *pOther = &pSrc->a[i+1];    if( pTerm->pTab==0 || pOther->pTab==0 ) continue;    /* When the NATURAL keyword is present, add WHERE clause terms for    ** every column that the two tables have in common.    */    if( pTerm->jointype & JT_NATURAL ){      Table *pTab;      if( pTerm->pOn || pTerm->pUsing ){        sqliteErrorMsg(pParse, "a NATURAL join may not have "           "an ON or USING clause", 0);        return 1;      }      pTab = pTerm->pTab;      for(j=0; j<pTab->nCol; j++){        if( columnIndex(pOther->pTab, pTab->aCol[j].zName)>=0 ){          addWhereTerm(pTab->aCol[j].zName, pTab, pOther->pTab, &p->pWhere);        }      }    }    /* Disallow both ON and USING clauses in the same join    */    if( pTerm->pOn && pTerm->pUsing ){      sqliteErrorMsg(pParse, "cannot have both ON and USING "        "clauses in the same join");      return 1;    }    /* Add the ON clause to the end of the WHERE clause, connected by    ** and AND operator.    */    if( pTerm->pOn ){      setJoinExpr(pTerm->pOn);      if( p->pWhere==0 ){        p->pWhere = pTerm->pOn;      }else{        p->pWhere = sqliteExpr(TK_AND, p->pWhere, pTerm->pOn, 0);      }      pTerm->pOn = 0;    }    /* Create extra terms on the WHERE clause for each column named    ** in the USING clause.  Example: If the two tables to be joined are     ** A and B and the USING clause names X, Y, and Z, then add this    ** to the WHERE clause:    A.X=B.X AND A.Y=B.Y AND A.Z=B.Z    ** Report an error if any column mentioned in the USING clause is    ** not contained in both tables to be joined.    */    if( pTerm->pUsing ){      IdList *pList;      int j;      assert( i<pSrc->nSrc-1 );      pList = pTerm->pUsing;      for(j=0; j<pList->nId; j++){        if( columnIndex(pTerm->pTab, pList->a[j].zName)<0 ||            columnIndex(pOther->pTab, pList->a[j].zName)<0 ){          sqliteErrorMsg(pParse, "cannot join using column %s - column "            "not present in both tables", pList->a[j].zName);          return 1;        }        addWhereTerm(pList->a[j].zName, pTerm->pTab, pOther->pTab, &p->pWhere);      }    }  }  return 0;}/*** Delete the given Select structure and all of its substructures.*/void sqliteSelectDelete(Select *p){  if( p==0 ) return;  sqliteExprListDelete(p->pEList);  sqliteSrcListDelete(p->pSrc);  sqliteExprDelete(p->pWhere);  sqliteExprListDelete(p->pGroupBy);  sqliteExprDelete(p->pHaving);  sqliteExprListDelete(p->pOrderBy);  sqliteSelectDelete(p->pPrior);  sqliteFree(p->zSelect);  sqliteFree(p);}/*** Delete the aggregate information from the parse structure.*/static void sqliteAggregateInfoReset(Parse *pParse){  sqliteFree(pParse->aAgg);  pParse->aAgg = 0;  pParse->nAgg = 0;  pParse->useAgg = 0;}/*** Insert code into "v" that will push the record on the top of the** stack into the sorter.*/static void pushOntoSorter(Parse *pParse, Vdbe *v, ExprList *pOrderBy){  char *zSortOrder;  int i;  zSortOrder = sqliteMalloc( pOrderBy->nExpr + 1 );  if( zSortOrder==0 ) return;  for(i=0; i<pOrderBy->nExpr; i++){    int order = pOrderBy->a[i].sortOrder;    int type;    int c;    if( (order & SQLITE_SO_TYPEMASK)==SQLITE_SO_TEXT ){      type = SQLITE_SO_TEXT;    }else if( (order & SQLITE_SO_TYPEMASK)==SQLITE_SO_NUM ){      type = SQLITE_SO_NUM;    }else if( pParse->db->file_format>=4 ){      type = sqliteExprType(pOrderBy->a[i].pExpr);    }else{      type = SQLITE_SO_NUM;    }    if( (order & SQLITE_SO_DIRMASK)==SQLITE_SO_ASC ){      c = type==SQLITE_SO_TEXT ? 'A' : '+';    }else{      c = type==SQLITE_SO_TEXT ? 'D' : '-';    }    zSortOrder[i] = c;    sqliteExprCode(pParse, pOrderBy->a[i].pExpr);  }  zSortOrder[pOrderBy->nExpr] = 0;  sqliteVdbeOp3(v, OP_SortMakeKey, pOrderBy->nExpr, 0, zSortOrder, P3_DYNAMIC);  sqliteVdbeAddOp(v, OP_SortPut, 0, 0);}/*** This routine adds a P3 argument to the last VDBE opcode that was** inserted. The P3 argument added is a string suitable for the ** OP_MakeKey or OP_MakeIdxKey opcodes.  The string consists of** characters 't' or 'n' depending on whether or not the various** fields of the key to be generated should be treated as numeric** or as text.  See the OP_MakeKey and OP_MakeIdxKey opcode** documentation for additional information about the P3 string.** See also the sqliteAddIdxKeyType() routine.*/void sqliteAddKeyType(Vdbe *v, ExprList *pEList){  int nColumn = pEList->nExpr;  char *zType = sqliteMalloc( nColumn+1 );  int i;  if( zType==0 ) return;  for(i=0; i<nColumn; i++){    zType[i] = sqliteExprType(pEList->a[i].pExpr)==SQLITE_SO_NUM ? 'n' : 't';  }  zType[i] = 0;  sqliteVdbeChangeP3(v, -1, zType, P3_DYNAMIC);}/*** Add code to implement the OFFSET and LIMIT*/static void codeLimiter(  Vdbe *v,          /* Generate code into this VM */  Select *p,        /* The SELECT statement being coded */  int iContinue,    /* Jump here to skip the current record */  int iBreak,       /* Jump here to end the loop */  int nPop          /* Number of times to pop stack when jumping */){  if( p->iOffset>=0 ){    int addr = sqliteVdbeCurrentAddr(v) + 2;    if( nPop>0 ) addr++;    sqliteVdbeAddOp(v, OP_MemIncr, p->iOffset, addr);    if( nPop>0 ){      sqliteVdbeAddOp(v, OP_Pop, nPop, 0);    }    sqliteVdbeAddOp(v, OP_Goto, 0, iContinue);  }  if( p->iLimit>=0 ){    sqliteVdbeAddOp(v, OP_MemIncr, p->iLimit, iBreak);  }}/*** This routine generates the code for the inside of the inner loop** of a SELECT.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产综合色在线视频区| 亚洲日本在线视频观看| 蜜臂av日日欢夜夜爽一区| 欧美日韩国产综合草草| 午夜电影一区二区三区| 91精品国产色综合久久不卡电影| 日韩精品1区2区3区| 日韩欧美不卡一区| 国产一区二区电影| 亚洲国产激情av| 日本道色综合久久| 亚洲国产视频直播| 欧美一区二区三区免费视频| 国产永久精品大片wwwapp| 国产日产亚洲精品系列| 91久久香蕉国产日韩欧美9色| 亚洲高清免费观看高清完整版在线观看 | 99精品国产视频| 亚洲影院久久精品| 欧美大片在线观看一区二区| 国产电影一区二区三区| 亚洲视频一区二区在线| 337p亚洲精品色噜噜| 国内偷窥港台综合视频在线播放| 中文无字幕一区二区三区| 欧美亚洲禁片免费| 国内精品久久久久影院一蜜桃| 国产精品久久久久久久裸模| 欧美亚洲动漫精品| 国产美女精品一区二区三区| 樱桃视频在线观看一区| 精品国产电影一区二区| 色网站国产精品| 国内国产精品久久| 一区二区三区在线观看网站| 精品国产乱码久久久久久闺蜜| 99国产精品久久久| 韩国成人福利片在线播放| 亚洲乱码国产乱码精品精小说 | 99久久亚洲一区二区三区青草 | 91精品国产乱| 99久久婷婷国产综合精品| 久久精品国产精品亚洲精品 | 精品999久久久| 在线中文字幕一区| 国产精品2024| 日韩—二三区免费观看av| 亚洲欧美另类综合偷拍| 久久综合视频网| 欧美二区乱c少妇| 99久久99精品久久久久久| 激情文学综合网| 亚洲一区欧美一区| 国产精品欧美一区喷水| 精品精品国产高清一毛片一天堂| 欧美日韩亚洲不卡| 91最新地址在线播放| 国产综合色视频| 男人操女人的视频在线观看欧美| 亚洲卡通欧美制服中文| 国产精品久久一卡二卡| 2023国产精品自拍| 日韩视频永久免费| 欧美三级午夜理伦三级中视频| 97国产一区二区| jlzzjlzz欧美大全| 欧美视频你懂的| 91丨porny丨蝌蚪视频| 国产风韵犹存在线视精品| 另类欧美日韩国产在线| 日日夜夜免费精品| 婷婷国产在线综合| 午夜视频一区二区三区| 一区二区三区日韩欧美| 亚洲免费看黄网站| 一区二区三区四区五区视频在线观看 | 亚洲精品国产a久久久久久| 国产精品白丝在线| 亚洲欧洲精品一区二区精品久久久| 久久久久久久久久看片| 国产欧美精品区一区二区三区| 久久久91精品国产一区二区精品 | 一区二区三区在线播| 亚洲精品视频免费看| 亚洲欧美偷拍三级| 一区二区三区在线视频免费| 一区二区三区在线视频观看58 | 日韩av中文在线观看| 日韩av在线免费观看不卡| 日韩av高清在线观看| 日韩高清在线一区| 黄页网站大全一区二区| 国产成人av一区二区三区在线 | 亚洲视频电影在线| 一区二区三区中文在线| 久久久五月婷婷| 久久久国产综合精品女国产盗摄| 久久九九全国免费| 亚洲欧洲综合另类在线| 亚洲已满18点击进入久久| 日韩电影在线看| 国产精品正在播放| 99精品久久久久久| 欧美精品黑人性xxxx| 精品国产一区二区在线观看| 国产精品国产三级国产a| 亚洲一区二区三区国产| 久久精品国产精品亚洲精品| 国产91对白在线观看九色| 日本韩国一区二区三区视频| 69精品人人人人| 日本一区二区成人| 亚洲高清免费一级二级三级| 国产一区二区三区免费| 91亚洲大成网污www| 欧美一区二区啪啪| 国产精品久久久久一区二区三区共| 亚洲美女在线一区| 精品一区二区精品| 91浏览器在线视频| 日韩欧美国产午夜精品| 亚洲婷婷在线视频| 美女视频黄久久| 91蜜桃视频在线| 久久影院午夜片一区| 亚洲欧美区自拍先锋| 国产一区二区在线观看免费| 欧美亚洲综合色| 国产欧美日韩另类视频免费观看| 亚洲国产视频一区二区| 国产成人在线看| 欧美一级二级在线观看| 中文字幕一区二区三区不卡| 久久se精品一区精品二区| 欧美在线观看视频一区二区| 国产欧美日韩麻豆91| 久久精品国产99| 在线观看网站黄不卡| 国产精品久久久久影院亚瑟 | 精品在线一区二区三区| 欧美性大战xxxxx久久久| 亚洲国产精品国自产拍av| 蜜臀国产一区二区三区在线播放| 色综合久久综合网97色综合| 国产欧美一区二区精品秋霞影院| 日韩 欧美一区二区三区| 在线观看日韩一区| 亚洲欧美在线aaa| 成人一二三区视频| 精品国产乱码91久久久久久网站| 亚州成人在线电影| 91久久精品一区二区二区| 国产精品护士白丝一区av| 国产精品99久| 久久蜜桃一区二区| 久草精品在线观看| 精品人在线二区三区| 日韩av电影天堂| 91精品国产免费| 99国产精品99久久久久久| 国产性色一区二区| 精品一区二区国语对白| 日韩欧美视频在线| 免费人成精品欧美精品| 欧美一区二区日韩一区二区| 免费成人av资源网| 日韩欧美高清在线| 麻豆精品蜜桃视频网站| 91精品国产一区二区三区蜜臀| 日韩精品一区第一页| 日韩一二三区视频| 麻豆精品一区二区综合av| 日韩一级在线观看| 黄网站免费久久| 久久青草欧美一区二区三区| 国产一区二区在线免费观看| 国产日韩v精品一区二区| eeuss国产一区二区三区| 国产精品久久久久久久岛一牛影视| 91在线你懂得| 亚洲国产一二三| 91精品国产综合久久婷婷香蕉| 日本亚洲视频在线| 久久综合九色综合欧美亚洲| 国产成人精品亚洲777人妖| 国产精品妹子av| 在线一区二区视频| 欧美aaaaaa午夜精品| 久久久久久久综合日本| zzijzzij亚洲日本少妇熟睡| 亚洲欧美激情一区二区| 欧美男生操女生| 国产一区二区网址| 综合久久久久久久| 欧美美女一区二区三区| 国产一区二区三区免费看 | 亚洲视频 欧洲视频| 欧美日韩国产综合一区二区三区| 久久国产精品第一页| 亚洲日本va午夜在线影院|