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

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

?? where.c

?? 新版輕量級嵌入式數據庫
?? C
?? 第 1 頁 / 共 5 頁
字號:
  SWAP(CollSeq*,pExpr->pRight->pColl,pExpr->pLeft->pColl);  SWAP(Expr*,pExpr->pRight,pExpr->pLeft);  if( pExpr->op>=TK_GT ){    assert( TK_LT==TK_GT+2 );    assert( TK_GE==TK_LE+2 );    assert( TK_GT>TK_EQ );    assert( TK_GT<TK_LE );    assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE );    pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT;  }}/*** Translate from TK_xx operator to WO_xx bitmask.*/static int operatorMask(int op){  int c;  assert( allowedOp(op) );  if( op==TK_IN ){    c = WO_IN;  }else{    c = WO_EQ<<(op-TK_EQ);  }  assert( op!=TK_IN || c==WO_IN );  assert( op!=TK_EQ || c==WO_EQ );  assert( op!=TK_LT || c==WO_LT );  assert( op!=TK_LE || c==WO_LE );  assert( op!=TK_GT || c==WO_GT );  assert( op!=TK_GE || c==WO_GE );  return c;}/*** Search for a term in the WHERE clause that is of the form "X <op> <expr>"** where X is a reference to the iColumn of table iCur and <op> is one of** the WO_xx operator codes specified by the op parameter.** Return a pointer to the term.  Return 0 if not found.*/static WhereTerm *findTerm(  WhereClause *pWC,     /* The WHERE clause to be searched */  int iCur,             /* Cursor number of LHS */  int iColumn,          /* Column number of LHS */  Bitmask notReady,     /* RHS must not overlap with this mask */  u16 op,               /* Mask of WO_xx values describing operator */  Index *pIdx           /* Must be compatible with this index, if not NULL */){  WhereTerm *pTerm;  int k;  for(pTerm=pWC->a, k=pWC->nTerm; k; k--, pTerm++){    if( pTerm->leftCursor==iCur       && (pTerm->prereqRight & notReady)==0       && pTerm->leftColumn==iColumn       && (pTerm->eOperator & op)!=0    ){      if( iCur>=0 && pIdx ){        Expr *pX = pTerm->pExpr;        CollSeq *pColl;        char idxaff;        int j;        Parse *pParse = pWC->pParse;        idxaff = pIdx->pTable->aCol[iColumn].affinity;        if( !sqlite3IndexAffinityOk(pX, idxaff) ) continue;        pColl = sqlite3ExprCollSeq(pParse, pX->pLeft);        if( !pColl ){          if( pX->pRight ){            pColl = sqlite3ExprCollSeq(pParse, pX->pRight);          }          if( !pColl ){            pColl = pParse->db->pDfltColl;          }        }        for(j=0; j<pIdx->nColumn && pIdx->aiColumn[j]!=iColumn; j++){}        assert( j<pIdx->nColumn );        if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue;      }      return pTerm;    }  }  return 0;}/* Forward reference */static void exprAnalyze(SrcList*, ExprMaskSet*, WhereClause*, int);/*** Call exprAnalyze on all terms in a WHERE clause.  *****/static void exprAnalyzeAll(  SrcList *pTabList,       /* the FROM clause */  ExprMaskSet *pMaskSet,   /* table masks */  WhereClause *pWC         /* the WHERE clause to be analyzed */){  int i;  for(i=pWC->nTerm-1; i>=0; i--){    exprAnalyze(pTabList, pMaskSet, pWC, i);  }}#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION/*** Check to see if the given expression is a LIKE or GLOB operator that** can be optimized using inequality constraints.  Return TRUE if it is** so and false if not.**** In order for the operator to be optimizible, the RHS must be a string** literal that does not begin with a wildcard.  */static int isLikeOrGlob(  sqlite3 *db,      /* The database */  Expr *pExpr,      /* Test this expression */  int *pnPattern,   /* Number of non-wildcard prefix characters */  int *pisComplete  /* True if the only wildcard is % in the last character */){  const char *z;  Expr *pRight, *pLeft;  ExprList *pList;  int c, cnt;  int noCase;  char wc[3];  CollSeq *pColl;  if( !sqlite3IsLikeFunction(db, pExpr, &noCase, wc) ){    return 0;  }  pList = pExpr->pList;  pRight = pList->a[0].pExpr;  if( pRight->op!=TK_STRING ){    return 0;  }  pLeft = pList->a[1].pExpr;  if( pLeft->op!=TK_COLUMN ){    return 0;  }  pColl = pLeft->pColl;  if( pColl==0 ){    pColl = db->pDfltColl;  }  if( (pColl->type!=SQLITE_COLL_BINARY || noCase) &&      (pColl->type!=SQLITE_COLL_NOCASE || !noCase) ){    return 0;  }  sqlite3DequoteExpr(pRight);  z = (char *)pRight->token.z;  for(cnt=0; (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2]; cnt++){}  if( cnt==0 || 255==(u8)z[cnt] ){    return 0;  }  *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0;  *pnPattern = cnt;  return 1;}#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION *//*** If the pBase expression originated in the ON or USING clause of** a join, then transfer the appropriate markings over to derived.*/static void transferJoinMarkings(Expr *pDerived, Expr *pBase){  pDerived->flags |= pBase->flags & EP_FromJoin;  pDerived->iRightJoinTable = pBase->iRightJoinTable;}/*** The input to this routine is an WhereTerm structure with only the** "pExpr" field filled in.  The job of this routine is to analyze the** subexpression and populate all the other fields of the WhereTerm** structure.**** If the expression is of the form "<expr> <op> X" it gets commuted** to the standard form of "X <op> <expr>".  If the expression is of** the form "X <op> Y" where both X and Y are columns, then the original** expression is unchanged and a new virtual expression of the form** "Y <op> X" is added to the WHERE clause and analyzed separately.*/static void exprAnalyze(  SrcList *pSrc,            /* the FROM clause */  ExprMaskSet *pMaskSet,    /* table masks */  WhereClause *pWC,         /* the WHERE clause */  int idxTerm               /* Index of the term to be analyzed */){  WhereTerm *pTerm = &pWC->a[idxTerm];  Expr *pExpr = pTerm->pExpr;  Bitmask prereqLeft;  Bitmask prereqAll;  int nPattern;  int isComplete;  if( sqlite3MallocFailed() ) return;  prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft);  if( pExpr->op==TK_IN ){    assert( pExpr->pRight==0 );    pTerm->prereqRight = exprListTableUsage(pMaskSet, pExpr->pList)                          | exprSelectTableUsage(pMaskSet, pExpr->pSelect);  }else{    pTerm->prereqRight = exprTableUsage(pMaskSet, pExpr->pRight);  }  prereqAll = exprTableUsage(pMaskSet, pExpr);  if( ExprHasProperty(pExpr, EP_FromJoin) ){    prereqAll |= getMask(pMaskSet, pExpr->iRightJoinTable);  }  pTerm->prereqAll = prereqAll;  pTerm->leftCursor = -1;  pTerm->iParent = -1;  pTerm->eOperator = 0;  if( allowedOp(pExpr->op) && (pTerm->prereqRight & prereqLeft)==0 ){    Expr *pLeft = pExpr->pLeft;    Expr *pRight = pExpr->pRight;    if( pLeft->op==TK_COLUMN ){      pTerm->leftCursor = pLeft->iTable;      pTerm->leftColumn = pLeft->iColumn;      pTerm->eOperator = operatorMask(pExpr->op);    }    if( pRight && pRight->op==TK_COLUMN ){      WhereTerm *pNew;      Expr *pDup;      if( pTerm->leftCursor>=0 ){        int idxNew;        pDup = sqlite3ExprDup(pExpr);        idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC);        if( idxNew==0 ) return;        pNew = &pWC->a[idxNew];        pNew->iParent = idxTerm;        pTerm = &pWC->a[idxTerm];        pTerm->nChild = 1;        pTerm->flags |= TERM_COPIED;      }else{        pDup = pExpr;        pNew = pTerm;      }      exprCommute(pDup);      pLeft = pDup->pLeft;      pNew->leftCursor = pLeft->iTable;      pNew->leftColumn = pLeft->iColumn;      pNew->prereqRight = prereqLeft;      pNew->prereqAll = prereqAll;      pNew->eOperator = operatorMask(pDup->op);    }  }#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION  /* If a term is the BETWEEN operator, create two new virtual terms  ** that define the range that the BETWEEN implements.  */  else if( pExpr->op==TK_BETWEEN ){    ExprList *pList = pExpr->pList;    int i;    static const u8 ops[] = {TK_GE, TK_LE};    assert( pList!=0 );    assert( pList->nExpr==2 );    for(i=0; i<2; i++){      Expr *pNewExpr;      int idxNew;      pNewExpr = sqlite3Expr(ops[i], sqlite3ExprDup(pExpr->pLeft),                             sqlite3ExprDup(pList->a[i].pExpr), 0);      idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);      exprAnalyze(pSrc, pMaskSet, pWC, idxNew);      pTerm = &pWC->a[idxTerm];      pWC->a[idxNew].iParent = idxTerm;    }    pTerm->nChild = 2;  }#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)  /* Attempt to convert OR-connected terms into an IN operator so that  ** they can make use of indices.  Example:  **  **      x = expr1  OR  expr2 = x  OR  x = expr3  **  ** is converted into  **  **      x IN (expr1,expr2,expr3)  **  ** This optimization must be omitted if OMIT_SUBQUERY is defined because  ** the compiler for the the IN operator is part of sub-queries.  */  else if( pExpr->op==TK_OR ){    int ok;    int i, j;    int iColumn, iCursor;    WhereClause sOr;    WhereTerm *pOrTerm;    assert( (pTerm->flags & TERM_DYNAMIC)==0 );    whereClauseInit(&sOr, pWC->pParse);    whereSplit(&sOr, pExpr, TK_OR);    exprAnalyzeAll(pSrc, pMaskSet, &sOr);    assert( sOr.nTerm>0 );    j = 0;    do{      iColumn = sOr.a[j].leftColumn;      iCursor = sOr.a[j].leftCursor;      ok = iCursor>=0;      for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0 && ok; i--, pOrTerm++){        if( pOrTerm->eOperator!=WO_EQ ){          goto or_not_possible;        }        if( pOrTerm->leftCursor==iCursor && pOrTerm->leftColumn==iColumn ){          pOrTerm->flags |= TERM_OR_OK;        }else if( (pOrTerm->flags & TERM_COPIED)!=0 ||                    ((pOrTerm->flags & TERM_VIRTUAL)!=0 &&                     (sOr.a[pOrTerm->iParent].flags & TERM_OR_OK)!=0) ){          pOrTerm->flags &= ~TERM_OR_OK;        }else{          ok = 0;        }      }    }while( !ok && (sOr.a[j++].flags & TERM_COPIED)!=0 && j<sOr.nTerm );    if( ok ){      ExprList *pList = 0;      Expr *pNew, *pDup;      for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0 && ok; i--, pOrTerm++){        if( (pOrTerm->flags & TERM_OR_OK)==0 ) continue;        pDup = sqlite3ExprDup(pOrTerm->pExpr->pRight);        pList = sqlite3ExprListAppend(pList, pDup, 0);      }      pDup = sqlite3Expr(TK_COLUMN, 0, 0, 0);      if( pDup ){        pDup->iTable = iCursor;        pDup->iColumn = iColumn;      }      pNew = sqlite3Expr(TK_IN, pDup, 0, 0);      if( pNew ){        int idxNew;        transferJoinMarkings(pNew, pExpr);        pNew->pList = pList;        idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);        exprAnalyze(pSrc, pMaskSet, pWC, idxNew);        pTerm = &pWC->a[idxTerm];        pWC->a[idxNew].iParent = idxTerm;        pTerm->nChild = 1;      }else{        sqlite3ExprListDelete(pList);      }    }or_not_possible:    whereClauseClear(&sOr);  }#endif /* SQLITE_OMIT_OR_OPTIMIZATION */#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION  /* Add constraints to reduce the search space on a LIKE or GLOB  ** operator.  */  if( isLikeOrGlob(pWC->pParse->db, pExpr, &nPattern, &isComplete) ){    Expr *pLeft, *pRight;    Expr *pStr1, *pStr2;    Expr *pNewExpr1, *pNewExpr2;    int idxNew1, idxNew2;    pLeft = pExpr->pList->a[1].pExpr;    pRight = pExpr->pList->a[0].pExpr;    pStr1 = sqlite3Expr(TK_STRING, 0, 0, 0);    if( pStr1 ){      sqlite3TokenCopy(&pStr1->token, &pRight->token);      pStr1->token.n = nPattern;    }    pStr2 = sqlite3ExprDup(pStr1);    if( pStr2 ){      assert( pStr2->token.dyn );      ++*(u8*)&pStr2->token.z[nPattern-1];    }    pNewExpr1 = sqlite3Expr(TK_GE, sqlite3ExprDup(pLeft), pStr1, 0);    idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩天堂在线观看| 91精品福利在线一区二区三区 | 91麻豆精品国产综合久久久久久| 琪琪久久久久日韩精品| 一色屋精品亚洲香蕉网站| 91精品国产综合久久久蜜臀粉嫩| 不卡一二三区首页| 久久精品国产亚洲aⅴ| 亚洲精品国产a久久久久久| 精品国产成人在线影院| 欧美午夜精品一区二区蜜桃 | 91麻豆高清视频| 国产精品综合在线视频| 天堂在线一区二区| 亚洲卡通欧美制服中文| 国产午夜精品福利| 日韩限制级电影在线观看| 欧洲av在线精品| av亚洲精华国产精华精| 国产麻豆日韩欧美久久| 青娱乐精品视频在线| 亚洲精品水蜜桃| 最新日韩在线视频| 国产精品视频一二三区| 国产欧美一区二区精品久导航| 欧美一区二区福利在线| 欧美三级电影在线观看| 在线视频观看一区| 色综合欧美在线视频区| 成人高清av在线| 懂色av一区二区三区蜜臀| 久久se这里有精品| 麻豆专区一区二区三区四区五区| 爽爽淫人综合网网站| 亚州成人在线电影| 亚洲第一成年网| 亚洲444eee在线观看| 亚洲一区二区三区小说| 一区二区三区久久久| 亚洲色图清纯唯美| 亚洲美女电影在线| 亚洲激情一二三区| 亚洲va欧美va天堂v国产综合| 一级做a爱片久久| 亚洲综合色婷婷| 婷婷六月综合网| 日本亚洲天堂网| 激情亚洲综合在线| 国产精品一区2区| av在线播放成人| 日本韩国精品在线| 欧美日韩在线综合| 7777女厕盗摄久久久| 日韩一区二区三区在线| 久久综合色播五月| 一色桃子久久精品亚洲| 亚洲乱码国产乱码精品精小说 | 亚洲风情在线资源站| 日韩经典中文字幕一区| 国产成人欧美日韩在线电影| 精品一区二区成人精品| 成人免费毛片a| 91亚洲精华国产精华精华液| 欧美日韩国产首页| 日韩欧美卡一卡二| 国产三级一区二区三区| 亚洲男同性视频| 免费美女久久99| 成人一级黄色片| 日本久久一区二区| 欧美日韩精品一区二区三区 | 黑人巨大精品欧美黑白配亚洲| 国产成人免费视频一区| 欧美网站大全在线观看| 国产一区在线精品| 97se亚洲国产综合在线| 欧美日韩国产首页| 精品剧情v国产在线观看在线| 国产欧美一区二区精品忘忧草 | 免费日韩伦理电影| 成人午夜电影久久影院| 欧美亚洲日本一区| 久久久久国产精品厨房| 亚洲一区二区在线观看视频| 激情欧美一区二区| 在线视频国内自拍亚洲视频| 精品国产a毛片| 亚洲一区在线看| 懂色av中文一区二区三区 | 亚洲精品一区二区在线观看| 亚洲同性gay激情无套| 麻豆国产一区二区| 91国偷自产一区二区开放时间 | 高清在线观看日韩| 欧美三级电影精品| 亚洲国产高清在线| 日本va欧美va精品| 91黄色免费看| 国产精品欧美一级免费| 蜜臀久久99精品久久久久宅男| 99免费精品在线观看| 精品国产乱码久久久久久浪潮 | 亚洲成人av一区二区| 岛国精品在线播放| 欧美成人vps| 亚洲香肠在线观看| 99久久精品国产精品久久| 久久亚洲捆绑美女| 日韩不卡一二三区| 精品视频999| 中文字幕在线不卡| 国产jizzjizz一区二区| 欧美一区二区三区视频免费 | 亚洲高清不卡在线观看| 不卡免费追剧大全电视剧网站| 欧美xxxxx牲另类人与| 亚洲午夜国产一区99re久久| 91香蕉视频污在线| 中文字幕一区在线观看视频| 国产精品一区二区久激情瑜伽| 日韩欧美精品在线视频| 亚洲国产日韩av| 欧美性一二三区| 亚洲精品中文字幕乱码三区 | 欧美日韩色综合| 亚洲老妇xxxxxx| 一本大道久久a久久精二百| 欧美国产成人在线| 成人午夜精品在线| 一区二区视频在线看| 成人爽a毛片一区二区免费| 国产日韩综合av| 国产成人精品免费视频网站| 久久综合色一综合色88| 国产美女av一区二区三区| 欧美精品一区二区三区在线播放| 久久成人羞羞网站| 日韩三级伦理片妻子的秘密按摩| 蜜臀av一级做a爰片久久| 91精品国产91久久久久久一区二区| 日韩成人午夜精品| 日韩美一区二区三区| 国产一区在线观看麻豆| 国产欧美日韩不卡免费| 成人高清伦理免费影院在线观看| 中文字幕一区日韩精品欧美| 99精品欧美一区| 亚洲午夜一区二区三区| 欧美精品色一区二区三区| 日本欧美韩国一区三区| 精品福利一区二区三区免费视频| 国产一区二区三区不卡在线观看| 中文文精品字幕一区二区| www.日韩av| 亚洲一区二区免费视频| 678五月天丁香亚洲综合网| 麻豆视频观看网址久久| 久久久国际精品| 91蜜桃婷婷狠狠久久综合9色| 亚洲欧美另类小说视频| 欧美在线不卡视频| 蜜臀久久久久久久| 国产午夜精品福利| 91福利在线导航| 蜜臀久久久久久久| 国产欧美日韩视频一区二区| 色偷偷一区二区三区| 婷婷中文字幕综合| 国产拍揄自揄精品视频麻豆| 91国在线观看| 国内偷窥港台综合视频在线播放| 亚洲欧洲精品天堂一级| 555www色欧美视频| 不卡的电视剧免费网站有什么| 亚洲国产欧美在线人成| 久久久久九九视频| 欧美三片在线视频观看| 国产精品乡下勾搭老头1| 伊人夜夜躁av伊人久久| 久久综合九色综合久久久精品综合 | 亚洲第一精品在线| 久久精品在这里| 欧美亚洲动漫制服丝袜| 国产精品一区在线观看乱码| 亚洲精品成人悠悠色影视| 精品粉嫩aⅴ一区二区三区四区| 色欧美片视频在线观看在线视频| 日韩av中文在线观看| 亚洲在线视频一区| 久久久综合视频| 欧美日韩一区二区欧美激情| 成人亚洲一区二区一| 三级影片在线观看欧美日韩一区二区 | 中文字幕一区二区在线播放| 日韩丝袜情趣美女图片| 在线观看中文字幕不卡| 粉嫩13p一区二区三区| 免费人成在线不卡| 亚洲国产综合人成综合网站| 一区在线观看视频|