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

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

?? where.c

?? Trolltech公司發布的基于C++圖形開發環境
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*** 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 module contains C code that generates VDBE code used to process** the WHERE clause of SQL statements.**** $Id: qt/where.c   3.3.4   edited Mar 30 2004 $*/#include "sqliteInt.h"/*** The query generator uses an array of instances of this structure to** help it analyze the subexpressions of the WHERE clause.  Each WHERE** clause subexpression is separated from the others by an AND operator.*/typedef struct ExprInfo ExprInfo;struct ExprInfo {  Expr *p;                /* Pointer to the subexpression */  u8 indexable;           /* True if this subexprssion is usable by an index */  short int idxLeft;      /* p->pLeft is a column in this table number. -1 if                          ** p->pLeft is not the column of any table */  short int idxRight;     /* p->pRight is a column in this table number. -1 if                          ** p->pRight is not the column of any table */  unsigned prereqLeft;    /* Bitmask of tables referenced by p->pLeft */  unsigned prereqRight;   /* Bitmask of tables referenced by p->pRight */  unsigned prereqAll;     /* Bitmask of tables referenced by p */};/*** An instance of the following structure keeps track of a mapping** between VDBE cursor numbers and bitmasks.  The VDBE cursor numbers** are small integers contained in SrcList_item.iCursor and Expr.iTable** fields.  For any given WHERE clause, we want to track which cursors** are being used, so we assign a single bit in a 32-bit word to track** that cursor.  Then a 32-bit integer is able to show the set of all** cursors being used.*/typedef struct ExprMaskSet ExprMaskSet;struct ExprMaskSet {  int n;          /* Number of assigned cursor values */  int ix[32];     /* Cursor assigned to each bit */};/*** Determine the number of elements in an array.*/#define ARRAYSIZE(X)  (sizeof(X)/sizeof(X[0]))/*** This routine is used to divide the WHERE expression into subexpressions** separated by the AND operator.**** aSlot[] is an array of subexpressions structures.** There are nSlot spaces left in this array.  This routine attempts to** split pExpr into subexpressions and fills aSlot[] with those subexpressions.** The return value is the number of slots filled.*/static int exprSplit(int nSlot, ExprInfo *aSlot, Expr *pExpr){  int cnt = 0;  if( pExpr==0 || nSlot<1 ) return 0;  if( nSlot==1 || pExpr->op!=TK_AND ){    aSlot[0].p = pExpr;    return 1;  }  if( pExpr->pLeft->op!=TK_AND ){    aSlot[0].p = pExpr->pLeft;    cnt = 1 + exprSplit(nSlot-1, &aSlot[1], pExpr->pRight);  }else{    cnt = exprSplit(nSlot, aSlot, pExpr->pLeft);    cnt += exprSplit(nSlot-cnt, &aSlot[cnt], pExpr->pRight);  }  return cnt;}/*** Initialize an expression mask set*/#define initMaskSet(P)  memset(P, 0, sizeof(*P))/*** Return the bitmask for the given cursor.  Assign a new bitmask** if this is the first time the cursor has been seen.*/static int getMask(ExprMaskSet *pMaskSet, int iCursor){  int i;  for(i=0; i<pMaskSet->n; i++){    if( pMaskSet->ix[i]==iCursor ) return 1<<i;  }  if( i==pMaskSet->n && i<ARRAYSIZE(pMaskSet->ix) ){    pMaskSet->n++;    pMaskSet->ix[i] = iCursor;    return 1<<i;  }  return 0;}/*** Destroy an expression mask set*/#define freeMaskSet(P)   /* NO-OP *//*** This routine walks (recursively) an expression tree and generates** a bitmask indicating which tables are used in that expression** tree.**** In order for this routine to work, the calling function must have** previously invoked sqliteExprResolveIds() on the expression.  See** the header comment on that routine for additional information.** The sqliteExprResolveIds() routines looks for column names and** sets their opcodes to TK_COLUMN and their Expr.iTable fields to** the VDBE cursor number of the table.*/static int exprTableUsage(ExprMaskSet *pMaskSet, Expr *p){  unsigned int mask = 0;  if( p==0 ) return 0;  if( p->op==TK_COLUMN ){    return getMask(pMaskSet, p->iTable);  }  if( p->pRight ){    mask = exprTableUsage(pMaskSet, p->pRight);  }  if( p->pLeft ){    mask |= exprTableUsage(pMaskSet, p->pLeft);  }  if( p->pList ){    int i;    for(i=0; i<p->pList->nExpr; i++){      mask |= exprTableUsage(pMaskSet, p->pList->a[i].pExpr);    }  }  return mask;}/*** Return TRUE if the given operator is one of the operators that is** allowed for an indexable WHERE clause.  The allowed operators are** "=", "<", ">", "<=", ">=", and "IN".*/static int allowedOp(int op){  switch( op ){    case TK_LT:    case TK_LE:    case TK_GT:    case TK_GE:    case TK_EQ:    case TK_IN:      return 1;    default:      return 0;  }}/*** The input to this routine is an ExprInfo structure with only the** "p" field filled in.  The job of this routine is to analyze the** subexpression and populate all the other fields of the ExprInfo** structure.*/static void exprAnalyze(ExprMaskSet *pMaskSet, ExprInfo *pInfo){  Expr *pExpr = pInfo->p;  pInfo->prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft);  pInfo->prereqRight = exprTableUsage(pMaskSet, pExpr->pRight);  pInfo->prereqAll = exprTableUsage(pMaskSet, pExpr);  pInfo->indexable = 0;  pInfo->idxLeft = -1;  pInfo->idxRight = -1;  if( allowedOp(pExpr->op) && (pInfo->prereqRight & pInfo->prereqLeft)==0 ){    if( pExpr->pRight && pExpr->pRight->op==TK_COLUMN ){      pInfo->idxRight = pExpr->pRight->iTable;      pInfo->indexable = 1;    }    if( pExpr->pLeft->op==TK_COLUMN ){      pInfo->idxLeft = pExpr->pLeft->iTable;      pInfo->indexable = 1;    }  }}/*** pOrderBy is an ORDER BY clause from a SELECT statement.  pTab is the** left-most table in the FROM clause of that same SELECT statement and** the table has a cursor number of "base".**** This routine attempts to find an index for pTab that generates the** correct record sequence for the given ORDER BY clause.  The return value** is a pointer to an index that does the job.  NULL is returned if the** table has no index that will generate the correct sort order.**** If there are two or more indices that generate the correct sort order** and pPreferredIdx is one of those indices, then return pPreferredIdx.**** nEqCol is the number of columns of pPreferredIdx that are used as** equality constraints.  Any index returned must have exactly this same** set of columns.  The ORDER BY clause only matches index columns beyond the** the first nEqCol columns.**** All terms of the ORDER BY clause must be either ASC or DESC.  The** *pbRev value is set to 1 if the ORDER BY clause is all DESC and it is** set to 0 if the ORDER BY clause is all ASC.*/static Index *findSortingIndex(  Table *pTab,            /* The table to be sorted */  int base,               /* Cursor number for pTab */  ExprList *pOrderBy,     /* The ORDER BY clause */  Index *pPreferredIdx,   /* Use this index, if possible and not NULL */  int nEqCol,             /* Number of index columns used with == constraints */  int *pbRev              /* Set to 1 if ORDER BY is DESC */){  int i, j;  Index *pMatch;  Index *pIdx;  int sortOrder;  assert( pOrderBy!=0 );  assert( pOrderBy->nExpr>0 );  sortOrder = pOrderBy->a[0].sortOrder & SQLITE_SO_DIRMASK;  for(i=0; i<pOrderBy->nExpr; i++){    Expr *p;    if( (pOrderBy->a[i].sortOrder & SQLITE_SO_DIRMASK)!=sortOrder ){      /* Indices can only be used if all ORDER BY terms are either      ** DESC or ASC.  Indices cannot be used on a mixture. */      return 0;    }    if( (pOrderBy->a[i].sortOrder & SQLITE_SO_TYPEMASK)!=SQLITE_SO_UNK ){      /* Do not sort by index if there is a COLLATE clause */      return 0;    }    p = pOrderBy->a[i].pExpr;    if( p->op!=TK_COLUMN || p->iTable!=base ){      /* Can not use an index sort on anything that is not a column in the      ** left-most table of the FROM clause */      return 0;    }  }    /* If we get this far, it means the ORDER BY clause consists only of  ** ascending columns in the left-most table of the FROM clause.  Now  ** check for a matching index.  */  pMatch = 0;  for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){    int nExpr = pOrderBy->nExpr;    if( pIdx->nColumn < nEqCol || pIdx->nColumn < nExpr ) continue;    for(i=j=0; i<nEqCol; i++){      if( pPreferredIdx->aiColumn[i]!=pIdx->aiColumn[i] ) break;      if( j<nExpr && pOrderBy->a[j].pExpr->iColumn==pIdx->aiColumn[i] ){ j++; }    }    if( i<nEqCol ) continue;    for(i=0; i+j<nExpr; i++){      if( pOrderBy->a[i+j].pExpr->iColumn!=pIdx->aiColumn[i+nEqCol] ) break;    }    if( i+j>=nExpr ){      pMatch = pIdx;      if( pIdx==pPreferredIdx ) break;    }  }  if( pMatch && pbRev ){    *pbRev = sortOrder==SQLITE_SO_DESC;  }  return pMatch;}/*** Generate the beginning of the loop used for WHERE clause processing.** The return value is a pointer to an (opaque) structure that contains** information needed to terminate the loop.  Later, the calling routine** should invoke sqliteWhereEnd() with the return value of this function** in order to complete the WHERE clause processing.**** If an error occurs, this routine returns NULL.**** The basic idea is to do a nested loop, one loop for each table in** the FROM clause of a select.  (INSERT and UPDATE statements are the** same as a SELECT with only a single table in the FROM clause.)  For** example, if the SQL is this:****       SELECT * FROM t1, t2, t3 WHERE ...;**** Then the code generated is conceptually like the following:****      foreach row1 in t1 do       \    Code generated**        foreach row2 in t2 do      |-- by sqliteWhereBegin()**          foreach row3 in t3 do   /**            ...**          end                     \    Code generated**        end                        |-- by sqliteWhereEnd()**      end                         /**** There are Btree cursors associated with each table.  t1 uses cursor** number pTabList->a[0].iCursor.  t2 uses the cursor pTabList->a[1].iCursor.** And so forth.  This routine generates code to open those VDBE cursors** and sqliteWhereEnd() generates the code to close them.**** If the WHERE clause is empty, the foreach loops must each scan their** entire tables.  Thus a three-way join is an O(N^3) operation.  But if** the tables have indices and there are terms in the WHERE clause that** refer to those indices, a complete table scan can be avoided and the** code will run much faster.  Most of the work of this routine is checking** to see if there are indices that can be used to speed up the loop.**** Terms of the WHERE clause are also used to limit which rows actually** make it to the "..." in the middle of the loop.  After each "foreach",** terms of the WHERE clause that use only terms in that loop and outer** loops are evaluated and if false a jump is made around all subsequent** inner loops (or around the "..." if the test occurs within the inner-** most loop)**** OUTER JOINS**** An outer join of tables t1 and t2 is conceptally coded as follows:****    foreach row1 in t1 do**      flag = 0**      foreach row2 in t2 do**        start:**          ...**          flag = 1**      end**      if flag==0 then**        move the row2 cursor to a null row**        goto start**      fi**    end**** ORDER BY CLAUSE PROCESSING**** *ppOrderBy is a pointer to the ORDER BY clause of a SELECT statement,** if there is one.  If there is no ORDER BY clause or if this routine** is called from an UPDATE or DELETE statement, then ppOrderBy is NULL.**** If an index can be used so that the natural output order of the table** scan is correct for the ORDER BY clause, then that index is used and** *ppOrderBy is set to NULL.  This is an optimization that prevents an** unnecessary sort of the result set if an index appropriate for the** ORDER BY clause already exists.**** If the where clause loops cannot be arranged to provide the correct** output order, then the *ppOrderBy is unchanged.*/WhereInfo *sqliteWhereBegin(  Parse *pParse,       /* The parser context */  SrcList *pTabList,   /* A list of all tables to be scanned */  Expr *pWhere,        /* The WHERE clause */  int pushKey,         /* If TRUE, leave the table key on the stack */  ExprList **ppOrderBy /* An ORDER BY clause, or NULL */){  int i;                     /* Loop counter */  WhereInfo *pWInfo;         /* Will become the return value of this function */  Vdbe *v = pParse->pVdbe;   /* The virtual database engine */  int brk, cont = 0;         /* Addresses used during code generation */  int nExpr;           /* Number of subexpressions in the WHERE clause */  int loopMask;        /* One bit set for each outer loop */  int haveKey;         /* True if KEY is on the stack */  ExprMaskSet maskSet; /* The expression mask set */  int iDirectEq[32];   /* Term of the form ROWID==X for the N-th table */  int iDirectLt[32];   /* Term of the form ROWID<X or ROWID<=X */  int iDirectGt[32];   /* Term of the form ROWID>X or ROWID>=X */  ExprInfo aExpr[101]; /* The WHERE clause is divided into these expressions */  /* pushKey is only allowed if there is a single table (as in an INSERT or  ** UPDATE statement)  */  assert( pushKey==0 || pTabList->nSrc==1 );  /* Split the WHERE clause into separate subexpressions where each  ** subexpression is separated by an AND operator.  If the aExpr[]  ** array fills up, the last entry might point to an expression which  ** contains additional unfactored AND operators.  */  initMaskSet(&maskSet);  memset(aExpr, 0, sizeof(aExpr));  nExpr = exprSplit(ARRAYSIZE(aExpr), aExpr, pWhere);  if( nExpr==ARRAYSIZE(aExpr) ){    sqliteErrorMsg(pParse, "WHERE clause too complex - no more "       "than %d terms allowed", (int)ARRAYSIZE(aExpr)-1);    return 0;  }    /* Allocate and initialize the WhereInfo structure that will become the  ** return value.  */  pWInfo = sqliteMalloc( sizeof(WhereInfo) + pTabList->nSrc*sizeof(WhereLevel));  if( sqlite_malloc_failed ){    sqliteFree(pWInfo);    return 0;  }  pWInfo->pParse = pParse;  pWInfo->pTabList = pTabList;  pWInfo->peakNTab = pWInfo->savedNTab = pParse->nTab;  pWInfo->iBreak = sqliteVdbeMakeLabel(v);  /* Special case: a WHERE clause that is constant.  Evaluate the  ** expression and either jump over all of the code or fall thru.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一二三四区| 国产精品久99| 麻豆成人91精品二区三区| 9191国产精品| 蜜桃视频在线观看一区二区| 欧美一区二区美女| 久久精品二区亚洲w码| 久久久久久亚洲综合影院红桃 | 日韩欧美一区二区不卡| 日韩国产精品91| 欧美一区二区三区在线观看| 乱一区二区av| 欧美激情综合五月色丁香小说| 成人午夜免费av| 亚洲一区二区三区视频在线播放 | 欧美老肥妇做.爰bbww| 视频一区二区三区入口| 精品嫩草影院久久| 国产成人免费高清| 一区二区不卡在线播放| 91精品麻豆日日躁夜夜躁| 久久av老司机精品网站导航| 国产视频在线观看一区二区三区| 99v久久综合狠狠综合久久| 亚洲一区二区3| 久久综合久色欧美综合狠狠| 99国产精品久久| 蜜臀av在线播放一区二区三区 | 欧美日韩高清一区二区三区| 麻豆精品一二三| 18欧美乱大交hd1984| 91精品久久久久久蜜臀| 99久久国产综合精品女不卡| 蜜桃视频一区二区三区| 日韩理论在线观看| 精品免费日韩av| 日本道色综合久久| 国产一区二区剧情av在线| 亚洲午夜影视影院在线观看| 国产日产精品1区| 欧美一级黄色片| 91丨porny丨蝌蚪视频| 久久99国产乱子伦精品免费| 亚洲精品视频在线| 中文字幕高清不卡| 欧美大肚乱孕交hd孕妇| 91成人免费电影| 成人av综合一区| 韩国v欧美v日本v亚洲v| 午夜欧美在线一二页| 日韩美女啊v在线免费观看| 精品国产乱码久久久久久老虎 | 日韩情涩欧美日韩视频| 91片在线免费观看| 成人综合在线观看| 极品少妇xxxx精品少妇偷拍| 日韩国产一二三区| 亚洲成av人在线观看| 亚洲视频一二区| 国产情人综合久久777777| 91精品一区二区三区久久久久久| 91浏览器打开| 99综合影院在线| 国产高清视频一区| 国产精品69久久久久水密桃| 麻豆国产精品视频| 日本不卡免费在线视频| 亚洲第一成人在线| 亚洲在线一区二区三区| 亚洲乱码精品一二三四区日韩在线| 亚洲国产精品激情在线观看 | 国产精品麻豆网站| 国产欧美精品区一区二区三区 | 毛片一区二区三区| 日韩av在线播放中文字幕| 亚洲国产日韩精品| 亚洲午夜免费福利视频| 亚洲尤物在线视频观看| 亚洲二区在线观看| 亚洲18女电影在线观看| 性欧美疯狂xxxxbbbb| 亚洲成a人v欧美综合天堂| 亚洲大型综合色站| 青青草91视频| 六月丁香综合在线视频| 狠狠网亚洲精品| 成人一级黄色片| av成人免费在线观看| 色香色香欲天天天影视综合网| 91黄视频在线| 欧美日韩一二区| 欧美一区二区视频在线观看| 日韩视频在线一区二区| 国产亚洲自拍一区| 中文字幕亚洲精品在线观看| 亚洲激情图片小说视频| 午夜精品在线视频一区| 日本成人在线视频网站| 国产一区视频网站| 波多野结衣在线一区| 在线视频综合导航| 日韩欧美成人一区| 欧美极品xxx| 亚洲一区影音先锋| 美女尤物国产一区| 成人黄色综合网站| 欧洲精品在线观看| 日韩一区二区三区av| 国产日韩欧美精品电影三级在线| 中文字幕在线观看一区二区| 亚洲无人区一区| 国产一区二区精品久久91| 91麻豆成人久久精品二区三区| 欧美绝品在线观看成人午夜影视 | 欧美国产乱子伦 | 在线不卡中文字幕| 久久久久国产精品免费免费搜索 | 亚洲一区二区三区爽爽爽爽爽| 久久精品国产网站| 色又黄又爽网站www久久| 欧美一区二区播放| 日韩一区中文字幕| 久久精品国产精品亚洲红杏| 97aⅴ精品视频一二三区| 欧美一级免费大片| 一区二区三区不卡视频| 国产精品资源在线看| 欧美日韩一区久久| 欧美韩日一区二区三区| 午夜亚洲国产au精品一区二区| 国产成人精品综合在线观看 | 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲国产一区在线观看| 国产91露脸合集magnet| 69堂国产成人免费视频| 亚洲日本va午夜在线影院| 精品一区二区国语对白| 欧美色国产精品| 国产精品网站在线| 精品一区二区影视| 制服丝袜中文字幕一区| 亚洲黄色av一区| 波多野结衣中文字幕一区| 久久青草欧美一区二区三区| 日韩中文字幕av电影| 日本高清无吗v一区| 国产精品黄色在线观看| 国内精品在线播放| 日韩一级片网址| 亚洲国产日日夜夜| 91国在线观看| 综合久久久久久| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 色综合久久99| 中文字幕欧美三区| 国内久久精品视频| 精品欧美乱码久久久久久| 偷窥国产亚洲免费视频| 在线看不卡av| 亚洲精品五月天| 色94色欧美sute亚洲线路一ni| 国产欧美日韩在线看| 国产成人h网站| 国产亚洲精品免费| 国产成人精品一区二区三区四区 | 精品中文字幕一区二区小辣椒 | 久久综合九色欧美综合狠狠| 日本特黄久久久高潮| 911精品国产一区二区在线| 天天综合色天天综合色h| 欧美日韩中文字幕一区二区| 亚洲狠狠丁香婷婷综合久久久| 色综合久久99| 一区二区三区蜜桃| 欧美视频日韩视频| 亚洲福利视频导航| 制服丝袜亚洲色图| 麻豆成人av在线| 久久久久久综合| voyeur盗摄精品| 亚洲午夜av在线| 日韩午夜小视频| 国产精品一区二区久久不卡| 国产视频视频一区| 99视频一区二区| 午夜影视日本亚洲欧洲精品| 欧美一区二区日韩| 国产不卡在线播放| 亚洲色图在线看| 欧美精品在线观看播放| 国产综合一区二区| 1024精品合集| 欧美视频三区在线播放| 久久精品国产99国产精品| 国产欧美日韩不卡| 日本丰满少妇一区二区三区| 午夜电影网一区| 国产亚洲精品aa| 欧美在线综合视频| 久久精品久久综合|