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

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

?? select.c

?? Trolltech公司發布的基于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: qt/select.c   3.3.4   edited Mar 30 2004 $*/#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);}/*** This routine generates the code for the inside of the inner loop** of a SELECT.**** If srcTab and nColumn are both zero, then the pEList expressions** are evaluated in order to get the data for this row.  If nColumn>0** then data is pulled from srcTab and pEList is used only to get the** datatypes for each column.*/static int selectInnerLoop(  Parse *pParse,          /* The parser context */  Select *p,              /* The complete select statement being coded */  ExprList *pEList,       /* List of values being extracted */  int srcTab,             /* Pull data from this table */  int nColumn,            /* Number of columns in the source table */  ExprList *pOrderBy,     /* If not NULL, sort results using this key */  int distinct,           /* If >=0, make sure results are distinct */  int eDest,              /* How to dispose of the results */  int iParm,              /* An argument to the disposal method */  int iContinue,          /* Jump here to continue with next row */  int iBreak              /* Jump here to break out of the inner loop */){  Vdbe *v = pParse->pVdbe;  int i;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品91自产拍在线观看一区| 91麻豆免费看片| 日韩av中文字幕一区二区三区| 国产精品久久久久久久久晋中 | 欧美一级精品大片| 欧美午夜精品久久久| 日本韩国一区二区三区视频| 不卡大黄网站免费看| 97se亚洲国产综合在线| 99久久综合色| 欧美色精品天天在线观看视频| 日本黄色一区二区| 91精品在线观看入口| 制服丝袜av成人在线看| 91精品国产一区二区三区香蕉| 欧美日韩aaaaa| 91精品黄色片免费大全| 欧美sm美女调教| 中文字幕国产一区| 亚洲综合一区二区三区| 五月激情综合网| 国内欧美视频一区二区| 成人黄色网址在线观看| 日本高清不卡aⅴ免费网站| 欧美日韩日日摸| 精品日韩在线一区| 自拍偷拍欧美激情| 午夜久久福利影院| 国产精品白丝av| 欧美日韩一区精品| 国产亚洲美州欧州综合国| 国产精品美女久久久久久久 | 日本午夜精品一区二区三区电影| 开心九九激情九九欧美日韩精美视频电影 | 韩国理伦片一区二区三区在线播放| 高清在线成人网| 欧美视频一区二区三区| 久久久一区二区三区捆绑**| 国产精品久久久久久久蜜臀| 日本大胆欧美人术艺术动态| 成人国产亚洲欧美成人综合网| 欧美精品vⅰdeose4hd| 久久综合九色综合欧美亚洲| 亚洲精选视频在线| 国产suv精品一区二区6| 欧美一级精品在线| 一个色妞综合视频在线观看| 国产一区三区三区| 日韩一区二区三区在线| 亚洲蜜臀av乱码久久精品| 国产精品中文字幕日韩精品| 欧美精品第1页| 亚洲精品ww久久久久久p站| 麻豆91在线看| 欧美一级黄色录像| 五月婷婷综合网| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 热久久国产精品| 欧美午夜精品久久久久久孕妇| 国产女人18毛片水真多成人如厕| 蜜臀久久99精品久久久久宅男 | 毛片基地黄久久久久久天堂| 色88888久久久久久影院野外| 国产三级精品在线| 极品瑜伽女神91| 欧美videossexotv100| 婷婷中文字幕一区三区| 欧美网站大全在线观看| 一区二区在线免费观看| av日韩在线网站| 国产精品久久久久9999吃药| 成人深夜福利app| 欧美国产1区2区| 岛国精品一区二区| 久久色在线视频| 国产成人免费高清| 久久久美女毛片| 成人高清免费观看| 国产精品久久久久久久久晋中| 成人看片黄a免费看在线| 国产精品乱码一区二区三区软件 | 久久综合资源网| 国产精品亚洲第一| 国产精品久久久久永久免费观看 | 国产日韩在线不卡| 成人小视频免费观看| 中文字幕欧美激情一区| 99国产精品久久| 亚洲国产精品人人做人人爽| 欧美猛男超大videosgay| 日韩和的一区二区| www国产成人| 波多野结衣视频一区| 国产精品乱码一区二三区小蝌蚪| 91麻豆视频网站| 亚洲成人av资源| 久久一留热品黄| 波多野洁衣一区| 丝袜国产日韩另类美女| 精品欧美一区二区三区精品久久| 国产福利精品一区二区| 一区二区三区在线视频观看| 欧美一区二区美女| 国产精品亚洲午夜一区二区三区 | 欧美日韩精品三区| 国产一区日韩二区欧美三区| 国产精品女主播av| 欧美日本国产视频| 久久99在线观看| 亚洲免费观看在线视频| 337p亚洲精品色噜噜噜| 国产69精品久久99不卡| 日韩精品五月天| 中文字幕乱码久久午夜不卡 | 奇米色一区二区| 成人免费在线播放视频| 欧美日本一区二区在线观看| 蜜臀av一级做a爰片久久| 中文字幕一区二区三区av| 7777精品伊人久久久大香线蕉的| 国产精品自在在线| 爽好多水快深点欧美视频| 久久久久久久免费视频了| 欧美中文字幕不卡| 99视频精品在线| 精品一区二区三区视频| 亚洲人xxxx| 欧美激情一区在线| 日韩欧美国产综合| 欧美日韩精品一区二区三区四区| 风流少妇一区二区| 国产综合色产在线精品| 一区二区日韩电影| 国产精品久久久久久亚洲伦| 久久久久免费观看| 精品日韩在线一区| 777xxx欧美| 欧美日韩三级在线| 91久久精品网| 91久久久免费一区二区| 成人免费观看男女羞羞视频| 九色porny丨国产精品| 日韩福利视频导航| 亚洲一区二区三区视频在线| 亚洲欧洲三级电影| 中文字幕中文字幕一区| 久久精品免视看| 久久亚区不卡日本| 久久精品视频一区二区三区| 欧美第一区第二区| 精品人伦一区二区色婷婷| 日韩午夜在线播放| 日韩视频一区在线观看| 日韩精品在线看片z| 日韩一级黄色大片| 精品国产免费人成在线观看| 日韩一级高清毛片| 久久久久久久久久久黄色| 精品日产卡一卡二卡麻豆| 精品国产一区二区三区久久影院| 精品久久久久久久人人人人传媒 | 国产精品久久久久婷婷| 26uuu精品一区二区| 久久久久久久久久久99999| 国产亚洲精品超碰| 国产欧美视频一区二区| 综合色中文字幕| 偷窥少妇高潮呻吟av久久免费| 日韩不卡一区二区三区| 精品一区二区三区欧美| 国产一区在线视频| 成人精品鲁一区一区二区| 97国产一区二区| 91精品黄色片免费大全| 久久久99免费| 一区二区三区在线播放| 日韩精品三区四区| 国产成人一区在线| 91国偷自产一区二区开放时间 | 99国产欧美久久久精品| 欧美色精品天天在线观看视频| 日韩欧美你懂的| 日本一区二区三区视频视频| 亚洲乱码一区二区三区在线观看| 五月激情综合网| 成人免费视频一区二区| 欧美日韩在线一区二区| 久久综合久久综合亚洲| 亚洲精品免费在线观看| 热久久国产精品| 成人激情动漫在线观看| 欧美狂野另类xxxxoooo| 欧美激情一区在线| 人禽交欧美网站| 不卡一区二区在线| 欧美人与z0zoxxxx视频| 成人免费在线视频| 亚洲国产cao| 欧洲色大大久久| 国内成人免费视频|