Annotation of embedaddon/php/ext/sqlite/libsqlite/src/expr.c, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2001 September 15
        !             3: **
        !             4: ** The author disclaims copyright to this source code.  In place of
        !             5: ** a legal notice, here is a blessing:
        !             6: **
        !             7: **    May you do good and not evil.
        !             8: **    May you find forgiveness for yourself and forgive others.
        !             9: **    May you share freely, never taking more than you give.
        !            10: **
        !            11: *************************************************************************
        !            12: ** This file contains routines used for analyzing expressions and
        !            13: ** for generating VDBE code that evaluates expressions in SQLite.
        !            14: **
        !            15: ** $Id: expr.c 195361 2005-09-07 15:11:33Z iliaa $
        !            16: */
        !            17: #include "sqliteInt.h"
        !            18: #include <ctype.h>
        !            19: 
        !            20: /*
        !            21: ** Construct a new expression node and return a pointer to it.  Memory
        !            22: ** for this node is obtained from sqliteMalloc().  The calling function
        !            23: ** is responsible for making sure the node eventually gets freed.
        !            24: */
        !            25: Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
        !            26:   Expr *pNew;
        !            27:   pNew = sqliteMalloc( sizeof(Expr) );
        !            28:   if( pNew==0 ){
        !            29:     /* When malloc fails, we leak memory from pLeft and pRight */
        !            30:     return 0;
        !            31:   }
        !            32:   pNew->op = op;
        !            33:   pNew->pLeft = pLeft;
        !            34:   pNew->pRight = pRight;
        !            35:   if( pToken ){
        !            36:     assert( pToken->dyn==0 );
        !            37:     pNew->token = *pToken;
        !            38:     pNew->span = *pToken;
        !            39:   }else{
        !            40:     assert( pNew->token.dyn==0 );
        !            41:     assert( pNew->token.z==0 );
        !            42:     assert( pNew->token.n==0 );
        !            43:     if( pLeft && pRight ){
        !            44:       sqliteExprSpan(pNew, &pLeft->span, &pRight->span);
        !            45:     }else{
        !            46:       pNew->span = pNew->token;
        !            47:     }
        !            48:   }
        !            49:   return pNew;
        !            50: }
        !            51: 
        !            52: /*
        !            53: ** Set the Expr.span field of the given expression to span all
        !            54: ** text between the two given tokens.
        !            55: */
        !            56: void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
        !            57:   assert( pRight!=0 );
        !            58:   assert( pLeft!=0 );
        !            59:   /* Note: pExpr might be NULL due to a prior malloc failure */
        !            60:   if( pExpr && pRight->z && pLeft->z ){
        !            61:     if( pLeft->dyn==0 && pRight->dyn==0 ){
        !            62:       pExpr->span.z = pLeft->z;
        !            63:       pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
        !            64:     }else{
        !            65:       pExpr->span.z = 0;
        !            66:     }
        !            67:   }
        !            68: }
        !            69: 
        !            70: /*
        !            71: ** Construct a new expression node for a function with multiple
        !            72: ** arguments.
        !            73: */
        !            74: Expr *sqliteExprFunction(ExprList *pList, Token *pToken){
        !            75:   Expr *pNew;
        !            76:   pNew = sqliteMalloc( sizeof(Expr) );
        !            77:   if( pNew==0 ){
        !            78:     /* sqliteExprListDelete(pList); // Leak pList when malloc fails */
        !            79:     return 0;
        !            80:   }
        !            81:   pNew->op = TK_FUNCTION;
        !            82:   pNew->pList = pList;
        !            83:   if( pToken ){
        !            84:     assert( pToken->dyn==0 );
        !            85:     pNew->token = *pToken;
        !            86:   }else{
        !            87:     pNew->token.z = 0;
        !            88:   }
        !            89:   pNew->span = pNew->token;
        !            90:   return pNew;
        !            91: }
        !            92: 
        !            93: /*
        !            94: ** Recursively delete an expression tree.
        !            95: */
        !            96: void sqliteExprDelete(Expr *p){
        !            97:   if( p==0 ) return;
        !            98:   if( p->span.dyn ) sqliteFree((char*)p->span.z);
        !            99:   if( p->token.dyn ) sqliteFree((char*)p->token.z);
        !           100:   sqliteExprDelete(p->pLeft);
        !           101:   sqliteExprDelete(p->pRight);
        !           102:   sqliteExprListDelete(p->pList);
        !           103:   sqliteSelectDelete(p->pSelect);
        !           104:   sqliteFree(p);
        !           105: }
        !           106: 
        !           107: 
        !           108: /*
        !           109: ** The following group of routines make deep copies of expressions,
        !           110: ** expression lists, ID lists, and select statements.  The copies can
        !           111: ** be deleted (by being passed to their respective ...Delete() routines)
        !           112: ** without effecting the originals.
        !           113: **
        !           114: ** The expression list, ID, and source lists return by sqliteExprListDup(),
        !           115: ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded 
        !           116: ** by subsequent calls to sqlite*ListAppend() routines.
        !           117: **
        !           118: ** Any tables that the SrcList might point to are not duplicated.
        !           119: */
        !           120: Expr *sqliteExprDup(Expr *p){
        !           121:   Expr *pNew;
        !           122:   if( p==0 ) return 0;
        !           123:   pNew = sqliteMallocRaw( sizeof(*p) );
        !           124:   if( pNew==0 ) return 0;
        !           125:   memcpy(pNew, p, sizeof(*pNew));
        !           126:   if( p->token.z!=0 ){
        !           127:     pNew->token.z = sqliteStrNDup(p->token.z, p->token.n);
        !           128:     pNew->token.dyn = 1;
        !           129:   }else{
        !           130:     assert( pNew->token.z==0 );
        !           131:   }
        !           132:   pNew->span.z = 0;
        !           133:   pNew->pLeft = sqliteExprDup(p->pLeft);
        !           134:   pNew->pRight = sqliteExprDup(p->pRight);
        !           135:   pNew->pList = sqliteExprListDup(p->pList);
        !           136:   pNew->pSelect = sqliteSelectDup(p->pSelect);
        !           137:   return pNew;
        !           138: }
        !           139: void sqliteTokenCopy(Token *pTo, Token *pFrom){
        !           140:   if( pTo->dyn ) sqliteFree((char*)pTo->z);
        !           141:   if( pFrom->z ){
        !           142:     pTo->n = pFrom->n;
        !           143:     pTo->z = sqliteStrNDup(pFrom->z, pFrom->n);
        !           144:     pTo->dyn = 1;
        !           145:   }else{
        !           146:     pTo->z = 0;
        !           147:   }
        !           148: }
        !           149: ExprList *sqliteExprListDup(ExprList *p){
        !           150:   ExprList *pNew;
        !           151:   struct ExprList_item *pItem;
        !           152:   int i;
        !           153:   if( p==0 ) return 0;
        !           154:   pNew = sqliteMalloc( sizeof(*pNew) );
        !           155:   if( pNew==0 ) return 0;
        !           156:   pNew->nExpr = pNew->nAlloc = p->nExpr;
        !           157:   pNew->a = pItem = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
        !           158:   if( pItem==0 ){
        !           159:     sqliteFree(pNew);
        !           160:     return 0;
        !           161:   }
        !           162:   for(i=0; i<p->nExpr; i++, pItem++){
        !           163:     Expr *pNewExpr, *pOldExpr;
        !           164:     pItem->pExpr = pNewExpr = sqliteExprDup(pOldExpr = p->a[i].pExpr);
        !           165:     if( pOldExpr->span.z!=0 && pNewExpr ){
        !           166:       /* Always make a copy of the span for top-level expressions in the
        !           167:       ** expression list.  The logic in SELECT processing that determines
        !           168:       ** the names of columns in the result set needs this information */
        !           169:       sqliteTokenCopy(&pNewExpr->span, &pOldExpr->span);
        !           170:     }
        !           171:     assert( pNewExpr==0 || pNewExpr->span.z!=0 
        !           172:             || pOldExpr->span.z==0 || sqlite_malloc_failed );
        !           173:     pItem->zName = sqliteStrDup(p->a[i].zName);
        !           174:     pItem->sortOrder = p->a[i].sortOrder;
        !           175:     pItem->isAgg = p->a[i].isAgg;
        !           176:     pItem->done = 0;
        !           177:   }
        !           178:   return pNew;
        !           179: }
        !           180: SrcList *sqliteSrcListDup(SrcList *p){
        !           181:   SrcList *pNew;
        !           182:   int i;
        !           183:   int nByte;
        !           184:   if( p==0 ) return 0;
        !           185:   nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0);
        !           186:   pNew = sqliteMallocRaw( nByte );
        !           187:   if( pNew==0 ) return 0;
        !           188:   pNew->nSrc = pNew->nAlloc = p->nSrc;
        !           189:   for(i=0; i<p->nSrc; i++){
        !           190:     struct SrcList_item *pNewItem = &pNew->a[i];
        !           191:     struct SrcList_item *pOldItem = &p->a[i];
        !           192:     pNewItem->zDatabase = sqliteStrDup(pOldItem->zDatabase);
        !           193:     pNewItem->zName = sqliteStrDup(pOldItem->zName);
        !           194:     pNewItem->zAlias = sqliteStrDup(pOldItem->zAlias);
        !           195:     pNewItem->jointype = pOldItem->jointype;
        !           196:     pNewItem->iCursor = pOldItem->iCursor;
        !           197:     pNewItem->pTab = 0;
        !           198:     pNewItem->pSelect = sqliteSelectDup(pOldItem->pSelect);
        !           199:     pNewItem->pOn = sqliteExprDup(pOldItem->pOn);
        !           200:     pNewItem->pUsing = sqliteIdListDup(pOldItem->pUsing);
        !           201:   }
        !           202:   return pNew;
        !           203: }
        !           204: IdList *sqliteIdListDup(IdList *p){
        !           205:   IdList *pNew;
        !           206:   int i;
        !           207:   if( p==0 ) return 0;
        !           208:   pNew = sqliteMallocRaw( sizeof(*pNew) );
        !           209:   if( pNew==0 ) return 0;
        !           210:   pNew->nId = pNew->nAlloc = p->nId;
        !           211:   pNew->a = sqliteMallocRaw( p->nId*sizeof(p->a[0]) );
        !           212:   if( pNew->a==0 ) return 0;
        !           213:   for(i=0; i<p->nId; i++){
        !           214:     struct IdList_item *pNewItem = &pNew->a[i];
        !           215:     struct IdList_item *pOldItem = &p->a[i];
        !           216:     pNewItem->zName = sqliteStrDup(pOldItem->zName);
        !           217:     pNewItem->idx = pOldItem->idx;
        !           218:   }
        !           219:   return pNew;
        !           220: }
        !           221: Select *sqliteSelectDup(Select *p){
        !           222:   Select *pNew;
        !           223:   if( p==0 ) return 0;
        !           224:   pNew = sqliteMallocRaw( sizeof(*p) );
        !           225:   if( pNew==0 ) return 0;
        !           226:   pNew->isDistinct = p->isDistinct;
        !           227:   pNew->pEList = sqliteExprListDup(p->pEList);
        !           228:   pNew->pSrc = sqliteSrcListDup(p->pSrc);
        !           229:   pNew->pWhere = sqliteExprDup(p->pWhere);
        !           230:   pNew->pGroupBy = sqliteExprListDup(p->pGroupBy);
        !           231:   pNew->pHaving = sqliteExprDup(p->pHaving);
        !           232:   pNew->pOrderBy = sqliteExprListDup(p->pOrderBy);
        !           233:   pNew->op = p->op;
        !           234:   pNew->pPrior = sqliteSelectDup(p->pPrior);
        !           235:   pNew->nLimit = p->nLimit;
        !           236:   pNew->nOffset = p->nOffset;
        !           237:   pNew->zSelect = 0;
        !           238:   pNew->iLimit = -1;
        !           239:   pNew->iOffset = -1;
        !           240:   return pNew;
        !           241: }
        !           242: 
        !           243: 
        !           244: /*
        !           245: ** Add a new element to the end of an expression list.  If pList is
        !           246: ** initially NULL, then create a new expression list.
        !           247: */
        !           248: ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
        !           249:   if( pList==0 ){
        !           250:     pList = sqliteMalloc( sizeof(ExprList) );
        !           251:     if( pList==0 ){
        !           252:       /* sqliteExprDelete(pExpr); // Leak memory if malloc fails */
        !           253:       return 0;
        !           254:     }
        !           255:     assert( pList->nAlloc==0 );
        !           256:   }
        !           257:   if( pList->nAlloc<=pList->nExpr ){
        !           258:     pList->nAlloc = pList->nAlloc*2 + 4;
        !           259:     pList->a = sqliteRealloc(pList->a, pList->nAlloc*sizeof(pList->a[0]));
        !           260:     if( pList->a==0 ){
        !           261:       /* sqliteExprDelete(pExpr); // Leak memory if malloc fails */
        !           262:       pList->nExpr = pList->nAlloc = 0;
        !           263:       return pList;
        !           264:     }
        !           265:   }
        !           266:   assert( pList->a!=0 );
        !           267:   if( pExpr || pName ){
        !           268:     struct ExprList_item *pItem = &pList->a[pList->nExpr++];
        !           269:     memset(pItem, 0, sizeof(*pItem));
        !           270:     pItem->pExpr = pExpr;
        !           271:     if( pName ){
        !           272:       sqliteSetNString(&pItem->zName, pName->z, pName->n, 0);
        !           273:       sqliteDequote(pItem->zName);
        !           274:     }
        !           275:   }
        !           276:   return pList;
        !           277: }
        !           278: 
        !           279: /*
        !           280: ** Delete an entire expression list.
        !           281: */
        !           282: void sqliteExprListDelete(ExprList *pList){
        !           283:   int i;
        !           284:   if( pList==0 ) return;
        !           285:   assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) );
        !           286:   assert( pList->nExpr<=pList->nAlloc );
        !           287:   for(i=0; i<pList->nExpr; i++){
        !           288:     sqliteExprDelete(pList->a[i].pExpr);
        !           289:     sqliteFree(pList->a[i].zName);
        !           290:   }
        !           291:   sqliteFree(pList->a);
        !           292:   sqliteFree(pList);
        !           293: }
        !           294: 
        !           295: /*
        !           296: ** Walk an expression tree.  Return 1 if the expression is constant
        !           297: ** and 0 if it involves variables.
        !           298: **
        !           299: ** For the purposes of this function, a double-quoted string (ex: "abc")
        !           300: ** is considered a variable but a single-quoted string (ex: 'abc') is
        !           301: ** a constant.
        !           302: */
        !           303: int sqliteExprIsConstant(Expr *p){
        !           304:   switch( p->op ){
        !           305:     case TK_ID:
        !           306:     case TK_COLUMN:
        !           307:     case TK_DOT:
        !           308:     case TK_FUNCTION:
        !           309:       return 0;
        !           310:     case TK_NULL:
        !           311:     case TK_STRING:
        !           312:     case TK_INTEGER:
        !           313:     case TK_FLOAT:
        !           314:     case TK_VARIABLE:
        !           315:       return 1;
        !           316:     default: {
        !           317:       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
        !           318:       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
        !           319:       if( p->pList ){
        !           320:         int i;
        !           321:         for(i=0; i<p->pList->nExpr; i++){
        !           322:           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
        !           323:         }
        !           324:       }
        !           325:       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
        !           326:     }
        !           327:   }
        !           328:   return 0;
        !           329: }
        !           330: 
        !           331: /*
        !           332: ** If the given expression codes a constant integer that is small enough
        !           333: ** to fit in a 32-bit integer, return 1 and put the value of the integer
        !           334: ** in *pValue.  If the expression is not an integer or if it is too big
        !           335: ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
        !           336: */
        !           337: int sqliteExprIsInteger(Expr *p, int *pValue){
        !           338:   switch( p->op ){
        !           339:     case TK_INTEGER: {
        !           340:       if( sqliteFitsIn32Bits(p->token.z) ){
        !           341:         *pValue = atoi(p->token.z);
        !           342:         return 1;
        !           343:       }
        !           344:       break;
        !           345:     }
        !           346:     case TK_STRING: {
        !           347:       const char *z = p->token.z;
        !           348:       int n = p->token.n;
        !           349:       if( n>0 && z[0]=='-' ){ z++; n--; }
        !           350:       while( n>0 && *z && isdigit(*z) ){ z++; n--; }
        !           351:       if( n==0 && sqliteFitsIn32Bits(p->token.z) ){
        !           352:         *pValue = atoi(p->token.z);
        !           353:         return 1;
        !           354:       }
        !           355:       break;
        !           356:     }
        !           357:     case TK_UPLUS: {
        !           358:       return sqliteExprIsInteger(p->pLeft, pValue);
        !           359:     }
        !           360:     case TK_UMINUS: {
        !           361:       int v;
        !           362:       if( sqliteExprIsInteger(p->pLeft, &v) ){
        !           363:         *pValue = -v;
        !           364:         return 1;
        !           365:       }
        !           366:       break;
        !           367:     }
        !           368:     default: break;
        !           369:   }
        !           370:   return 0;
        !           371: }
        !           372: 
        !           373: /*
        !           374: ** Return TRUE if the given string is a row-id column name.
        !           375: */
        !           376: int sqliteIsRowid(const char *z){
        !           377:   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
        !           378:   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
        !           379:   if( sqliteStrICmp(z, "OID")==0 ) return 1;
        !           380:   return 0;
        !           381: }
        !           382: 
        !           383: /*
        !           384: ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up
        !           385: ** that name in the set of source tables in pSrcList and make the pExpr 
        !           386: ** expression node refer back to that source column.  The following changes
        !           387: ** are made to pExpr:
        !           388: **
        !           389: **    pExpr->iDb           Set the index in db->aDb[] of the database holding
        !           390: **                         the table.
        !           391: **    pExpr->iTable        Set to the cursor number for the table obtained
        !           392: **                         from pSrcList.
        !           393: **    pExpr->iColumn       Set to the column number within the table.
        !           394: **    pExpr->dataType      Set to the appropriate data type for the column.
        !           395: **    pExpr->op            Set to TK_COLUMN.
        !           396: **    pExpr->pLeft         Any expression this points to is deleted
        !           397: **    pExpr->pRight        Any expression this points to is deleted.
        !           398: **
        !           399: ** The pDbToken is the name of the database (the "X").  This value may be
        !           400: ** NULL meaning that name is of the form Y.Z or Z.  Any available database
        !           401: ** can be used.  The pTableToken is the name of the table (the "Y").  This
        !           402: ** value can be NULL if pDbToken is also NULL.  If pTableToken is NULL it
        !           403: ** means that the form of the name is Z and that columns from any table
        !           404: ** can be used.
        !           405: **
        !           406: ** If the name cannot be resolved unambiguously, leave an error message
        !           407: ** in pParse and return non-zero.  Return zero on success.
        !           408: */
        !           409: static int lookupName(
        !           410:   Parse *pParse,      /* The parsing context */
        !           411:   Token *pDbToken,     /* Name of the database containing table, or NULL */
        !           412:   Token *pTableToken,  /* Name of table containing column, or NULL */
        !           413:   Token *pColumnToken, /* Name of the column. */
        !           414:   SrcList *pSrcList,   /* List of tables used to resolve column names */
        !           415:   ExprList *pEList,    /* List of expressions used to resolve "AS" */
        !           416:   Expr *pExpr          /* Make this EXPR node point to the selected column */
        !           417: ){
        !           418:   char *zDb = 0;       /* Name of the database.  The "X" in X.Y.Z */
        !           419:   char *zTab = 0;      /* Name of the table.  The "Y" in X.Y.Z or Y.Z */
        !           420:   char *zCol = 0;      /* Name of the column.  The "Z" */
        !           421:   int i, j;            /* Loop counters */
        !           422:   int cnt = 0;         /* Number of matching column names */
        !           423:   int cntTab = 0;      /* Number of matching table names */
        !           424:   sqlite *db = pParse->db;  /* The database */
        !           425: 
        !           426:   assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */
        !           427:   if( pDbToken && pDbToken->z ){
        !           428:     zDb = sqliteStrNDup(pDbToken->z, pDbToken->n);
        !           429:     sqliteDequote(zDb);
        !           430:   }else{
        !           431:     zDb = 0;
        !           432:   }
        !           433:   if( pTableToken && pTableToken->z ){
        !           434:     zTab = sqliteStrNDup(pTableToken->z, pTableToken->n);
        !           435:     sqliteDequote(zTab);
        !           436:   }else{
        !           437:     assert( zDb==0 );
        !           438:     zTab = 0;
        !           439:   }
        !           440:   zCol = sqliteStrNDup(pColumnToken->z, pColumnToken->n);
        !           441:   sqliteDequote(zCol);
        !           442:   if( sqlite_malloc_failed ){
        !           443:     return 1;  /* Leak memory (zDb and zTab) if malloc fails */
        !           444:   }
        !           445:   assert( zTab==0 || pEList==0 );
        !           446: 
        !           447:   pExpr->iTable = -1;
        !           448:   for(i=0; i<pSrcList->nSrc; i++){
        !           449:     struct SrcList_item *pItem = &pSrcList->a[i];
        !           450:     Table *pTab = pItem->pTab;
        !           451:     Column *pCol;
        !           452: 
        !           453:     if( pTab==0 ) continue;
        !           454:     assert( pTab->nCol>0 );
        !           455:     if( zTab ){
        !           456:       if( pItem->zAlias ){
        !           457:         char *zTabName = pItem->zAlias;
        !           458:         if( sqliteStrICmp(zTabName, zTab)!=0 ) continue;
        !           459:       }else{
        !           460:         char *zTabName = pTab->zName;
        !           461:         if( zTabName==0 || sqliteStrICmp(zTabName, zTab)!=0 ) continue;
        !           462:         if( zDb!=0 && sqliteStrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){
        !           463:           continue;
        !           464:         }
        !           465:       }
        !           466:     }
        !           467:     if( 0==(cntTab++) ){
        !           468:       pExpr->iTable = pItem->iCursor;
        !           469:       pExpr->iDb = pTab->iDb;
        !           470:     }
        !           471:     for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
        !           472:       if( sqliteStrICmp(pCol->zName, zCol)==0 ){
        !           473:         cnt++;
        !           474:         pExpr->iTable = pItem->iCursor;
        !           475:         pExpr->iDb = pTab->iDb;
        !           476:         /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
        !           477:         pExpr->iColumn = j==pTab->iPKey ? -1 : j;
        !           478:         pExpr->dataType = pCol->sortOrder & SQLITE_SO_TYPEMASK;
        !           479:         break;
        !           480:       }
        !           481:     }
        !           482:   }
        !           483: 
        !           484:   /* If we have not already resolved the name, then maybe 
        !           485:   ** it is a new.* or old.* trigger argument reference
        !           486:   */
        !           487:   if( zDb==0 && zTab!=0 && cnt==0 && pParse->trigStack!=0 ){
        !           488:     TriggerStack *pTriggerStack = pParse->trigStack;
        !           489:     Table *pTab = 0;
        !           490:     if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zTab) == 0 ){
        !           491:       pExpr->iTable = pTriggerStack->newIdx;
        !           492:       assert( pTriggerStack->pTab );
        !           493:       pTab = pTriggerStack->pTab;
        !           494:     }else if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zTab) == 0 ){
        !           495:       pExpr->iTable = pTriggerStack->oldIdx;
        !           496:       assert( pTriggerStack->pTab );
        !           497:       pTab = pTriggerStack->pTab;
        !           498:     }
        !           499: 
        !           500:     if( pTab ){ 
        !           501:       int j;
        !           502:       Column *pCol = pTab->aCol;
        !           503:       
        !           504:       pExpr->iDb = pTab->iDb;
        !           505:       cntTab++;
        !           506:       for(j=0; j < pTab->nCol; j++, pCol++) {
        !           507:         if( sqliteStrICmp(pCol->zName, zCol)==0 ){
        !           508:           cnt++;
        !           509:           pExpr->iColumn = j==pTab->iPKey ? -1 : j;
        !           510:           pExpr->dataType = pCol->sortOrder & SQLITE_SO_TYPEMASK;
        !           511:           break;
        !           512:         }
        !           513:       }
        !           514:     }
        !           515:   }
        !           516: 
        !           517:   /*
        !           518:   ** Perhaps the name is a reference to the ROWID
        !           519:   */
        !           520:   if( cnt==0 && cntTab==1 && sqliteIsRowid(zCol) ){
        !           521:     cnt = 1;
        !           522:     pExpr->iColumn = -1;
        !           523:     pExpr->dataType = SQLITE_SO_NUM;
        !           524:   }
        !           525: 
        !           526:   /*
        !           527:   ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z
        !           528:   ** might refer to an result-set alias.  This happens, for example, when
        !           529:   ** we are resolving names in the WHERE clause of the following command:
        !           530:   **
        !           531:   **     SELECT a+b AS x FROM table WHERE x<10;
        !           532:   **
        !           533:   ** In cases like this, replace pExpr with a copy of the expression that
        !           534:   ** forms the result set entry ("a+b" in the example) and return immediately.
        !           535:   ** Note that the expression in the result set should have already been
        !           536:   ** resolved by the time the WHERE clause is resolved.
        !           537:   */
        !           538:   if( cnt==0 && pEList!=0 ){
        !           539:     for(j=0; j<pEList->nExpr; j++){
        !           540:       char *zAs = pEList->a[j].zName;
        !           541:       if( zAs!=0 && sqliteStrICmp(zAs, zCol)==0 ){
        !           542:         assert( pExpr->pLeft==0 && pExpr->pRight==0 );
        !           543:         pExpr->op = TK_AS;
        !           544:         pExpr->iColumn = j;
        !           545:         pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr);
        !           546:         sqliteFree(zCol);
        !           547:         assert( zTab==0 && zDb==0 );
        !           548:         return 0;
        !           549:       }
        !           550:     } 
        !           551:   }
        !           552: 
        !           553:   /*
        !           554:   ** If X and Y are NULL (in other words if only the column name Z is
        !           555:   ** supplied) and the value of Z is enclosed in double-quotes, then
        !           556:   ** Z is a string literal if it doesn't match any column names.  In that
        !           557:   ** case, we need to return right away and not make any changes to
        !           558:   ** pExpr.
        !           559:   */
        !           560:   if( cnt==0 && zTab==0 && pColumnToken->z[0]=='"' ){
        !           561:     sqliteFree(zCol);
        !           562:     return 0;
        !           563:   }
        !           564: 
        !           565:   /*
        !           566:   ** cnt==0 means there was not match.  cnt>1 means there were two or
        !           567:   ** more matches.  Either way, we have an error.
        !           568:   */
        !           569:   if( cnt!=1 ){
        !           570:     char *z = 0;
        !           571:     char *zErr;
        !           572:     zErr = cnt==0 ? "no such column: %s" : "ambiguous column name: %s";
        !           573:     if( zDb ){
        !           574:       sqliteSetString(&z, zDb, ".", zTab, ".", zCol, 0);
        !           575:     }else if( zTab ){
        !           576:       sqliteSetString(&z, zTab, ".", zCol, 0);
        !           577:     }else{
        !           578:       z = sqliteStrDup(zCol);
        !           579:     }
        !           580:     sqliteErrorMsg(pParse, zErr, z);
        !           581:     sqliteFree(z);
        !           582:   }
        !           583: 
        !           584:   /* Clean up and return
        !           585:   */
        !           586:   sqliteFree(zDb);
        !           587:   sqliteFree(zTab);
        !           588:   sqliteFree(zCol);
        !           589:   sqliteExprDelete(pExpr->pLeft);
        !           590:   pExpr->pLeft = 0;
        !           591:   sqliteExprDelete(pExpr->pRight);
        !           592:   pExpr->pRight = 0;
        !           593:   pExpr->op = TK_COLUMN;
        !           594:   sqliteAuthRead(pParse, pExpr, pSrcList);
        !           595:   return cnt!=1;
        !           596: }
        !           597: 
        !           598: /*
        !           599: ** This routine walks an expression tree and resolves references to
        !           600: ** table columns.  Nodes of the form ID.ID or ID resolve into an
        !           601: ** index to the table in the table list and a column offset.  The 
        !           602: ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
        !           603: ** value is changed to the index of the referenced table in pTabList
        !           604: ** plus the "base" value.  The base value will ultimately become the
        !           605: ** VDBE cursor number for a cursor that is pointing into the referenced
        !           606: ** table.  The Expr.iColumn value is changed to the index of the column 
        !           607: ** of the referenced table.  The Expr.iColumn value for the special
        !           608: ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
        !           609: ** alias for ROWID.
        !           610: **
        !           611: ** We also check for instances of the IN operator.  IN comes in two
        !           612: ** forms:
        !           613: **
        !           614: **           expr IN (exprlist)
        !           615: ** and
        !           616: **           expr IN (SELECT ...)
        !           617: **
        !           618: ** The first form is handled by creating a set holding the list
        !           619: ** of allowed values.  The second form causes the SELECT to generate 
        !           620: ** a temporary table.
        !           621: **
        !           622: ** This routine also looks for scalar SELECTs that are part of an expression.
        !           623: ** If it finds any, it generates code to write the value of that select
        !           624: ** into a memory cell.
        !           625: **
        !           626: ** Unknown columns or tables provoke an error.  The function returns
        !           627: ** the number of errors seen and leaves an error message on pParse->zErrMsg.
        !           628: */
        !           629: int sqliteExprResolveIds(
        !           630:   Parse *pParse,     /* The parser context */
        !           631:   SrcList *pSrcList, /* List of tables used to resolve column names */
        !           632:   ExprList *pEList,  /* List of expressions used to resolve "AS" */
        !           633:   Expr *pExpr        /* The expression to be analyzed. */
        !           634: ){
        !           635:   int i;
        !           636: 
        !           637:   if( pExpr==0 || pSrcList==0 ) return 0;
        !           638:   for(i=0; i<pSrcList->nSrc; i++){
        !           639:     assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab );
        !           640:   }
        !           641:   switch( pExpr->op ){
        !           642:     /* Double-quoted strings (ex: "abc") are used as identifiers if
        !           643:     ** possible.  Otherwise they remain as strings.  Single-quoted
        !           644:     ** strings (ex: 'abc') are always string literals.
        !           645:     */
        !           646:     case TK_STRING: {
        !           647:       if( pExpr->token.z[0]=='\'' ) break;
        !           648:       /* Fall thru into the TK_ID case if this is a double-quoted string */
        !           649:     }
        !           650:     /* A lone identifier is the name of a columnd.
        !           651:     */
        !           652:     case TK_ID: {
        !           653:       if( lookupName(pParse, 0, 0, &pExpr->token, pSrcList, pEList, pExpr) ){
        !           654:         return 1;
        !           655:       }
        !           656:       break; 
        !           657:     }
        !           658:   
        !           659:     /* A table name and column name:     ID.ID
        !           660:     ** Or a database, table and column:  ID.ID.ID
        !           661:     */
        !           662:     case TK_DOT: {
        !           663:       Token *pColumn;
        !           664:       Token *pTable;
        !           665:       Token *pDb;
        !           666:       Expr *pRight;
        !           667: 
        !           668:       pRight = pExpr->pRight;
        !           669:       if( pRight->op==TK_ID ){
        !           670:         pDb = 0;
        !           671:         pTable = &pExpr->pLeft->token;
        !           672:         pColumn = &pRight->token;
        !           673:       }else{
        !           674:         assert( pRight->op==TK_DOT );
        !           675:         pDb = &pExpr->pLeft->token;
        !           676:         pTable = &pRight->pLeft->token;
        !           677:         pColumn = &pRight->pRight->token;
        !           678:       }
        !           679:       if( lookupName(pParse, pDb, pTable, pColumn, pSrcList, 0, pExpr) ){
        !           680:         return 1;
        !           681:       }
        !           682:       break;
        !           683:     }
        !           684: 
        !           685:     case TK_IN: {
        !           686:       Vdbe *v = sqliteGetVdbe(pParse);
        !           687:       if( v==0 ) return 1;
        !           688:       if( sqliteExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){
        !           689:         return 1;
        !           690:       }
        !           691:       if( pExpr->pSelect ){
        !           692:         /* Case 1:     expr IN (SELECT ...)
        !           693:         **
        !           694:         ** Generate code to write the results of the select into a temporary
        !           695:         ** table.  The cursor number of the temporary table has already
        !           696:         ** been put in iTable by sqliteExprResolveInSelect().
        !           697:         */
        !           698:         pExpr->iTable = pParse->nTab++;
        !           699:         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
        !           700:         sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0);
        !           701:       }else if( pExpr->pList ){
        !           702:         /* Case 2:     expr IN (exprlist)
        !           703:         **
        !           704:         ** Create a set to put the exprlist values in.  The Set id is stored
        !           705:         ** in iTable.
        !           706:         */
        !           707:         int i, iSet;
        !           708:         for(i=0; i<pExpr->pList->nExpr; i++){
        !           709:           Expr *pE2 = pExpr->pList->a[i].pExpr;
        !           710:           if( !sqliteExprIsConstant(pE2) ){
        !           711:             sqliteErrorMsg(pParse,
        !           712:               "right-hand side of IN operator must be constant");
        !           713:             return 1;
        !           714:           }
        !           715:           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
        !           716:             return 1;
        !           717:           }
        !           718:         }
        !           719:         iSet = pExpr->iTable = pParse->nSet++;
        !           720:         for(i=0; i<pExpr->pList->nExpr; i++){
        !           721:           Expr *pE2 = pExpr->pList->a[i].pExpr;
        !           722:           switch( pE2->op ){
        !           723:             case TK_FLOAT:
        !           724:             case TK_INTEGER:
        !           725:             case TK_STRING: {
        !           726:               int addr;
        !           727:               assert( pE2->token.z );
        !           728:               addr = sqliteVdbeOp3(v, OP_SetInsert, iSet, 0,
        !           729:                                   pE2->token.z, pE2->token.n);
        !           730:               sqliteVdbeDequoteP3(v, addr);
        !           731:               break;
        !           732:             }
        !           733:             default: {
        !           734:               sqliteExprCode(pParse, pE2);
        !           735:               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
        !           736:               break;
        !           737:             }
        !           738:           }
        !           739:         }
        !           740:       }
        !           741:       break;
        !           742:     }
        !           743: 
        !           744:     case TK_SELECT: {
        !           745:       /* This has to be a scalar SELECT.  Generate code to put the
        !           746:       ** value of this select in a memory cell and record the number
        !           747:       ** of the memory cell in iColumn.
        !           748:       */
        !           749:       pExpr->iColumn = pParse->nMem++;
        !           750:       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
        !           751:         return 1;
        !           752:       }
        !           753:       break;
        !           754:     }
        !           755: 
        !           756:     /* For all else, just recursively walk the tree */
        !           757:     default: {
        !           758:       if( pExpr->pLeft
        !           759:       && sqliteExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){
        !           760:         return 1;
        !           761:       }
        !           762:       if( pExpr->pRight 
        !           763:       && sqliteExprResolveIds(pParse, pSrcList, pEList, pExpr->pRight) ){
        !           764:         return 1;
        !           765:       }
        !           766:       if( pExpr->pList ){
        !           767:         int i;
        !           768:         ExprList *pList = pExpr->pList;
        !           769:         for(i=0; i<pList->nExpr; i++){
        !           770:           Expr *pArg = pList->a[i].pExpr;
        !           771:           if( sqliteExprResolveIds(pParse, pSrcList, pEList, pArg) ){
        !           772:             return 1;
        !           773:           }
        !           774:         }
        !           775:       }
        !           776:     }
        !           777:   }
        !           778:   return 0;
        !           779: }
        !           780: 
        !           781: /*
        !           782: ** pExpr is a node that defines a function of some kind.  It might
        !           783: ** be a syntactic function like "count(x)" or it might be a function
        !           784: ** that implements an operator, like "a LIKE b".  
        !           785: **
        !           786: ** This routine makes *pzName point to the name of the function and 
        !           787: ** *pnName hold the number of characters in the function name.
        !           788: */
        !           789: static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){
        !           790:   switch( pExpr->op ){
        !           791:     case TK_FUNCTION: {
        !           792:       *pzName = pExpr->token.z;
        !           793:       *pnName = pExpr->token.n;
        !           794:       break;
        !           795:     }
        !           796:     case TK_LIKE: {
        !           797:       *pzName = "like";
        !           798:       *pnName = 4;
        !           799:       break;
        !           800:     }
        !           801:     case TK_GLOB: {
        !           802:       *pzName = "glob";
        !           803:       *pnName = 4;
        !           804:       break;
        !           805:     }
        !           806:     default: {
        !           807:       *pzName = "can't happen";
        !           808:       *pnName = 12;
        !           809:       break;
        !           810:     }
        !           811:   }
        !           812: }
        !           813: 
        !           814: /*
        !           815: ** Error check the functions in an expression.  Make sure all
        !           816: ** function names are recognized and all functions have the correct
        !           817: ** number of arguments.  Leave an error message in pParse->zErrMsg
        !           818: ** if anything is amiss.  Return the number of errors.
        !           819: **
        !           820: ** if pIsAgg is not null and this expression is an aggregate function
        !           821: ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
        !           822: */
        !           823: int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
        !           824:   int nErr = 0;
        !           825:   if( pExpr==0 ) return 0;
        !           826:   switch( pExpr->op ){
        !           827:     case TK_GLOB:
        !           828:     case TK_LIKE:
        !           829:     case TK_FUNCTION: {
        !           830:       int n = pExpr->pList ? pExpr->pList->nExpr : 0;  /* Number of arguments */
        !           831:       int no_such_func = 0;       /* True if no such function exists */
        !           832:       int wrong_num_args = 0;     /* True if wrong number of arguments */
        !           833:       int is_agg = 0;             /* True if is an aggregate function */
        !           834:       int i;
        !           835:       int nId;                    /* Number of characters in function name */
        !           836:       const char *zId;            /* The function name. */
        !           837:       FuncDef *pDef;
        !           838: 
        !           839:       getFunctionName(pExpr, &zId, &nId);
        !           840:       pDef = sqliteFindFunction(pParse->db, zId, nId, n, 0);
        !           841:       if( pDef==0 ){
        !           842:         pDef = sqliteFindFunction(pParse->db, zId, nId, -1, 0);
        !           843:         if( pDef==0 ){
        !           844:           no_such_func = 1;
        !           845:         }else{
        !           846:           wrong_num_args = 1;
        !           847:         }
        !           848:       }else{
        !           849:         is_agg = pDef->xFunc==0;
        !           850:       }
        !           851:       if( is_agg && !allowAgg ){
        !           852:         sqliteErrorMsg(pParse, "misuse of aggregate function %.*s()", nId, zId);
        !           853:         nErr++;
        !           854:         is_agg = 0;
        !           855:       }else if( no_such_func ){
        !           856:         sqliteErrorMsg(pParse, "no such function: %.*s", nId, zId);
        !           857:         nErr++;
        !           858:       }else if( wrong_num_args ){
        !           859:         sqliteErrorMsg(pParse,"wrong number of arguments to function %.*s()",
        !           860:              nId, zId);
        !           861:         nErr++;
        !           862:       }
        !           863:       if( is_agg ){
        !           864:         pExpr->op = TK_AGG_FUNCTION;
        !           865:         if( pIsAgg ) *pIsAgg = 1;
        !           866:       }
        !           867:       for(i=0; nErr==0 && i<n; i++){
        !           868:         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
        !           869:                                allowAgg && !is_agg, pIsAgg);
        !           870:       }
        !           871:       if( pDef==0 ){
        !           872:         /* Already reported an error */
        !           873:       }else if( pDef->dataType>=0 ){
        !           874:         if( pDef->dataType<n ){
        !           875:           pExpr->dataType = 
        !           876:              sqliteExprType(pExpr->pList->a[pDef->dataType].pExpr);
        !           877:         }else{
        !           878:           pExpr->dataType = SQLITE_SO_NUM;
        !           879:         }
        !           880:       }else if( pDef->dataType==SQLITE_ARGS ){
        !           881:         pDef->dataType = SQLITE_SO_TEXT;
        !           882:         for(i=0; i<n; i++){
        !           883:           if( sqliteExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){
        !           884:             pExpr->dataType = SQLITE_SO_NUM;
        !           885:             break;
        !           886:           }
        !           887:         }
        !           888:       }else if( pDef->dataType==SQLITE_NUMERIC ){
        !           889:         pExpr->dataType = SQLITE_SO_NUM;
        !           890:       }else{
        !           891:         pExpr->dataType = SQLITE_SO_TEXT;
        !           892:       }
        !           893:     }
        !           894:     default: {
        !           895:       if( pExpr->pLeft ){
        !           896:         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
        !           897:       }
        !           898:       if( nErr==0 && pExpr->pRight ){
        !           899:         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
        !           900:       }
        !           901:       if( nErr==0 && pExpr->pList ){
        !           902:         int n = pExpr->pList->nExpr;
        !           903:         int i;
        !           904:         for(i=0; nErr==0 && i<n; i++){
        !           905:           Expr *pE2 = pExpr->pList->a[i].pExpr;
        !           906:           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
        !           907:         }
        !           908:       }
        !           909:       break;
        !           910:     }
        !           911:   }
        !           912:   return nErr;
        !           913: }
        !           914: 
        !           915: /*
        !           916: ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the
        !           917: ** given expression should sort as numeric values or as text.
        !           918: **
        !           919: ** The sqliteExprResolveIds() and sqliteExprCheck() routines must have
        !           920: ** both been called on the expression before it is passed to this routine.
        !           921: */
        !           922: int sqliteExprType(Expr *p){
        !           923:   if( p==0 ) return SQLITE_SO_NUM;
        !           924:   while( p ) switch( p->op ){
        !           925:     case TK_PLUS:
        !           926:     case TK_MINUS:
        !           927:     case TK_STAR:
        !           928:     case TK_SLASH:
        !           929:     case TK_AND:
        !           930:     case TK_OR:
        !           931:     case TK_ISNULL:
        !           932:     case TK_NOTNULL:
        !           933:     case TK_NOT:
        !           934:     case TK_UMINUS:
        !           935:     case TK_UPLUS:
        !           936:     case TK_BITAND:
        !           937:     case TK_BITOR:
        !           938:     case TK_BITNOT:
        !           939:     case TK_LSHIFT:
        !           940:     case TK_RSHIFT:
        !           941:     case TK_REM:
        !           942:     case TK_INTEGER:
        !           943:     case TK_FLOAT:
        !           944:     case TK_IN:
        !           945:     case TK_BETWEEN:
        !           946:     case TK_GLOB:
        !           947:     case TK_LIKE:
        !           948:       return SQLITE_SO_NUM;
        !           949: 
        !           950:     case TK_STRING:
        !           951:     case TK_NULL:
        !           952:     case TK_CONCAT:
        !           953:     case TK_VARIABLE:
        !           954:       return SQLITE_SO_TEXT;
        !           955: 
        !           956:     case TK_LT:
        !           957:     case TK_LE:
        !           958:     case TK_GT:
        !           959:     case TK_GE:
        !           960:     case TK_NE:
        !           961:     case TK_EQ:
        !           962:       if( sqliteExprType(p->pLeft)==SQLITE_SO_NUM ){
        !           963:         return SQLITE_SO_NUM;
        !           964:       }
        !           965:       p = p->pRight;
        !           966:       break;
        !           967: 
        !           968:     case TK_AS:
        !           969:       p = p->pLeft;
        !           970:       break;
        !           971: 
        !           972:     case TK_COLUMN:
        !           973:     case TK_FUNCTION:
        !           974:     case TK_AGG_FUNCTION:
        !           975:       return p->dataType;
        !           976: 
        !           977:     case TK_SELECT:
        !           978:       assert( p->pSelect );
        !           979:       assert( p->pSelect->pEList );
        !           980:       assert( p->pSelect->pEList->nExpr>0 );
        !           981:       p = p->pSelect->pEList->a[0].pExpr;
        !           982:       break;
        !           983: 
        !           984:     case TK_CASE: {
        !           985:       if( p->pRight && sqliteExprType(p->pRight)==SQLITE_SO_NUM ){
        !           986:         return SQLITE_SO_NUM;
        !           987:       }
        !           988:       if( p->pList ){
        !           989:         int i;
        !           990:         ExprList *pList = p->pList;
        !           991:         for(i=1; i<pList->nExpr; i+=2){
        !           992:           if( sqliteExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){
        !           993:             return SQLITE_SO_NUM;
        !           994:           }
        !           995:         }
        !           996:       }
        !           997:       return SQLITE_SO_TEXT;
        !           998:     }
        !           999: 
        !          1000:     default:
        !          1001:       assert( p->op==TK_ABORT );  /* Can't Happen */
        !          1002:       break;
        !          1003:   }
        !          1004:   return SQLITE_SO_NUM;
        !          1005: }
        !          1006: 
        !          1007: /*
        !          1008: ** Generate code into the current Vdbe to evaluate the given
        !          1009: ** expression and leave the result on the top of stack.
        !          1010: */
        !          1011: void sqliteExprCode(Parse *pParse, Expr *pExpr){
        !          1012:   Vdbe *v = pParse->pVdbe;
        !          1013:   int op;
        !          1014:   if( v==0 || pExpr==0 ) return;
        !          1015:   switch( pExpr->op ){
        !          1016:     case TK_PLUS:     op = OP_Add;      break;
        !          1017:     case TK_MINUS:    op = OP_Subtract; break;
        !          1018:     case TK_STAR:     op = OP_Multiply; break;
        !          1019:     case TK_SLASH:    op = OP_Divide;   break;
        !          1020:     case TK_AND:      op = OP_And;      break;
        !          1021:     case TK_OR:       op = OP_Or;       break;
        !          1022:     case TK_LT:       op = OP_Lt;       break;
        !          1023:     case TK_LE:       op = OP_Le;       break;
        !          1024:     case TK_GT:       op = OP_Gt;       break;
        !          1025:     case TK_GE:       op = OP_Ge;       break;
        !          1026:     case TK_NE:       op = OP_Ne;       break;
        !          1027:     case TK_EQ:       op = OP_Eq;       break;
        !          1028:     case TK_ISNULL:   op = OP_IsNull;   break;
        !          1029:     case TK_NOTNULL:  op = OP_NotNull;  break;
        !          1030:     case TK_NOT:      op = OP_Not;      break;
        !          1031:     case TK_UMINUS:   op = OP_Negative; break;
        !          1032:     case TK_BITAND:   op = OP_BitAnd;   break;
        !          1033:     case TK_BITOR:    op = OP_BitOr;    break;
        !          1034:     case TK_BITNOT:   op = OP_BitNot;   break;
        !          1035:     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
        !          1036:     case TK_RSHIFT:   op = OP_ShiftRight; break;
        !          1037:     case TK_REM:      op = OP_Remainder;  break;
        !          1038:     default: break;
        !          1039:   }
        !          1040:   switch( pExpr->op ){
        !          1041:     case TK_COLUMN: {
        !          1042:       if( pParse->useAgg ){
        !          1043:         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
        !          1044:       }else if( pExpr->iColumn>=0 ){
        !          1045:         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
        !          1046:       }else{
        !          1047:         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
        !          1048:       }
        !          1049:       break;
        !          1050:     }
        !          1051:     case TK_STRING:
        !          1052:     case TK_FLOAT:
        !          1053:     case TK_INTEGER: {
        !          1054:       if( pExpr->op==TK_INTEGER && sqliteFitsIn32Bits(pExpr->token.z) ){
        !          1055:         sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0);
        !          1056:       }else{
        !          1057:         sqliteVdbeAddOp(v, OP_String, 0, 0);
        !          1058:       }
        !          1059:       assert( pExpr->token.z );
        !          1060:       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
        !          1061:       sqliteVdbeDequoteP3(v, -1);
        !          1062:       break;
        !          1063:     }
        !          1064:     case TK_NULL: {
        !          1065:       sqliteVdbeAddOp(v, OP_String, 0, 0);
        !          1066:       break;
        !          1067:     }
        !          1068:     case TK_VARIABLE: {
        !          1069:       sqliteVdbeAddOp(v, OP_Variable, pExpr->iTable, 0);
        !          1070:       break;
        !          1071:     }
        !          1072:     case TK_LT:
        !          1073:     case TK_LE:
        !          1074:     case TK_GT:
        !          1075:     case TK_GE:
        !          1076:     case TK_NE:
        !          1077:     case TK_EQ: {
        !          1078:       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
        !          1079:         op += 6;  /* Convert numeric opcodes to text opcodes */
        !          1080:       }
        !          1081:       /* Fall through into the next case */
        !          1082:     }
        !          1083:     case TK_AND:
        !          1084:     case TK_OR:
        !          1085:     case TK_PLUS:
        !          1086:     case TK_STAR:
        !          1087:     case TK_MINUS:
        !          1088:     case TK_REM:
        !          1089:     case TK_BITAND:
        !          1090:     case TK_BITOR:
        !          1091:     case TK_SLASH: {
        !          1092:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1093:       sqliteExprCode(pParse, pExpr->pRight);
        !          1094:       sqliteVdbeAddOp(v, op, 0, 0);
        !          1095:       break;
        !          1096:     }
        !          1097:     case TK_LSHIFT:
        !          1098:     case TK_RSHIFT: {
        !          1099:       sqliteExprCode(pParse, pExpr->pRight);
        !          1100:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1101:       sqliteVdbeAddOp(v, op, 0, 0);
        !          1102:       break;
        !          1103:     }
        !          1104:     case TK_CONCAT: {
        !          1105:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1106:       sqliteExprCode(pParse, pExpr->pRight);
        !          1107:       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
        !          1108:       break;
        !          1109:     }
        !          1110:     case TK_UMINUS: {
        !          1111:       assert( pExpr->pLeft );
        !          1112:       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
        !          1113:         Token *p = &pExpr->pLeft->token;
        !          1114:         char *z = sqliteMalloc( p->n + 2 );
        !          1115:         sprintf(z, "-%.*s", p->n, p->z);
        !          1116:         if( pExpr->pLeft->op==TK_INTEGER && sqliteFitsIn32Bits(z) ){
        !          1117:           sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0);
        !          1118:         }else{
        !          1119:           sqliteVdbeAddOp(v, OP_String, 0, 0);
        !          1120:         }
        !          1121:         sqliteVdbeChangeP3(v, -1, z, p->n+1);
        !          1122:         sqliteFree(z);
        !          1123:         break;
        !          1124:       }
        !          1125:       /* Fall through into TK_NOT */
        !          1126:     }
        !          1127:     case TK_BITNOT:
        !          1128:     case TK_NOT: {
        !          1129:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1130:       sqliteVdbeAddOp(v, op, 0, 0);
        !          1131:       break;
        !          1132:     }
        !          1133:     case TK_ISNULL:
        !          1134:     case TK_NOTNULL: {
        !          1135:       int dest;
        !          1136:       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
        !          1137:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1138:       dest = sqliteVdbeCurrentAddr(v) + 2;
        !          1139:       sqliteVdbeAddOp(v, op, 1, dest);
        !          1140:       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
        !          1141:       break;
        !          1142:     }
        !          1143:     case TK_AGG_FUNCTION: {
        !          1144:       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
        !          1145:       break;
        !          1146:     }
        !          1147:     case TK_GLOB:
        !          1148:     case TK_LIKE:
        !          1149:     case TK_FUNCTION: {
        !          1150:       ExprList *pList = pExpr->pList;
        !          1151:       int nExpr = pList ? pList->nExpr : 0;
        !          1152:       FuncDef *pDef;
        !          1153:       int nId;
        !          1154:       const char *zId;
        !          1155:       getFunctionName(pExpr, &zId, &nId);
        !          1156:       pDef = sqliteFindFunction(pParse->db, zId, nId, nExpr, 0);
        !          1157:       assert( pDef!=0 );
        !          1158:       nExpr = sqliteExprCodeExprList(pParse, pList, pDef->includeTypes);
        !          1159:       sqliteVdbeOp3(v, OP_Function, nExpr, 0, (char*)pDef, P3_POINTER);
        !          1160:       break;
        !          1161:     }
        !          1162:     case TK_SELECT: {
        !          1163:       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
        !          1164:       break;
        !          1165:     }
        !          1166:     case TK_IN: {
        !          1167:       int addr;
        !          1168:       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
        !          1169:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1170:       addr = sqliteVdbeCurrentAddr(v);
        !          1171:       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4);
        !          1172:       sqliteVdbeAddOp(v, OP_Pop, 2, 0);
        !          1173:       sqliteVdbeAddOp(v, OP_String, 0, 0);
        !          1174:       sqliteVdbeAddOp(v, OP_Goto, 0, addr+6);
        !          1175:       if( pExpr->pSelect ){
        !          1176:         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6);
        !          1177:       }else{
        !          1178:         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6);
        !          1179:       }
        !          1180:       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
        !          1181:       break;
        !          1182:     }
        !          1183:     case TK_BETWEEN: {
        !          1184:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1185:       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
        !          1186:       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
        !          1187:       sqliteVdbeAddOp(v, OP_Ge, 0, 0);
        !          1188:       sqliteVdbeAddOp(v, OP_Pull, 1, 0);
        !          1189:       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
        !          1190:       sqliteVdbeAddOp(v, OP_Le, 0, 0);
        !          1191:       sqliteVdbeAddOp(v, OP_And, 0, 0);
        !          1192:       break;
        !          1193:     }
        !          1194:     case TK_UPLUS:
        !          1195:     case TK_AS: {
        !          1196:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1197:       break;
        !          1198:     }
        !          1199:     case TK_CASE: {
        !          1200:       int expr_end_label;
        !          1201:       int jumpInst;
        !          1202:       int addr;
        !          1203:       int nExpr;
        !          1204:       int i;
        !          1205: 
        !          1206:       assert(pExpr->pList);
        !          1207:       assert((pExpr->pList->nExpr % 2) == 0);
        !          1208:       assert(pExpr->pList->nExpr > 0);
        !          1209:       nExpr = pExpr->pList->nExpr;
        !          1210:       expr_end_label = sqliteVdbeMakeLabel(v);
        !          1211:       if( pExpr->pLeft ){
        !          1212:         sqliteExprCode(pParse, pExpr->pLeft);
        !          1213:       }
        !          1214:       for(i=0; i<nExpr; i=i+2){
        !          1215:         sqliteExprCode(pParse, pExpr->pList->a[i].pExpr);
        !          1216:         if( pExpr->pLeft ){
        !          1217:           sqliteVdbeAddOp(v, OP_Dup, 1, 1);
        !          1218:           jumpInst = sqliteVdbeAddOp(v, OP_Ne, 1, 0);
        !          1219:           sqliteVdbeAddOp(v, OP_Pop, 1, 0);
        !          1220:         }else{
        !          1221:           jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 1, 0);
        !          1222:         }
        !          1223:         sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr);
        !          1224:         sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label);
        !          1225:         addr = sqliteVdbeCurrentAddr(v);
        !          1226:         sqliteVdbeChangeP2(v, jumpInst, addr);
        !          1227:       }
        !          1228:       if( pExpr->pLeft ){
        !          1229:         sqliteVdbeAddOp(v, OP_Pop, 1, 0);
        !          1230:       }
        !          1231:       if( pExpr->pRight ){
        !          1232:         sqliteExprCode(pParse, pExpr->pRight);
        !          1233:       }else{
        !          1234:         sqliteVdbeAddOp(v, OP_String, 0, 0);
        !          1235:       }
        !          1236:       sqliteVdbeResolveLabel(v, expr_end_label);
        !          1237:       break;
        !          1238:     }
        !          1239:     case TK_RAISE: {
        !          1240:       if( !pParse->trigStack ){
        !          1241:         sqliteErrorMsg(pParse,
        !          1242:                        "RAISE() may only be used within a trigger-program");
        !          1243:         pParse->nErr++;
        !          1244:        return;
        !          1245:       }
        !          1246:       if( pExpr->iColumn == OE_Rollback ||
        !          1247:          pExpr->iColumn == OE_Abort ||
        !          1248:          pExpr->iColumn == OE_Fail ){
        !          1249:          sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn,
        !          1250:                            pExpr->token.z, pExpr->token.n);
        !          1251:          sqliteVdbeDequoteP3(v, -1);
        !          1252:       } else {
        !          1253:          assert( pExpr->iColumn == OE_Ignore );
        !          1254:          sqliteVdbeOp3(v, OP_Goto, 0, pParse->trigStack->ignoreJump,
        !          1255:                            "(IGNORE jump)", 0);
        !          1256:       }
        !          1257:     }
        !          1258:     break;
        !          1259:   }
        !          1260: }
        !          1261: 
        !          1262: /*
        !          1263: ** Generate code that pushes the value of every element of the given
        !          1264: ** expression list onto the stack.  If the includeTypes flag is true,
        !          1265: ** then also push a string that is the datatype of each element onto
        !          1266: ** the stack after the value.
        !          1267: **
        !          1268: ** Return the number of elements pushed onto the stack.
        !          1269: */
        !          1270: int sqliteExprCodeExprList(
        !          1271:   Parse *pParse,     /* Parsing context */
        !          1272:   ExprList *pList,   /* The expression list to be coded */
        !          1273:   int includeTypes   /* TRUE to put datatypes on the stack too */
        !          1274: ){
        !          1275:   struct ExprList_item *pItem;
        !          1276:   int i, n;
        !          1277:   Vdbe *v;
        !          1278:   if( pList==0 ) return 0;
        !          1279:   v = sqliteGetVdbe(pParse);
        !          1280:   n = pList->nExpr;
        !          1281:   for(pItem=pList->a, i=0; i<n; i++, pItem++){
        !          1282:     sqliteExprCode(pParse, pItem->pExpr);
        !          1283:     if( includeTypes ){
        !          1284:       sqliteVdbeOp3(v, OP_String, 0, 0, 
        !          1285:          sqliteExprType(pItem->pExpr)==SQLITE_SO_NUM ? "numeric" : "text",
        !          1286:          P3_STATIC);
        !          1287:     }
        !          1288:   }
        !          1289:   return includeTypes ? n*2 : n;
        !          1290: }
        !          1291: 
        !          1292: /*
        !          1293: ** Generate code for a boolean expression such that a jump is made
        !          1294: ** to the label "dest" if the expression is true but execution
        !          1295: ** continues straight thru if the expression is false.
        !          1296: **
        !          1297: ** If the expression evaluates to NULL (neither true nor false), then
        !          1298: ** take the jump if the jumpIfNull flag is true.
        !          1299: */
        !          1300: void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
        !          1301:   Vdbe *v = pParse->pVdbe;
        !          1302:   int op = 0;
        !          1303:   if( v==0 || pExpr==0 ) return;
        !          1304:   switch( pExpr->op ){
        !          1305:     case TK_LT:       op = OP_Lt;       break;
        !          1306:     case TK_LE:       op = OP_Le;       break;
        !          1307:     case TK_GT:       op = OP_Gt;       break;
        !          1308:     case TK_GE:       op = OP_Ge;       break;
        !          1309:     case TK_NE:       op = OP_Ne;       break;
        !          1310:     case TK_EQ:       op = OP_Eq;       break;
        !          1311:     case TK_ISNULL:   op = OP_IsNull;   break;
        !          1312:     case TK_NOTNULL:  op = OP_NotNull;  break;
        !          1313:     default:  break;
        !          1314:   }
        !          1315:   switch( pExpr->op ){
        !          1316:     case TK_AND: {
        !          1317:       int d2 = sqliteVdbeMakeLabel(v);
        !          1318:       sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);
        !          1319:       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
        !          1320:       sqliteVdbeResolveLabel(v, d2);
        !          1321:       break;
        !          1322:     }
        !          1323:     case TK_OR: {
        !          1324:       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
        !          1325:       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
        !          1326:       break;
        !          1327:     }
        !          1328:     case TK_NOT: {
        !          1329:       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
        !          1330:       break;
        !          1331:     }
        !          1332:     case TK_LT:
        !          1333:     case TK_LE:
        !          1334:     case TK_GT:
        !          1335:     case TK_GE:
        !          1336:     case TK_NE:
        !          1337:     case TK_EQ: {
        !          1338:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1339:       sqliteExprCode(pParse, pExpr->pRight);
        !          1340:       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
        !          1341:         op += 6;  /* Convert numeric opcodes to text opcodes */
        !          1342:       }
        !          1343:       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
        !          1344:       break;
        !          1345:     }
        !          1346:     case TK_ISNULL:
        !          1347:     case TK_NOTNULL: {
        !          1348:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1349:       sqliteVdbeAddOp(v, op, 1, dest);
        !          1350:       break;
        !          1351:     }
        !          1352:     case TK_IN: {
        !          1353:       int addr;
        !          1354:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1355:       addr = sqliteVdbeCurrentAddr(v);
        !          1356:       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
        !          1357:       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
        !          1358:       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
        !          1359:       if( pExpr->pSelect ){
        !          1360:         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
        !          1361:       }else{
        !          1362:         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
        !          1363:       }
        !          1364:       break;
        !          1365:     }
        !          1366:     case TK_BETWEEN: {
        !          1367:       int addr;
        !          1368:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1369:       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
        !          1370:       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
        !          1371:       addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0);
        !          1372:       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
        !          1373:       sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest);
        !          1374:       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
        !          1375:       sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v));
        !          1376:       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
        !          1377:       break;
        !          1378:     }
        !          1379:     default: {
        !          1380:       sqliteExprCode(pParse, pExpr);
        !          1381:       sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest);
        !          1382:       break;
        !          1383:     }
        !          1384:   }
        !          1385: }
        !          1386: 
        !          1387: /*
        !          1388: ** Generate code for a boolean expression such that a jump is made
        !          1389: ** to the label "dest" if the expression is false but execution
        !          1390: ** continues straight thru if the expression is true.
        !          1391: **
        !          1392: ** If the expression evaluates to NULL (neither true nor false) then
        !          1393: ** jump if jumpIfNull is true or fall through if jumpIfNull is false.
        !          1394: */
        !          1395: void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
        !          1396:   Vdbe *v = pParse->pVdbe;
        !          1397:   int op = 0;
        !          1398:   if( v==0 || pExpr==0 ) return;
        !          1399:   switch( pExpr->op ){
        !          1400:     case TK_LT:       op = OP_Ge;       break;
        !          1401:     case TK_LE:       op = OP_Gt;       break;
        !          1402:     case TK_GT:       op = OP_Le;       break;
        !          1403:     case TK_GE:       op = OP_Lt;       break;
        !          1404:     case TK_NE:       op = OP_Eq;       break;
        !          1405:     case TK_EQ:       op = OP_Ne;       break;
        !          1406:     case TK_ISNULL:   op = OP_NotNull;  break;
        !          1407:     case TK_NOTNULL:  op = OP_IsNull;   break;
        !          1408:     default:  break;
        !          1409:   }
        !          1410:   switch( pExpr->op ){
        !          1411:     case TK_AND: {
        !          1412:       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
        !          1413:       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
        !          1414:       break;
        !          1415:     }
        !          1416:     case TK_OR: {
        !          1417:       int d2 = sqliteVdbeMakeLabel(v);
        !          1418:       sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);
        !          1419:       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
        !          1420:       sqliteVdbeResolveLabel(v, d2);
        !          1421:       break;
        !          1422:     }
        !          1423:     case TK_NOT: {
        !          1424:       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
        !          1425:       break;
        !          1426:     }
        !          1427:     case TK_LT:
        !          1428:     case TK_LE:
        !          1429:     case TK_GT:
        !          1430:     case TK_GE:
        !          1431:     case TK_NE:
        !          1432:     case TK_EQ: {
        !          1433:       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
        !          1434:         /* Convert numeric comparison opcodes into text comparison opcodes.
        !          1435:         ** This step depends on the fact that the text comparision opcodes are
        !          1436:         ** always 6 greater than their corresponding numeric comparison
        !          1437:         ** opcodes.
        !          1438:         */
        !          1439:         assert( OP_Eq+6 == OP_StrEq );
        !          1440:         op += 6;
        !          1441:       }
        !          1442:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1443:       sqliteExprCode(pParse, pExpr->pRight);
        !          1444:       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
        !          1445:       break;
        !          1446:     }
        !          1447:     case TK_ISNULL:
        !          1448:     case TK_NOTNULL: {
        !          1449:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1450:       sqliteVdbeAddOp(v, op, 1, dest);
        !          1451:       break;
        !          1452:     }
        !          1453:     case TK_IN: {
        !          1454:       int addr;
        !          1455:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1456:       addr = sqliteVdbeCurrentAddr(v);
        !          1457:       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
        !          1458:       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
        !          1459:       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
        !          1460:       if( pExpr->pSelect ){
        !          1461:         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
        !          1462:       }else{
        !          1463:         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
        !          1464:       }
        !          1465:       break;
        !          1466:     }
        !          1467:     case TK_BETWEEN: {
        !          1468:       int addr;
        !          1469:       sqliteExprCode(pParse, pExpr->pLeft);
        !          1470:       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
        !          1471:       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
        !          1472:       addr = sqliteVdbeCurrentAddr(v);
        !          1473:       sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3);
        !          1474:       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
        !          1475:       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
        !          1476:       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
        !          1477:       sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest);
        !          1478:       break;
        !          1479:     }
        !          1480:     default: {
        !          1481:       sqliteExprCode(pParse, pExpr);
        !          1482:       sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest);
        !          1483:       break;
        !          1484:     }
        !          1485:   }
        !          1486: }
        !          1487: 
        !          1488: /*
        !          1489: ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
        !          1490: ** if they are identical and return FALSE if they differ in any way.
        !          1491: */
        !          1492: int sqliteExprCompare(Expr *pA, Expr *pB){
        !          1493:   int i;
        !          1494:   if( pA==0 ){
        !          1495:     return pB==0;
        !          1496:   }else if( pB==0 ){
        !          1497:     return 0;
        !          1498:   }
        !          1499:   if( pA->op!=pB->op ) return 0;
        !          1500:   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
        !          1501:   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
        !          1502:   if( pA->pList ){
        !          1503:     if( pB->pList==0 ) return 0;
        !          1504:     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
        !          1505:     for(i=0; i<pA->pList->nExpr; i++){
        !          1506:       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
        !          1507:         return 0;
        !          1508:       }
        !          1509:     }
        !          1510:   }else if( pB->pList ){
        !          1511:     return 0;
        !          1512:   }
        !          1513:   if( pA->pSelect || pB->pSelect ) return 0;
        !          1514:   if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;
        !          1515:   if( pA->token.z ){
        !          1516:     if( pB->token.z==0 ) return 0;
        !          1517:     if( pB->token.n!=pA->token.n ) return 0;
        !          1518:     if( sqliteStrNICmp(pA->token.z, pB->token.z, pB->token.n)!=0 ) return 0;
        !          1519:   }
        !          1520:   return 1;
        !          1521: }
        !          1522: 
        !          1523: /*
        !          1524: ** Add a new element to the pParse->aAgg[] array and return its index.
        !          1525: */
        !          1526: static int appendAggInfo(Parse *pParse){
        !          1527:   if( (pParse->nAgg & 0x7)==0 ){
        !          1528:     int amt = pParse->nAgg + 8;
        !          1529:     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
        !          1530:     if( aAgg==0 ){
        !          1531:       return -1;
        !          1532:     }
        !          1533:     pParse->aAgg = aAgg;
        !          1534:   }
        !          1535:   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
        !          1536:   return pParse->nAgg++;
        !          1537: }
        !          1538: 
        !          1539: /*
        !          1540: ** Analyze the given expression looking for aggregate functions and
        !          1541: ** for variables that need to be added to the pParse->aAgg[] array.
        !          1542: ** Make additional entries to the pParse->aAgg[] array as necessary.
        !          1543: **
        !          1544: ** This routine should only be called after the expression has been
        !          1545: ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
        !          1546: **
        !          1547: ** If errors are seen, leave an error message in zErrMsg and return
        !          1548: ** the number of errors.
        !          1549: */
        !          1550: int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
        !          1551:   int i;
        !          1552:   AggExpr *aAgg;
        !          1553:   int nErr = 0;
        !          1554: 
        !          1555:   if( pExpr==0 ) return 0;
        !          1556:   switch( pExpr->op ){
        !          1557:     case TK_COLUMN: {
        !          1558:       aAgg = pParse->aAgg;
        !          1559:       for(i=0; i<pParse->nAgg; i++){
        !          1560:         if( aAgg[i].isAgg ) continue;
        !          1561:         if( aAgg[i].pExpr->iTable==pExpr->iTable
        !          1562:          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
        !          1563:           break;
        !          1564:         }
        !          1565:       }
        !          1566:       if( i>=pParse->nAgg ){
        !          1567:         i = appendAggInfo(pParse);
        !          1568:         if( i<0 ) return 1;
        !          1569:         pParse->aAgg[i].isAgg = 0;
        !          1570:         pParse->aAgg[i].pExpr = pExpr;
        !          1571:       }
        !          1572:       pExpr->iAgg = i;
        !          1573:       break;
        !          1574:     }
        !          1575:     case TK_AGG_FUNCTION: {
        !          1576:       aAgg = pParse->aAgg;
        !          1577:       for(i=0; i<pParse->nAgg; i++){
        !          1578:         if( !aAgg[i].isAgg ) continue;
        !          1579:         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
        !          1580:           break;
        !          1581:         }
        !          1582:       }
        !          1583:       if( i>=pParse->nAgg ){
        !          1584:         i = appendAggInfo(pParse);
        !          1585:         if( i<0 ) return 1;
        !          1586:         pParse->aAgg[i].isAgg = 1;
        !          1587:         pParse->aAgg[i].pExpr = pExpr;
        !          1588:         pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db,
        !          1589:              pExpr->token.z, pExpr->token.n,
        !          1590:              pExpr->pList ? pExpr->pList->nExpr : 0, 0);
        !          1591:       }
        !          1592:       pExpr->iAgg = i;
        !          1593:       break;
        !          1594:     }
        !          1595:     default: {
        !          1596:       if( pExpr->pLeft ){
        !          1597:         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
        !          1598:       }
        !          1599:       if( nErr==0 && pExpr->pRight ){
        !          1600:         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
        !          1601:       }
        !          1602:       if( nErr==0 && pExpr->pList ){
        !          1603:         int n = pExpr->pList->nExpr;
        !          1604:         int i;
        !          1605:         for(i=0; nErr==0 && i<n; i++){
        !          1606:           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
        !          1607:         }
        !          1608:       }
        !          1609:       break;
        !          1610:     }
        !          1611:   }
        !          1612:   return nErr;
        !          1613: }
        !          1614: 
        !          1615: /*
        !          1616: ** Locate a user function given a name and a number of arguments.
        !          1617: ** Return a pointer to the FuncDef structure that defines that
        !          1618: ** function, or return NULL if the function does not exist.
        !          1619: **
        !          1620: ** If the createFlag argument is true, then a new (blank) FuncDef
        !          1621: ** structure is created and liked into the "db" structure if a
        !          1622: ** no matching function previously existed.  When createFlag is true
        !          1623: ** and the nArg parameter is -1, then only a function that accepts
        !          1624: ** any number of arguments will be returned.
        !          1625: **
        !          1626: ** If createFlag is false and nArg is -1, then the first valid
        !          1627: ** function found is returned.  A function is valid if either xFunc
        !          1628: ** or xStep is non-zero.
        !          1629: */
        !          1630: FuncDef *sqliteFindFunction(
        !          1631:   sqlite *db,        /* An open database */
        !          1632:   const char *zName, /* Name of the function.  Not null-terminated */
        !          1633:   int nName,         /* Number of characters in the name */
        !          1634:   int nArg,          /* Number of arguments.  -1 means any number */
        !          1635:   int createFlag     /* Create new entry if true and does not otherwise exist */
        !          1636: ){
        !          1637:   FuncDef *pFirst, *p, *pMaybe;
        !          1638:   pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName);
        !          1639:   if( p && !createFlag && nArg<0 ){
        !          1640:     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
        !          1641:     return p;
        !          1642:   }
        !          1643:   pMaybe = 0;
        !          1644:   while( p && p->nArg!=nArg ){
        !          1645:     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
        !          1646:     p = p->pNext;
        !          1647:   }
        !          1648:   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
        !          1649:     return 0;
        !          1650:   }
        !          1651:   if( p==0 && pMaybe ){
        !          1652:     assert( createFlag==0 );
        !          1653:     return pMaybe;
        !          1654:   }
        !          1655:   if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
        !          1656:     p->nArg = nArg;
        !          1657:     p->pNext = pFirst;
        !          1658:     p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC;
        !          1659:     sqliteHashInsert(&db->aFunc, zName, nName, (void*)p);
        !          1660:   }
        !          1661:   return p;
        !          1662: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>