1cce7d176Sdrh /* 2b19a2bc6Sdrh ** 2001 September 15 3cce7d176Sdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 6cce7d176Sdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 10cce7d176Sdrh ** 11cce7d176Sdrh ************************************************************************* 121ccde15dSdrh ** This file contains routines used for analyzing expressions and 13b19a2bc6Sdrh ** for generating VDBE code that evaluates expressions in SQLite. 14cce7d176Sdrh ** 15*99fcd718Sdrh ** $Id: expr.c,v 1.30 2001/10/13 01:06:48 drh Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 18cce7d176Sdrh 19cce7d176Sdrh /* 20fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 21fef5208cSdrh ** and 0 if it involves variables. 22fef5208cSdrh */ 23fef5208cSdrh static int isConstant(Expr *p){ 24fef5208cSdrh switch( p->op ){ 25fef5208cSdrh case TK_ID: 26967e8b73Sdrh case TK_COLUMN: 27fef5208cSdrh case TK_DOT: 28fef5208cSdrh return 0; 29fef5208cSdrh default: { 30fef5208cSdrh if( p->pLeft && !isConstant(p->pLeft) ) return 0; 31fef5208cSdrh if( p->pRight && !isConstant(p->pRight) ) return 0; 32fef5208cSdrh if( p->pList ){ 33fef5208cSdrh int i; 34fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 35fef5208cSdrh if( !isConstant(p->pList->a[i].pExpr) ) return 0; 36fef5208cSdrh } 37fef5208cSdrh } 38fef5208cSdrh break; 39fef5208cSdrh } 40fef5208cSdrh } 41fef5208cSdrh return 1; 42fef5208cSdrh } 43fef5208cSdrh 44fef5208cSdrh /* 454794b980Sdrh ** Walk the expression tree and process operators of the form: 464794b980Sdrh ** 474794b980Sdrh ** expr IN (SELECT ...) 484794b980Sdrh ** 49967e8b73Sdrh ** These operators have to be processed before column names are 504794b980Sdrh ** resolved because each such operator increments pParse->nTab 511ccde15dSdrh ** to reserve cursor numbers for its own use. But pParse->nTab 52967e8b73Sdrh ** needs to be constant once we begin resolving column names. 534794b980Sdrh ** 544794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this 554794b980Sdrh ** routine. This routine allocates a cursor number to the IN-SELECT 564794b980Sdrh ** and then moves on. The code generation is done by 574794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards. 584794b980Sdrh */ 594794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){ 604794b980Sdrh if( pExpr==0 ) return; 614794b980Sdrh if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){ 624794b980Sdrh pExpr->iTable = pParse->nTab++; 634794b980Sdrh }else{ 644794b980Sdrh if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft); 654794b980Sdrh if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight); 664794b980Sdrh if( pExpr->pList ){ 674794b980Sdrh int i; 684794b980Sdrh ExprList *pList = pExpr->pList; 694794b980Sdrh for(i=0; i<pList->nExpr; i++){ 704794b980Sdrh sqliteExprResolveInSelect(pParse, pList->a[i].pExpr); 714794b980Sdrh } 724794b980Sdrh } 734794b980Sdrh } 744794b980Sdrh } 754794b980Sdrh 764794b980Sdrh /* 77c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 78c4a3c779Sdrh */ 79c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 80c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 81c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 82c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 83c4a3c779Sdrh return 0; 84c4a3c779Sdrh } 85c4a3c779Sdrh 86c4a3c779Sdrh /* 87cce7d176Sdrh ** This routine walks an expression tree and resolves references to 88967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 89967e8b73Sdrh ** index to the table in the table list and a column offset. The opcode 90967e8b73Sdrh ** for such nodes is changed to TK_COLUMN. The iTable value is changed 9119a775c2Sdrh ** to the index of the referenced table in pTabList plus the pParse->nTab 92967e8b73Sdrh ** value. The iColumn value is changed to the index of the column of the 9319a775c2Sdrh ** referenced table. 9419a775c2Sdrh ** 95fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 96fef5208cSdrh ** forms: 97fef5208cSdrh ** 98fef5208cSdrh ** expr IN (exprlist) 99fef5208cSdrh ** and 100fef5208cSdrh ** expr IN (SELECT ...) 101fef5208cSdrh ** 102fef5208cSdrh ** The first form is handled by creating a set holding the list 103fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 104fef5208cSdrh ** a temporary table. 105fef5208cSdrh ** 106fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 10719a775c2Sdrh ** If it finds any, it generates code to write the value of that select 10819a775c2Sdrh ** into a memory cell. 109cce7d176Sdrh ** 110967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 111cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 112cce7d176Sdrh */ 113cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){ 114daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 115cce7d176Sdrh switch( pExpr->op ){ 116cce7d176Sdrh /* A lone identifier */ 117cce7d176Sdrh case TK_ID: { 118cce7d176Sdrh int cnt = 0; /* Number of matches */ 119cce7d176Sdrh int i; /* Loop counter */ 1206e142f54Sdrh char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 121daffd0e5Sdrh if( z==0 ) return 1; 122cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 123cce7d176Sdrh int j; 124cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 125cce7d176Sdrh if( pTab==0 ) continue; 126cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 1277020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 128cce7d176Sdrh cnt++; 12919a775c2Sdrh pExpr->iTable = i + pParse->nTab; 130967e8b73Sdrh pExpr->iColumn = j; 131cce7d176Sdrh } 132cce7d176Sdrh } 133cce7d176Sdrh } 134c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 135c4a3c779Sdrh pExpr->iColumn = -1; 136c4a3c779Sdrh pExpr->iTable = pParse->nTab; 137c4a3c779Sdrh cnt = 1 + (pTabList->nId>1); 138c4a3c779Sdrh } 139cce7d176Sdrh sqliteFree(z); 140cce7d176Sdrh if( cnt==0 ){ 141967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 142cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 143cce7d176Sdrh pParse->nErr++; 144cce7d176Sdrh return 1; 145cce7d176Sdrh }else if( cnt>1 ){ 146967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 147cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 148cce7d176Sdrh pParse->nErr++; 149cce7d176Sdrh return 1; 150cce7d176Sdrh } 151967e8b73Sdrh pExpr->op = TK_COLUMN; 152cce7d176Sdrh break; 153cce7d176Sdrh } 154cce7d176Sdrh 155967e8b73Sdrh /* A table name and column name: ID.ID */ 156cce7d176Sdrh case TK_DOT: { 157cce7d176Sdrh int cnt = 0; /* Number of matches */ 158c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 159cce7d176Sdrh int i; /* Loop counter */ 160cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 161cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 162cce7d176Sdrh 163cce7d176Sdrh pLeft = pExpr->pLeft; 164cce7d176Sdrh pRight = pExpr->pRight; 165cce7d176Sdrh assert( pLeft && pLeft->op==TK_ID ); 166cce7d176Sdrh assert( pRight && pRight->op==TK_ID ); 1676e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 1686e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 169daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 170daffd0e5Sdrh sqliteFree(zLeft); 171daffd0e5Sdrh sqliteFree(zRight); 172daffd0e5Sdrh return 1; 173daffd0e5Sdrh } 17487c40e88Sdrh sqliteDequote(zLeft); 17587c40e88Sdrh sqliteDequote(zRight); 176c4a3c779Sdrh pExpr->iTable = -1; 177cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 178cce7d176Sdrh int j; 179cce7d176Sdrh char *zTab; 180cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 181cce7d176Sdrh if( pTab==0 ) continue; 182cce7d176Sdrh if( pTabList->a[i].zAlias ){ 183cce7d176Sdrh zTab = pTabList->a[i].zAlias; 184cce7d176Sdrh }else{ 185cce7d176Sdrh zTab = pTab->zName; 186cce7d176Sdrh } 187cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 188c4a3c779Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab; 189cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 1907020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 191cce7d176Sdrh cnt++; 19219a775c2Sdrh pExpr->iTable = i + pParse->nTab; 193967e8b73Sdrh pExpr->iColumn = j; 194cce7d176Sdrh } 195cce7d176Sdrh } 196cce7d176Sdrh } 197c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 198c4a3c779Sdrh cnt = 1; 199c4a3c779Sdrh pExpr->iColumn = -1; 200c4a3c779Sdrh } 201cce7d176Sdrh sqliteFree(zLeft); 202cce7d176Sdrh sqliteFree(zRight); 203cce7d176Sdrh if( cnt==0 ){ 204967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 205cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 206cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 207cce7d176Sdrh pParse->nErr++; 208cce7d176Sdrh return 1; 209cce7d176Sdrh }else if( cnt>1 ){ 210967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 211cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 212cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 213cce7d176Sdrh pParse->nErr++; 214cce7d176Sdrh return 1; 215cce7d176Sdrh } 216cce7d176Sdrh sqliteExprDelete(pLeft); 217cce7d176Sdrh pExpr->pLeft = 0; 218cce7d176Sdrh sqliteExprDelete(pRight); 219cce7d176Sdrh pExpr->pRight = 0; 220967e8b73Sdrh pExpr->op = TK_COLUMN; 221cce7d176Sdrh break; 222cce7d176Sdrh } 223cce7d176Sdrh 224fef5208cSdrh case TK_IN: { 225d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 226fef5208cSdrh if( v==0 ) return 1; 227cfab11bcSdrh if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 228cfab11bcSdrh return 1; 229cfab11bcSdrh } 230fef5208cSdrh if( pExpr->pSelect ){ 231fef5208cSdrh /* Case 1: expr IN (SELECT ...) 232fef5208cSdrh ** 233fef5208cSdrh ** Generate code to write the results of the select into a temporary 2344794b980Sdrh ** table. The cursor number of the temporary table has already 2354794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 236fef5208cSdrh */ 237*99fcd718Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 0); 238fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 239fef5208cSdrh }else if( pExpr->pList ){ 240fef5208cSdrh /* Case 2: expr IN (exprlist) 241fef5208cSdrh ** 242fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 243fef5208cSdrh ** in iTable. 244fef5208cSdrh */ 245fef5208cSdrh int i, iSet; 246fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 247fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 248fef5208cSdrh if( !isConstant(pE2) ){ 249fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 250fef5208cSdrh "right-hand side of IN operator must be constant", 0); 251fef5208cSdrh pParse->nErr++; 252fef5208cSdrh return 1; 253fef5208cSdrh } 2544794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 2554794b980Sdrh return 1; 2564794b980Sdrh } 257fef5208cSdrh } 258fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 259fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 260fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 261fef5208cSdrh switch( pE2->op ){ 262fef5208cSdrh case TK_FLOAT: 263fef5208cSdrh case TK_INTEGER: 264fef5208cSdrh case TK_STRING: { 265*99fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 266fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 267fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 268fef5208cSdrh break; 269fef5208cSdrh } 270fef5208cSdrh default: { 271fef5208cSdrh sqliteExprCode(pParse, pE2); 272*99fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 273fef5208cSdrh break; 274fef5208cSdrh } 275fef5208cSdrh } 276fef5208cSdrh } 277fef5208cSdrh } 278cfab11bcSdrh break; 279fef5208cSdrh } 280fef5208cSdrh 28119a775c2Sdrh case TK_SELECT: { 282fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 283fef5208cSdrh ** value of this select in a memory cell and record the number 284967e8b73Sdrh ** of the memory cell in iColumn. 285fef5208cSdrh */ 286967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 287967e8b73Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){ 28819a775c2Sdrh return 1; 28919a775c2Sdrh } 29019a775c2Sdrh break; 29119a775c2Sdrh } 29219a775c2Sdrh 293cce7d176Sdrh /* For all else, just recursively walk the tree */ 294cce7d176Sdrh default: { 295cce7d176Sdrh if( pExpr->pLeft 296cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 297cce7d176Sdrh return 1; 298cce7d176Sdrh } 299cce7d176Sdrh if( pExpr->pRight 300cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){ 301cce7d176Sdrh return 1; 302cce7d176Sdrh } 303cce7d176Sdrh if( pExpr->pList ){ 304cce7d176Sdrh int i; 305cce7d176Sdrh ExprList *pList = pExpr->pList; 306cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 307cce7d176Sdrh if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){ 308cce7d176Sdrh return 1; 309cce7d176Sdrh } 310cce7d176Sdrh } 311cce7d176Sdrh } 312cce7d176Sdrh } 313cce7d176Sdrh } 314cce7d176Sdrh return 0; 315cce7d176Sdrh } 316cce7d176Sdrh 317cce7d176Sdrh #if 0 /* NOT USED */ 318cce7d176Sdrh /* 319cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 320cce7d176Sdrh */ 321cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 322cce7d176Sdrh int n = strlen(zStr); 323cce7d176Sdrh if( n!=pToken->n ) return 0; 324cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 325cce7d176Sdrh } 326cce7d176Sdrh #endif 327cce7d176Sdrh 328cce7d176Sdrh /* 329cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 330cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 331cce7d176Sdrh */ 332cce7d176Sdrh int sqliteFuncId(Token *pToken){ 333cce7d176Sdrh static const struct { 334cce7d176Sdrh char *zName; 335cce7d176Sdrh int len; 336cce7d176Sdrh int id; 337cce7d176Sdrh } aFunc[] = { 338cce7d176Sdrh { "count", 5, FN_Count }, 339cce7d176Sdrh { "min", 3, FN_Min }, 340cce7d176Sdrh { "max", 3, FN_Max }, 341cce7d176Sdrh { "sum", 3, FN_Sum }, 3422282792aSdrh { "avg", 3, FN_Avg }, 3430bdaf62eSdrh { "fcnt", 4, FN_Fcnt }, /* Used for testing only */ 3446ec2733bSdrh { "length", 6, FN_Length}, 3456ec2733bSdrh { "substr", 6, FN_Substr}, 346cce7d176Sdrh }; 347cce7d176Sdrh int i; 348cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 349cce7d176Sdrh if( aFunc[i].len==pToken->n 350cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 351cce7d176Sdrh return aFunc[i].id; 352cce7d176Sdrh } 353cce7d176Sdrh } 354cce7d176Sdrh return FN_Unknown; 355cce7d176Sdrh } 356cce7d176Sdrh 357cce7d176Sdrh /* 358cce7d176Sdrh ** Error check the functions in an expression. Make sure all 359cce7d176Sdrh ** function names are recognized and all functions have the correct 360cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 361cce7d176Sdrh ** if anything is amiss. Return the number of errors. 362cce7d176Sdrh ** 363cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 364cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 365cce7d176Sdrh */ 366cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 367cce7d176Sdrh int nErr = 0; 368cce7d176Sdrh if( pExpr==0 ) return 0; 369cce7d176Sdrh switch( pExpr->op ){ 370cce7d176Sdrh case TK_FUNCTION: { 371cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 372cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 373cce7d176Sdrh int no_such_func = 0; 374cce7d176Sdrh int too_many_args = 0; 375cce7d176Sdrh int too_few_args = 0; 376cce7d176Sdrh int is_agg = 0; 377cce7d176Sdrh int i; 378967e8b73Sdrh pExpr->iColumn = id; 379cce7d176Sdrh switch( id ){ 380cce7d176Sdrh case FN_Unknown: { 381cce7d176Sdrh no_such_func = 1; 382cce7d176Sdrh break; 383cce7d176Sdrh } 384cce7d176Sdrh case FN_Count: { 385cce7d176Sdrh no_such_func = !allowAgg; 386cce7d176Sdrh too_many_args = n>1; 387cce7d176Sdrh is_agg = 1; 388cce7d176Sdrh break; 389cce7d176Sdrh } 390cce7d176Sdrh case FN_Max: 391cce7d176Sdrh case FN_Min: { 392cce7d176Sdrh too_few_args = allowAgg ? n<1 : n<2; 393cce7d176Sdrh is_agg = n==1; 394cce7d176Sdrh break; 395cce7d176Sdrh } 3962282792aSdrh case FN_Avg: 397cce7d176Sdrh case FN_Sum: { 398cce7d176Sdrh no_such_func = !allowAgg; 399cce7d176Sdrh too_many_args = n>1; 400cce7d176Sdrh too_few_args = n<1; 401cce7d176Sdrh is_agg = 1; 402cce7d176Sdrh break; 403cce7d176Sdrh } 4046ec2733bSdrh case FN_Length: { 4056ec2733bSdrh too_few_args = n<1; 4066ec2733bSdrh too_many_args = n>1; 4076ec2733bSdrh break; 4086ec2733bSdrh } 4096ec2733bSdrh case FN_Substr: { 4106ec2733bSdrh too_few_args = n<3; 4116ec2733bSdrh too_many_args = n>3; 4126ec2733bSdrh break; 4136ec2733bSdrh } 4140bdaf62eSdrh /* The "fcnt(*)" function always returns the number of fetch 4150bdaf62eSdrh ** operations that have occurred so far while processing the 4160bdaf62eSdrh ** SQL statement. This information can be used by test procedures 4170bdaf62eSdrh ** to verify that indices are being used properly to minimize 4180bdaf62eSdrh ** searching. All arguments to fcnt() are ignored. fcnt() has 4190bdaf62eSdrh ** no use (other than testing) that we are aware of. 4200bdaf62eSdrh */ 4210bdaf62eSdrh case FN_Fcnt: { 4220bdaf62eSdrh n = 0; 4230bdaf62eSdrh break; 4240bdaf62eSdrh } 4256ec2733bSdrh 426cce7d176Sdrh default: break; 427cce7d176Sdrh } 428cce7d176Sdrh if( no_such_func ){ 429cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 430cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 431cce7d176Sdrh pParse->nErr++; 432cce7d176Sdrh nErr++; 433cce7d176Sdrh }else if( too_many_args ){ 434cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 435cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 436cce7d176Sdrh pParse->nErr++; 437cce7d176Sdrh nErr++; 438cce7d176Sdrh }else if( too_few_args ){ 439cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 440cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 441cce7d176Sdrh pParse->nErr++; 442cce7d176Sdrh nErr++; 443cce7d176Sdrh } 4442282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 445cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 446cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 4474cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 4484cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 449cce7d176Sdrh } 450cce7d176Sdrh } 451cce7d176Sdrh default: { 452cce7d176Sdrh if( pExpr->pLeft ){ 4532282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 454cce7d176Sdrh } 455cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 4562282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 457cce7d176Sdrh } 458fef5208cSdrh if( nErr==0 && pExpr->pList ){ 459fef5208cSdrh int n = pExpr->pList->nExpr; 460fef5208cSdrh int i; 461fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 4622282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 4632282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 464fef5208cSdrh } 465fef5208cSdrh } 466cce7d176Sdrh break; 467cce7d176Sdrh } 468cce7d176Sdrh } 469cce7d176Sdrh return nErr; 470cce7d176Sdrh } 471cce7d176Sdrh 472cce7d176Sdrh /* 473cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 4741ccde15dSdrh ** expression and leave the result on the top of stack. 475cce7d176Sdrh */ 476cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 477cce7d176Sdrh Vdbe *v = pParse->pVdbe; 478cce7d176Sdrh int op; 479daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 480cce7d176Sdrh switch( pExpr->op ){ 481cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 482cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 483cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 484cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 485cce7d176Sdrh case TK_AND: op = OP_And; break; 486cce7d176Sdrh case TK_OR: op = OP_Or; break; 487cce7d176Sdrh case TK_LT: op = OP_Lt; break; 488cce7d176Sdrh case TK_LE: op = OP_Le; break; 489cce7d176Sdrh case TK_GT: op = OP_Gt; break; 490cce7d176Sdrh case TK_GE: op = OP_Ge; break; 491cce7d176Sdrh case TK_NE: op = OP_Ne; break; 492cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 493cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 494cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 495cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 496cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 497cce7d176Sdrh case TK_NOT: op = OP_Not; break; 498cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 499cce7d176Sdrh default: break; 500cce7d176Sdrh } 501cce7d176Sdrh switch( pExpr->op ){ 502967e8b73Sdrh case TK_COLUMN: { 5032282792aSdrh if( pParse->useAgg ){ 504*99fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 505c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 506*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 507c4a3c779Sdrh }else{ 508*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 5092282792aSdrh } 510cce7d176Sdrh break; 511cce7d176Sdrh } 512cce7d176Sdrh case TK_INTEGER: { 513cce7d176Sdrh int i = atoi(pExpr->token.z); 514*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, i, 0); 515cce7d176Sdrh break; 516cce7d176Sdrh } 517cce7d176Sdrh case TK_FLOAT: { 518*99fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 519cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 520cce7d176Sdrh break; 521cce7d176Sdrh } 522cce7d176Sdrh case TK_STRING: { 523*99fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 524cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 525cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 526cce7d176Sdrh break; 527cce7d176Sdrh } 528cce7d176Sdrh case TK_NULL: { 529*99fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 530cce7d176Sdrh break; 531cce7d176Sdrh } 532cce7d176Sdrh case TK_AND: 533cce7d176Sdrh case TK_OR: 534cce7d176Sdrh case TK_PLUS: 535cce7d176Sdrh case TK_STAR: 536cce7d176Sdrh case TK_MINUS: 537cce7d176Sdrh case TK_SLASH: { 538cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 539cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 540*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 541cce7d176Sdrh break; 542cce7d176Sdrh } 5430040077dSdrh case TK_CONCAT: { 5440040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 5450040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 546*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 5470040077dSdrh break; 5480040077dSdrh } 549cce7d176Sdrh case TK_LT: 550cce7d176Sdrh case TK_LE: 551cce7d176Sdrh case TK_GT: 552cce7d176Sdrh case TK_GE: 553cce7d176Sdrh case TK_NE: 554cce7d176Sdrh case TK_EQ: 555cce7d176Sdrh case TK_LIKE: 556cce7d176Sdrh case TK_GLOB: { 557cce7d176Sdrh int dest; 558*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 559cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 560cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 561cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 562*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 563*99fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 564cce7d176Sdrh break; 565cce7d176Sdrh } 566cce7d176Sdrh case TK_UMINUS: { 5676e142f54Sdrh assert( pExpr->pLeft ); 5686e142f54Sdrh if( pExpr->pLeft->op==TK_INTEGER ){ 5696e142f54Sdrh int i = atoi(pExpr->pLeft->token.z); 570*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, -i, 0); 5716e142f54Sdrh break; 5726e142f54Sdrh }else if( pExpr->pLeft->op==TK_FLOAT ){ 5736e142f54Sdrh Token *p = &pExpr->pLeft->token; 5746e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 5756e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 576*99fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 577*99fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 5786e142f54Sdrh sqliteFree(z); 5796e142f54Sdrh break; 5806e142f54Sdrh } 5811ccde15dSdrh /* Fall through into TK_NOT */ 5826e142f54Sdrh } 5836e142f54Sdrh case TK_NOT: { 584cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 585*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 586cce7d176Sdrh break; 587cce7d176Sdrh } 588cce7d176Sdrh case TK_ISNULL: 589cce7d176Sdrh case TK_NOTNULL: { 590cce7d176Sdrh int dest; 591*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 592cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 593cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 594*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 595*99fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 596cce7d176Sdrh break; 597cce7d176Sdrh } 5982282792aSdrh case TK_AGG_FUNCTION: { 599*99fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 600967e8b73Sdrh if( pExpr->iColumn==FN_Avg ){ 6012282792aSdrh assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); 602*99fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount); 603*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Divide, 0, 0); 6042282792aSdrh } 6052282792aSdrh break; 6062282792aSdrh } 607cce7d176Sdrh case TK_FUNCTION: { 608967e8b73Sdrh int id = pExpr->iColumn; 609cce7d176Sdrh int op; 610cce7d176Sdrh int i; 611cce7d176Sdrh ExprList *pList = pExpr->pList; 6126ec2733bSdrh switch( id ){ 6136ec2733bSdrh case FN_Fcnt: { 614*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Fcnt, 0, 0); 6150bdaf62eSdrh break; 6160bdaf62eSdrh } 6176ec2733bSdrh case FN_Min: 6186ec2733bSdrh case FN_Max: { 619cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 620cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 621cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 622cce7d176Sdrh if( i>0 ){ 623*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 624cce7d176Sdrh } 625cce7d176Sdrh } 626cce7d176Sdrh break; 627cce7d176Sdrh } 6286ec2733bSdrh case FN_Length: { 6296ec2733bSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 630*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Strlen, 0, 0); 6316ec2733bSdrh break; 6326ec2733bSdrh } 6336ec2733bSdrh case FN_Substr: { 6346ec2733bSdrh for(i=0; i<pList->nExpr; i++){ 6356ec2733bSdrh sqliteExprCode(pParse, pList->a[i].pExpr); 6366ec2733bSdrh } 637*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Substr, 0, 0); 6386ec2733bSdrh break; 6396ec2733bSdrh } 6406ec2733bSdrh default: { 6416ec2733bSdrh /* Can't happen! */ 6426ec2733bSdrh break; 6436ec2733bSdrh } 6446ec2733bSdrh } 6456ec2733bSdrh break; 6466ec2733bSdrh } 64719a775c2Sdrh case TK_SELECT: { 648*99fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 64919a775c2Sdrh break; 65019a775c2Sdrh } 651fef5208cSdrh case TK_IN: { 652fef5208cSdrh int addr; 653*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 654fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 655fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 656fef5208cSdrh if( pExpr->pSelect ){ 657*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2); 658fef5208cSdrh }else{ 659*99fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2); 660fef5208cSdrh } 661*99fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 662fef5208cSdrh break; 663fef5208cSdrh } 664fef5208cSdrh case TK_BETWEEN: { 665fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 666*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 667fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 668*99fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0); 669fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 670fef5208cSdrh break; 671fef5208cSdrh } 672cce7d176Sdrh } 673cce7d176Sdrh return; 674cce7d176Sdrh } 675cce7d176Sdrh 676cce7d176Sdrh /* 677cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 678cce7d176Sdrh ** to the label "dest" if the expression is true but execution 679cce7d176Sdrh ** continues straight thru if the expression is false. 680cce7d176Sdrh */ 681cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 682cce7d176Sdrh Vdbe *v = pParse->pVdbe; 683cce7d176Sdrh int op = 0; 684daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 685cce7d176Sdrh switch( pExpr->op ){ 686cce7d176Sdrh case TK_LT: op = OP_Lt; break; 687cce7d176Sdrh case TK_LE: op = OP_Le; break; 688cce7d176Sdrh case TK_GT: op = OP_Gt; break; 689cce7d176Sdrh case TK_GE: op = OP_Ge; break; 690cce7d176Sdrh case TK_NE: op = OP_Ne; break; 691cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 692cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 693cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 694cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 695cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 696cce7d176Sdrh default: break; 697cce7d176Sdrh } 698cce7d176Sdrh switch( pExpr->op ){ 699cce7d176Sdrh case TK_AND: { 700cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 701cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 702cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 703cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 704cce7d176Sdrh break; 705cce7d176Sdrh } 706cce7d176Sdrh case TK_OR: { 707cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 708cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 709cce7d176Sdrh break; 710cce7d176Sdrh } 711cce7d176Sdrh case TK_NOT: { 712cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 713cce7d176Sdrh break; 714cce7d176Sdrh } 715cce7d176Sdrh case TK_LT: 716cce7d176Sdrh case TK_LE: 717cce7d176Sdrh case TK_GT: 718cce7d176Sdrh case TK_GE: 719cce7d176Sdrh case TK_NE: 720cce7d176Sdrh case TK_EQ: 721cce7d176Sdrh case TK_LIKE: 722cce7d176Sdrh case TK_GLOB: { 723cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 724cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 725*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 726cce7d176Sdrh break; 727cce7d176Sdrh } 728cce7d176Sdrh case TK_ISNULL: 729cce7d176Sdrh case TK_NOTNULL: { 730cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 731*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 732cce7d176Sdrh break; 733cce7d176Sdrh } 734fef5208cSdrh case TK_IN: { 735cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 736fef5208cSdrh if( pExpr->pSelect ){ 737*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 738fef5208cSdrh }else{ 739*99fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 740fef5208cSdrh } 741fef5208cSdrh break; 742fef5208cSdrh } 743fef5208cSdrh case TK_BETWEEN: { 744fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 745fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 746*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 747fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 748*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl); 749fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 750*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Le, 0, dest); 751*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 752*99fcd718Sdrh sqliteVdbeResolveLabel(v, lbl); 753*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 754fef5208cSdrh break; 755fef5208cSdrh } 756cce7d176Sdrh default: { 757cce7d176Sdrh sqliteExprCode(pParse, pExpr); 758*99fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 759cce7d176Sdrh break; 760cce7d176Sdrh } 761cce7d176Sdrh } 762cce7d176Sdrh } 763cce7d176Sdrh 764cce7d176Sdrh /* 76566b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 766cce7d176Sdrh ** to the label "dest" if the expression is false but execution 767cce7d176Sdrh ** continues straight thru if the expression is true. 768cce7d176Sdrh */ 769cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 770cce7d176Sdrh Vdbe *v = pParse->pVdbe; 771cce7d176Sdrh int op = 0; 772daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 773cce7d176Sdrh switch( pExpr->op ){ 774cce7d176Sdrh case TK_LT: op = OP_Ge; break; 775cce7d176Sdrh case TK_LE: op = OP_Gt; break; 776cce7d176Sdrh case TK_GT: op = OP_Le; break; 777cce7d176Sdrh case TK_GE: op = OP_Lt; break; 778cce7d176Sdrh case TK_NE: op = OP_Eq; break; 779cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 780cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 781cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 782cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 783cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 784cce7d176Sdrh default: break; 785cce7d176Sdrh } 786cce7d176Sdrh switch( pExpr->op ){ 787cce7d176Sdrh case TK_AND: { 788cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 789cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 790cce7d176Sdrh break; 791cce7d176Sdrh } 792cce7d176Sdrh case TK_OR: { 793cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 794cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 795cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 796cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 797cce7d176Sdrh break; 798cce7d176Sdrh } 799cce7d176Sdrh case TK_NOT: { 800cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 801cce7d176Sdrh break; 802cce7d176Sdrh } 803cce7d176Sdrh case TK_LT: 804cce7d176Sdrh case TK_LE: 805cce7d176Sdrh case TK_GT: 806cce7d176Sdrh case TK_GE: 807cce7d176Sdrh case TK_NE: 808cce7d176Sdrh case TK_EQ: { 809cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 810cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 811*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 812cce7d176Sdrh break; 813cce7d176Sdrh } 814cce7d176Sdrh case TK_LIKE: 815cce7d176Sdrh case TK_GLOB: { 816cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 817cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 818*99fcd718Sdrh sqliteVdbeAddOp(v, op, 1, dest); 819cce7d176Sdrh break; 820cce7d176Sdrh } 821cce7d176Sdrh case TK_ISNULL: 822cce7d176Sdrh case TK_NOTNULL: { 823cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 824*99fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 825cce7d176Sdrh break; 826cce7d176Sdrh } 827fef5208cSdrh case TK_IN: { 828cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 829fef5208cSdrh if( pExpr->pSelect ){ 830*99fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 831fef5208cSdrh }else{ 832*99fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 833fef5208cSdrh } 834fef5208cSdrh break; 835fef5208cSdrh } 836fef5208cSdrh case TK_BETWEEN: { 837fef5208cSdrh int addr; 838fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 839*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 840fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 841fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 842*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); 843*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 844*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 845fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 846*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest); 847fef5208cSdrh break; 848fef5208cSdrh } 849cce7d176Sdrh default: { 850cce7d176Sdrh sqliteExprCode(pParse, pExpr); 851*99fcd718Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0); 852*99fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 853cce7d176Sdrh break; 854cce7d176Sdrh } 855cce7d176Sdrh } 856cce7d176Sdrh } 8572282792aSdrh 8582282792aSdrh /* 8592282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 8602282792aSdrh ** if they are identical and return FALSE if they differ in any way. 8612282792aSdrh */ 862d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 8632282792aSdrh int i; 8642282792aSdrh if( pA==0 ){ 8652282792aSdrh return pB==0; 8662282792aSdrh }else if( pB==0 ){ 8672282792aSdrh return 0; 8682282792aSdrh } 8692282792aSdrh if( pA->op!=pB->op ) return 0; 870d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 871d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 8722282792aSdrh if( pA->pList ){ 8732282792aSdrh if( pB->pList==0 ) return 0; 8742282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 8752282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 876d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 8772282792aSdrh return 0; 8782282792aSdrh } 8792282792aSdrh } 8802282792aSdrh }else if( pB->pList ){ 8812282792aSdrh return 0; 8822282792aSdrh } 8832282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 8842282792aSdrh if( pA->token.z ){ 8852282792aSdrh if( pB->token.z==0 ) return 0; 8862282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 8872282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 8882282792aSdrh } 8892282792aSdrh return 1; 8902282792aSdrh } 8912282792aSdrh 8922282792aSdrh /* 8932282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 8942282792aSdrh */ 8952282792aSdrh static int appendAggInfo(Parse *pParse){ 8962282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 8972282792aSdrh int amt = pParse->nAgg + 8; 8982282792aSdrh pParse->aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 8992282792aSdrh if( pParse->aAgg==0 ){ 900daffd0e5Sdrh pParse->nAgg = 0; 9012282792aSdrh return -1; 9022282792aSdrh } 9032282792aSdrh } 9042282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 9052282792aSdrh return pParse->nAgg++; 9062282792aSdrh } 9072282792aSdrh 9082282792aSdrh /* 9092282792aSdrh ** Analyze the given expression looking for aggregate functions and 9102282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 9112282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 9122282792aSdrh ** 9132282792aSdrh ** This routine should only be called after the expression has been 9142282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 9152282792aSdrh ** 9162282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 9172282792aSdrh ** the number of errors. 9182282792aSdrh */ 9192282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 9202282792aSdrh int i; 9212282792aSdrh AggExpr *aAgg; 9222282792aSdrh int nErr = 0; 9232282792aSdrh 9242282792aSdrh if( pExpr==0 ) return 0; 9252282792aSdrh switch( pExpr->op ){ 926967e8b73Sdrh case TK_COLUMN: { 9272282792aSdrh aAgg = pParse->aAgg; 9282282792aSdrh for(i=0; i<pParse->nAgg; i++){ 9292282792aSdrh if( aAgg[i].isAgg ) continue; 9302282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 931967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 9322282792aSdrh break; 9332282792aSdrh } 9342282792aSdrh } 9352282792aSdrh if( i>=pParse->nAgg ){ 9362282792aSdrh i = appendAggInfo(pParse); 9372282792aSdrh if( i<0 ) return 1; 9382282792aSdrh pParse->aAgg[i].isAgg = 0; 9392282792aSdrh pParse->aAgg[i].pExpr = pExpr; 9402282792aSdrh } 941aaf88729Sdrh pExpr->iAgg = i; 9422282792aSdrh break; 9432282792aSdrh } 9442282792aSdrh case TK_AGG_FUNCTION: { 945967e8b73Sdrh if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){ 9462282792aSdrh if( pParse->iAggCount>=0 ){ 9472282792aSdrh i = pParse->iAggCount; 9482282792aSdrh }else{ 9492282792aSdrh i = appendAggInfo(pParse); 9502282792aSdrh if( i<0 ) return 1; 9512282792aSdrh pParse->aAgg[i].isAgg = 1; 9522282792aSdrh pParse->aAgg[i].pExpr = 0; 9532282792aSdrh pParse->iAggCount = i; 9542282792aSdrh } 955967e8b73Sdrh if( pExpr->iColumn==FN_Count ){ 9562282792aSdrh pExpr->iAgg = i; 9572282792aSdrh break; 9582282792aSdrh } 9592282792aSdrh } 9602282792aSdrh aAgg = pParse->aAgg; 9612282792aSdrh for(i=0; i<pParse->nAgg; i++){ 9622282792aSdrh if( !aAgg[i].isAgg ) continue; 963d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 9642282792aSdrh break; 9652282792aSdrh } 9662282792aSdrh } 9672282792aSdrh if( i>=pParse->nAgg ){ 9682282792aSdrh i = appendAggInfo(pParse); 9692282792aSdrh if( i<0 ) return 1; 9702282792aSdrh pParse->aAgg[i].isAgg = 1; 9712282792aSdrh pParse->aAgg[i].pExpr = pExpr; 9722282792aSdrh } 9732282792aSdrh pExpr->iAgg = i; 9742282792aSdrh break; 9752282792aSdrh } 9762282792aSdrh default: { 9772282792aSdrh if( pExpr->pLeft ){ 9782282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 9792282792aSdrh } 9802282792aSdrh if( nErr==0 && pExpr->pRight ){ 9812282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 9822282792aSdrh } 9832282792aSdrh if( nErr==0 && pExpr->pList ){ 9842282792aSdrh int n = pExpr->pList->nExpr; 9852282792aSdrh int i; 9862282792aSdrh for(i=0; nErr==0 && i<n; i++){ 9872282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 9882282792aSdrh } 9892282792aSdrh } 9902282792aSdrh break; 9912282792aSdrh } 9922282792aSdrh } 9932282792aSdrh return nErr; 9942282792aSdrh } 995