1cce7d176Sdrh /* 2cce7d176Sdrh ** Copyright (c) 1999, 2000 D. Richard Hipp 3cce7d176Sdrh ** 4cce7d176Sdrh ** This program is free software; you can redistribute it and/or 5cce7d176Sdrh ** modify it under the terms of the GNU General Public 6cce7d176Sdrh ** License as published by the Free Software Foundation; either 7cce7d176Sdrh ** version 2 of the License, or (at your option) any later version. 8cce7d176Sdrh ** 9cce7d176Sdrh ** This program is distributed in the hope that it will be useful, 10cce7d176Sdrh ** but WITHOUT ANY WARRANTY; without even the implied warranty of 11cce7d176Sdrh ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cce7d176Sdrh ** General Public License for more details. 13cce7d176Sdrh ** 14cce7d176Sdrh ** You should have received a copy of the GNU General Public 15cce7d176Sdrh ** License along with this library; if not, write to the 16cce7d176Sdrh ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17cce7d176Sdrh ** Boston, MA 02111-1307, USA. 18cce7d176Sdrh ** 19cce7d176Sdrh ** Author contact information: 20cce7d176Sdrh ** [email protected] 21cce7d176Sdrh ** http://www.hwaci.com/drh/ 22cce7d176Sdrh ** 23cce7d176Sdrh ************************************************************************* 24cce7d176Sdrh ** This file contains C code routines used for processing expressions 25cce7d176Sdrh ** 26*4cfa7934Sdrh ** $Id: expr.c,v 1.14 2000/06/08 15:10:47 drh Exp $ 27cce7d176Sdrh */ 28cce7d176Sdrh #include "sqliteInt.h" 29cce7d176Sdrh 30cce7d176Sdrh /* 31fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 32fef5208cSdrh ** and 0 if it involves variables. 33fef5208cSdrh */ 34fef5208cSdrh static int isConstant(Expr *p){ 35fef5208cSdrh switch( p->op ){ 36fef5208cSdrh case TK_ID: 37fef5208cSdrh case TK_FIELD: 38fef5208cSdrh case TK_DOT: 39fef5208cSdrh return 0; 40fef5208cSdrh default: { 41fef5208cSdrh if( p->pLeft && !isConstant(p->pLeft) ) return 0; 42fef5208cSdrh if( p->pRight && !isConstant(p->pRight) ) return 0; 43fef5208cSdrh if( p->pList ){ 44fef5208cSdrh int i; 45fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 46fef5208cSdrh if( !isConstant(p->pList->a[i].pExpr) ) return 0; 47fef5208cSdrh } 48fef5208cSdrh } 49fef5208cSdrh break; 50fef5208cSdrh } 51fef5208cSdrh } 52fef5208cSdrh return 1; 53fef5208cSdrh } 54fef5208cSdrh 55fef5208cSdrh /* 564794b980Sdrh ** Walk the expression tree and process operators of the form: 574794b980Sdrh ** 584794b980Sdrh ** expr IN (SELECT ...) 594794b980Sdrh ** 604794b980Sdrh ** These operators have to be processed before field names are 614794b980Sdrh ** resolved because each such operator increments pParse->nTab 624794b980Sdrh ** to reserve a cursor number for its own use. But pParse->nTab 634794b980Sdrh ** needs to be constant once we begin resolving field names. 644794b980Sdrh ** 654794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this 664794b980Sdrh ** routine. This routine allocates a cursor number to the IN-SELECT 674794b980Sdrh ** and then moves on. The code generation is done by 684794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards. 694794b980Sdrh */ 704794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){ 714794b980Sdrh if( pExpr==0 ) return; 724794b980Sdrh if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){ 734794b980Sdrh pExpr->iTable = pParse->nTab++; 744794b980Sdrh }else{ 754794b980Sdrh if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft); 764794b980Sdrh if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight); 774794b980Sdrh if( pExpr->pList ){ 784794b980Sdrh int i; 794794b980Sdrh ExprList *pList = pExpr->pList; 804794b980Sdrh for(i=0; i<pList->nExpr; i++){ 814794b980Sdrh sqliteExprResolveInSelect(pParse, pList->a[i].pExpr); 824794b980Sdrh } 834794b980Sdrh } 844794b980Sdrh } 854794b980Sdrh } 864794b980Sdrh 874794b980Sdrh /* 88cce7d176Sdrh ** This routine walks an expression tree and resolves references to 89cce7d176Sdrh ** table fields. Nodes of the form ID.ID or ID resolve into an 90cce7d176Sdrh ** index to the table in the table list and a field offset. The opcode 91cce7d176Sdrh ** for such nodes is changed to TK_FIELD. The iTable value is changed 9219a775c2Sdrh ** to the index of the referenced table in pTabList plus the pParse->nTab 9319a775c2Sdrh ** value. The iField value is changed to the index of the field of the 9419a775c2Sdrh ** referenced table. 9519a775c2Sdrh ** 96fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 97fef5208cSdrh ** forms: 98fef5208cSdrh ** 99fef5208cSdrh ** expr IN (exprlist) 100fef5208cSdrh ** and 101fef5208cSdrh ** expr IN (SELECT ...) 102fef5208cSdrh ** 103fef5208cSdrh ** The first form is handled by creating a set holding the list 104fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 105fef5208cSdrh ** a temporary table. 106fef5208cSdrh ** 107fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 10819a775c2Sdrh ** If it finds any, it generates code to write the value of that select 10919a775c2Sdrh ** into a memory cell. 110cce7d176Sdrh ** 111cce7d176Sdrh ** Unknown fields or tables provoke an error. The function returns 112cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 113cce7d176Sdrh */ 114cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){ 115cce7d176Sdrh if( pExpr==0 ) return 0; 116cce7d176Sdrh switch( pExpr->op ){ 117cce7d176Sdrh /* A lone identifier */ 118cce7d176Sdrh case TK_ID: { 119cce7d176Sdrh int cnt = 0; /* Number of matches */ 120cce7d176Sdrh int i; /* Loop counter */ 1216e142f54Sdrh char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 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; 130cce7d176Sdrh pExpr->iField = j; 131cce7d176Sdrh } 132cce7d176Sdrh } 133cce7d176Sdrh } 134cce7d176Sdrh sqliteFree(z); 135cce7d176Sdrh if( cnt==0 ){ 136cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1, 137cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 138cce7d176Sdrh pParse->nErr++; 139cce7d176Sdrh return 1; 140cce7d176Sdrh }else if( cnt>1 ){ 141cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1, 142cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 143cce7d176Sdrh pParse->nErr++; 144cce7d176Sdrh return 1; 145cce7d176Sdrh } 146cce7d176Sdrh pExpr->op = TK_FIELD; 147cce7d176Sdrh break; 148cce7d176Sdrh } 149cce7d176Sdrh 150cce7d176Sdrh /* A table name and field name: ID.ID */ 151cce7d176Sdrh case TK_DOT: { 152cce7d176Sdrh int cnt = 0; /* Number of matches */ 153cce7d176Sdrh int i; /* Loop counter */ 154cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 155cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 156cce7d176Sdrh 157cce7d176Sdrh pLeft = pExpr->pLeft; 158cce7d176Sdrh pRight = pExpr->pRight; 159cce7d176Sdrh assert( pLeft && pLeft->op==TK_ID ); 160cce7d176Sdrh assert( pRight && pRight->op==TK_ID ); 1616e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 1626e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 163cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 164cce7d176Sdrh int j; 165cce7d176Sdrh char *zTab; 166cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 167cce7d176Sdrh if( pTab==0 ) continue; 168cce7d176Sdrh if( pTabList->a[i].zAlias ){ 169cce7d176Sdrh zTab = pTabList->a[i].zAlias; 170cce7d176Sdrh }else{ 171cce7d176Sdrh zTab = pTab->zName; 172cce7d176Sdrh } 173cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 174cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 1757020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 176cce7d176Sdrh cnt++; 17719a775c2Sdrh pExpr->iTable = i + pParse->nTab; 178cce7d176Sdrh pExpr->iField = j; 179cce7d176Sdrh } 180cce7d176Sdrh } 181cce7d176Sdrh } 182cce7d176Sdrh sqliteFree(zLeft); 183cce7d176Sdrh sqliteFree(zRight); 184cce7d176Sdrh if( cnt==0 ){ 185cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1, 186cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 187cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 188cce7d176Sdrh pParse->nErr++; 189cce7d176Sdrh return 1; 190cce7d176Sdrh }else if( cnt>1 ){ 191cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1, 192cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 193cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 194cce7d176Sdrh pParse->nErr++; 195cce7d176Sdrh return 1; 196cce7d176Sdrh } 197cce7d176Sdrh sqliteExprDelete(pLeft); 198cce7d176Sdrh pExpr->pLeft = 0; 199cce7d176Sdrh sqliteExprDelete(pRight); 200cce7d176Sdrh pExpr->pRight = 0; 201cce7d176Sdrh pExpr->op = TK_FIELD; 202cce7d176Sdrh break; 203cce7d176Sdrh } 204cce7d176Sdrh 205fef5208cSdrh case TK_IN: { 206d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 207fef5208cSdrh if( v==0 ) return 1; 208cfab11bcSdrh if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 209cfab11bcSdrh return 1; 210cfab11bcSdrh } 211fef5208cSdrh if( pExpr->pSelect ){ 212fef5208cSdrh /* Case 1: expr IN (SELECT ...) 213fef5208cSdrh ** 214fef5208cSdrh ** Generate code to write the results of the select into a temporary 2154794b980Sdrh ** table. The cursor number of the temporary table has already 2164794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 217fef5208cSdrh */ 2184794b980Sdrh sqliteVdbeAddOp(v, OP_Open, pExpr->iTable, 1, 0, 0); 219fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 220fef5208cSdrh }else if( pExpr->pList ){ 221fef5208cSdrh /* Case 2: expr IN (exprlist) 222fef5208cSdrh ** 223fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 224fef5208cSdrh ** in iTable. 225fef5208cSdrh */ 226fef5208cSdrh int i, iSet; 227fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 228fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 229fef5208cSdrh if( !isConstant(pE2) ){ 230fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 231fef5208cSdrh "right-hand side of IN operator must be constant", 0); 232fef5208cSdrh pParse->nErr++; 233fef5208cSdrh return 1; 234fef5208cSdrh } 2354794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 2364794b980Sdrh return 1; 2374794b980Sdrh } 238fef5208cSdrh } 239fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 240fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 241fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 242fef5208cSdrh switch( pE2->op ){ 243fef5208cSdrh case TK_FLOAT: 244fef5208cSdrh case TK_INTEGER: 245fef5208cSdrh case TK_STRING: { 246fef5208cSdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 247fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 248fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 249fef5208cSdrh break; 250fef5208cSdrh } 251fef5208cSdrh default: { 252fef5208cSdrh sqliteExprCode(pParse, pE2); 253fef5208cSdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 254fef5208cSdrh break; 255fef5208cSdrh } 256fef5208cSdrh } 257fef5208cSdrh } 258fef5208cSdrh } 259cfab11bcSdrh break; 260fef5208cSdrh } 261fef5208cSdrh 26219a775c2Sdrh case TK_SELECT: { 263fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 264fef5208cSdrh ** value of this select in a memory cell and record the number 265fef5208cSdrh ** of the memory cell in iField. 266fef5208cSdrh */ 26719a775c2Sdrh pExpr->iField = pParse->nMem++; 268fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iField) ){ 26919a775c2Sdrh return 1; 27019a775c2Sdrh } 27119a775c2Sdrh break; 27219a775c2Sdrh } 27319a775c2Sdrh 274cce7d176Sdrh /* For all else, just recursively walk the tree */ 275cce7d176Sdrh default: { 276cce7d176Sdrh if( pExpr->pLeft 277cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 278cce7d176Sdrh return 1; 279cce7d176Sdrh } 280cce7d176Sdrh if( pExpr->pRight 281cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){ 282cce7d176Sdrh return 1; 283cce7d176Sdrh } 284cce7d176Sdrh if( pExpr->pList ){ 285cce7d176Sdrh int i; 286cce7d176Sdrh ExprList *pList = pExpr->pList; 287cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 288cce7d176Sdrh if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){ 289cce7d176Sdrh return 1; 290cce7d176Sdrh } 291cce7d176Sdrh } 292cce7d176Sdrh } 293cce7d176Sdrh } 294cce7d176Sdrh } 295cce7d176Sdrh return 0; 296cce7d176Sdrh } 297cce7d176Sdrh 298cce7d176Sdrh #if 0 /* NOT USED */ 299cce7d176Sdrh /* 300cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 301cce7d176Sdrh */ 302cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 303cce7d176Sdrh int n = strlen(zStr); 304cce7d176Sdrh if( n!=pToken->n ) return 0; 305cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 306cce7d176Sdrh } 307cce7d176Sdrh #endif 308cce7d176Sdrh 309cce7d176Sdrh /* 310cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 311cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 312cce7d176Sdrh */ 313cce7d176Sdrh int sqliteFuncId(Token *pToken){ 314cce7d176Sdrh static const struct { 315cce7d176Sdrh char *zName; 316cce7d176Sdrh int len; 317cce7d176Sdrh int id; 318cce7d176Sdrh } aFunc[] = { 319cce7d176Sdrh { "count", 5, FN_Count }, 320cce7d176Sdrh { "min", 3, FN_Min }, 321cce7d176Sdrh { "max", 3, FN_Max }, 322cce7d176Sdrh { "sum", 3, FN_Sum }, 3232282792aSdrh { "avg", 3, FN_Avg }, 324cce7d176Sdrh }; 325cce7d176Sdrh int i; 326cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 327cce7d176Sdrh if( aFunc[i].len==pToken->n 328cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 329cce7d176Sdrh return aFunc[i].id; 330cce7d176Sdrh } 331cce7d176Sdrh } 332cce7d176Sdrh return FN_Unknown; 333cce7d176Sdrh } 334cce7d176Sdrh 335cce7d176Sdrh /* 336cce7d176Sdrh ** Error check the functions in an expression. Make sure all 337cce7d176Sdrh ** function names are recognized and all functions have the correct 338cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 339cce7d176Sdrh ** if anything is amiss. Return the number of errors. 340cce7d176Sdrh ** 341cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 342cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 343cce7d176Sdrh */ 344cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 345cce7d176Sdrh int nErr = 0; 346cce7d176Sdrh if( pExpr==0 ) return 0; 347cce7d176Sdrh switch( pExpr->op ){ 348cce7d176Sdrh case TK_FUNCTION: { 349cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 350cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 351cce7d176Sdrh int no_such_func = 0; 352cce7d176Sdrh int too_many_args = 0; 353cce7d176Sdrh int too_few_args = 0; 354cce7d176Sdrh int is_agg = 0; 355cce7d176Sdrh int i; 3562282792aSdrh pExpr->iField = id; 357cce7d176Sdrh switch( id ){ 358cce7d176Sdrh case FN_Unknown: { 359cce7d176Sdrh no_such_func = 1; 360cce7d176Sdrh break; 361cce7d176Sdrh } 362cce7d176Sdrh case FN_Count: { 363cce7d176Sdrh no_such_func = !allowAgg; 364cce7d176Sdrh too_many_args = n>1; 365cce7d176Sdrh is_agg = 1; 366cce7d176Sdrh break; 367cce7d176Sdrh } 368cce7d176Sdrh case FN_Max: 369cce7d176Sdrh case FN_Min: { 370cce7d176Sdrh too_few_args = allowAgg ? n<1 : n<2; 371cce7d176Sdrh is_agg = n==1; 372cce7d176Sdrh break; 373cce7d176Sdrh } 3742282792aSdrh case FN_Avg: 375cce7d176Sdrh case FN_Sum: { 376cce7d176Sdrh no_such_func = !allowAgg; 377cce7d176Sdrh too_many_args = n>1; 378cce7d176Sdrh too_few_args = n<1; 379cce7d176Sdrh is_agg = 1; 380cce7d176Sdrh break; 381cce7d176Sdrh } 382cce7d176Sdrh default: break; 383cce7d176Sdrh } 384cce7d176Sdrh if( no_such_func ){ 385cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 386cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 387cce7d176Sdrh pParse->nErr++; 388cce7d176Sdrh nErr++; 389cce7d176Sdrh }else if( too_many_args ){ 390cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 391cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 392cce7d176Sdrh pParse->nErr++; 393cce7d176Sdrh nErr++; 394cce7d176Sdrh }else if( too_few_args ){ 395cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 396cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 397cce7d176Sdrh pParse->nErr++; 398cce7d176Sdrh nErr++; 399cce7d176Sdrh } 4002282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 401cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 402cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 403*4cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 404*4cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 405cce7d176Sdrh } 406cce7d176Sdrh } 407cce7d176Sdrh default: { 408cce7d176Sdrh if( pExpr->pLeft ){ 4092282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 410cce7d176Sdrh } 411cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 4122282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 413cce7d176Sdrh } 414fef5208cSdrh if( nErr==0 && pExpr->pList ){ 415fef5208cSdrh int n = pExpr->pList->nExpr; 416fef5208cSdrh int i; 417fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 4182282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 4192282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 420fef5208cSdrh } 421fef5208cSdrh } 422cce7d176Sdrh break; 423cce7d176Sdrh } 424cce7d176Sdrh } 425cce7d176Sdrh return nErr; 426cce7d176Sdrh } 427cce7d176Sdrh 428cce7d176Sdrh /* 429cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 430cce7d176Sdrh ** expression and leave the result on the stack. 431cce7d176Sdrh */ 432cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 433cce7d176Sdrh Vdbe *v = pParse->pVdbe; 434cce7d176Sdrh int op; 435cce7d176Sdrh switch( pExpr->op ){ 436cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 437cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 438cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 439cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 440cce7d176Sdrh case TK_AND: op = OP_And; break; 441cce7d176Sdrh case TK_OR: op = OP_Or; break; 442cce7d176Sdrh case TK_LT: op = OP_Lt; break; 443cce7d176Sdrh case TK_LE: op = OP_Le; break; 444cce7d176Sdrh case TK_GT: op = OP_Gt; break; 445cce7d176Sdrh case TK_GE: op = OP_Ge; break; 446cce7d176Sdrh case TK_NE: op = OP_Ne; break; 447cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 448cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 449cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 450cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 451cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 452cce7d176Sdrh case TK_NOT: op = OP_Not; break; 453cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 454cce7d176Sdrh default: break; 455cce7d176Sdrh } 456cce7d176Sdrh switch( pExpr->op ){ 457cce7d176Sdrh case TK_FIELD: { 4582282792aSdrh if( pParse->useAgg ){ 4592282792aSdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0); 4602282792aSdrh }else{ 461cce7d176Sdrh sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iField, 0, 0); 4622282792aSdrh } 463cce7d176Sdrh break; 464cce7d176Sdrh } 465cce7d176Sdrh case TK_INTEGER: { 466cce7d176Sdrh int i = atoi(pExpr->token.z); 467cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); 468cce7d176Sdrh break; 469cce7d176Sdrh } 470cce7d176Sdrh case TK_FLOAT: { 471cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 472cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 473cce7d176Sdrh break; 474cce7d176Sdrh } 475cce7d176Sdrh case TK_STRING: { 476cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 477cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 478cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 479cce7d176Sdrh break; 480cce7d176Sdrh } 481cce7d176Sdrh case TK_NULL: { 482c61053b7Sdrh sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0); 483cce7d176Sdrh break; 484cce7d176Sdrh } 485cce7d176Sdrh case TK_AND: 486cce7d176Sdrh case TK_OR: 487cce7d176Sdrh case TK_PLUS: 488cce7d176Sdrh case TK_STAR: 489cce7d176Sdrh case TK_MINUS: 490cce7d176Sdrh case TK_SLASH: { 491cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 492cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 493cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 494cce7d176Sdrh break; 495cce7d176Sdrh } 496cce7d176Sdrh case TK_LT: 497cce7d176Sdrh case TK_LE: 498cce7d176Sdrh case TK_GT: 499cce7d176Sdrh case TK_GE: 500cce7d176Sdrh case TK_NE: 501cce7d176Sdrh case TK_EQ: 502cce7d176Sdrh case TK_LIKE: 503cce7d176Sdrh case TK_GLOB: { 504cce7d176Sdrh int dest; 505cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 506cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 507cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 508cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 509cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 510cce7d176Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 511cce7d176Sdrh break; 512cce7d176Sdrh } 513cce7d176Sdrh case TK_UMINUS: { 5146e142f54Sdrh assert( pExpr->pLeft ); 5156e142f54Sdrh if( pExpr->pLeft->op==TK_INTEGER ){ 5166e142f54Sdrh int i = atoi(pExpr->pLeft->token.z); 5176e142f54Sdrh sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0); 5186e142f54Sdrh break; 5196e142f54Sdrh }else if( pExpr->pLeft->op==TK_FLOAT ){ 5206e142f54Sdrh Token *p = &pExpr->pLeft->token; 5216e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 5226e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 5236e142f54Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0); 5246e142f54Sdrh sqliteFree(z); 5256e142f54Sdrh break; 5266e142f54Sdrh } 5276e142f54Sdrh /* Fall true into TK_NOT */ 5286e142f54Sdrh } 5296e142f54Sdrh case TK_NOT: { 530cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 531cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 532cce7d176Sdrh break; 533cce7d176Sdrh } 534cce7d176Sdrh case TK_ISNULL: 535cce7d176Sdrh case TK_NOTNULL: { 536cce7d176Sdrh int dest; 5378be51133Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 538cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 539cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 540cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 5418be51133Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 542cce7d176Sdrh break; 543cce7d176Sdrh } 5442282792aSdrh case TK_AGG_FUNCTION: { 5452282792aSdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0); 5462282792aSdrh if( pExpr->iField==FN_Avg ){ 5472282792aSdrh assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); 5482282792aSdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0); 5492282792aSdrh sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0); 5502282792aSdrh } 5512282792aSdrh break; 5522282792aSdrh } 553cce7d176Sdrh case TK_FUNCTION: { 5542282792aSdrh int id = pExpr->iField; 555cce7d176Sdrh int op; 556cce7d176Sdrh int i; 557cce7d176Sdrh ExprList *pList = pExpr->pList; 558cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 559cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 560cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 561cce7d176Sdrh if( i>0 ){ 562cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 563cce7d176Sdrh } 564cce7d176Sdrh } 565cce7d176Sdrh break; 566cce7d176Sdrh } 56719a775c2Sdrh case TK_SELECT: { 56819a775c2Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iField, 0, 0, 0); 56919a775c2Sdrh break; 57019a775c2Sdrh } 571fef5208cSdrh case TK_IN: { 572fef5208cSdrh int addr; 5734794b980Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 574fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 575fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 576fef5208cSdrh if( pExpr->pSelect ){ 577fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0); 578fef5208cSdrh }else{ 579fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0); 580fef5208cSdrh } 5814794b980Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 582fef5208cSdrh break; 583fef5208cSdrh } 584fef5208cSdrh case TK_BETWEEN: { 585fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 586fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 587fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 588fef5208cSdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0); 589fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 590fef5208cSdrh break; 591fef5208cSdrh } 592cce7d176Sdrh } 593cce7d176Sdrh return; 594cce7d176Sdrh } 595cce7d176Sdrh 596cce7d176Sdrh /* 597cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 598cce7d176Sdrh ** to the label "dest" if the expression is true but execution 599cce7d176Sdrh ** continues straight thru if the expression is false. 600cce7d176Sdrh */ 601cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 602cce7d176Sdrh Vdbe *v = pParse->pVdbe; 603cce7d176Sdrh int op = 0; 604cce7d176Sdrh switch( pExpr->op ){ 605cce7d176Sdrh case TK_LT: op = OP_Lt; break; 606cce7d176Sdrh case TK_LE: op = OP_Le; break; 607cce7d176Sdrh case TK_GT: op = OP_Gt; break; 608cce7d176Sdrh case TK_GE: op = OP_Ge; break; 609cce7d176Sdrh case TK_NE: op = OP_Ne; break; 610cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 611cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 612cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 613cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 614cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 615cce7d176Sdrh default: break; 616cce7d176Sdrh } 617cce7d176Sdrh switch( pExpr->op ){ 618cce7d176Sdrh case TK_AND: { 619cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 620cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 621cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 622cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 623cce7d176Sdrh break; 624cce7d176Sdrh } 625cce7d176Sdrh case TK_OR: { 626cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 627cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 628cce7d176Sdrh break; 629cce7d176Sdrh } 630cce7d176Sdrh case TK_NOT: { 631cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 632cce7d176Sdrh break; 633cce7d176Sdrh } 634cce7d176Sdrh case TK_LT: 635cce7d176Sdrh case TK_LE: 636cce7d176Sdrh case TK_GT: 637cce7d176Sdrh case TK_GE: 638cce7d176Sdrh case TK_NE: 639cce7d176Sdrh case TK_EQ: 640cce7d176Sdrh case TK_LIKE: 641cce7d176Sdrh case TK_GLOB: { 642cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 643cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 644cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 645cce7d176Sdrh break; 646cce7d176Sdrh } 647cce7d176Sdrh case TK_ISNULL: 648cce7d176Sdrh case TK_NOTNULL: { 649cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 650cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 651cce7d176Sdrh break; 652cce7d176Sdrh } 653fef5208cSdrh case TK_IN: { 654cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 655fef5208cSdrh if( pExpr->pSelect ){ 656fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0); 657fef5208cSdrh }else{ 658fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0); 659fef5208cSdrh } 660fef5208cSdrh break; 661fef5208cSdrh } 662fef5208cSdrh case TK_BETWEEN: { 663fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 664fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 665fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 666fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 667fef5208cSdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0); 668fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 669fef5208cSdrh sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0); 670fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 671fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl); 672fef5208cSdrh break; 673fef5208cSdrh } 674cce7d176Sdrh default: { 675cce7d176Sdrh sqliteExprCode(pParse, pExpr); 676cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 677cce7d176Sdrh break; 678cce7d176Sdrh } 679cce7d176Sdrh } 680cce7d176Sdrh } 681cce7d176Sdrh 682cce7d176Sdrh /* 683cce7d176Sdrh ** Generate code for boolean expression such that a jump is made 684cce7d176Sdrh ** to the label "dest" if the expression is false but execution 685cce7d176Sdrh ** continues straight thru if the expression is true. 686cce7d176Sdrh */ 687cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 688cce7d176Sdrh Vdbe *v = pParse->pVdbe; 689cce7d176Sdrh int op = 0; 690cce7d176Sdrh switch( pExpr->op ){ 691cce7d176Sdrh case TK_LT: op = OP_Ge; break; 692cce7d176Sdrh case TK_LE: op = OP_Gt; break; 693cce7d176Sdrh case TK_GT: op = OP_Le; break; 694cce7d176Sdrh case TK_GE: op = OP_Lt; break; 695cce7d176Sdrh case TK_NE: op = OP_Eq; break; 696cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 697cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 698cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 699cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 700cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 701cce7d176Sdrh default: break; 702cce7d176Sdrh } 703cce7d176Sdrh switch( pExpr->op ){ 704cce7d176Sdrh case TK_AND: { 705cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 706cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 707cce7d176Sdrh break; 708cce7d176Sdrh } 709cce7d176Sdrh case TK_OR: { 710cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 711cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 712cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 713cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 714cce7d176Sdrh break; 715cce7d176Sdrh } 716cce7d176Sdrh case TK_NOT: { 717cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 718cce7d176Sdrh break; 719cce7d176Sdrh } 720cce7d176Sdrh case TK_LT: 721cce7d176Sdrh case TK_LE: 722cce7d176Sdrh case TK_GT: 723cce7d176Sdrh case TK_GE: 724cce7d176Sdrh case TK_NE: 725cce7d176Sdrh case TK_EQ: { 726cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 727cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 728cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 729cce7d176Sdrh break; 730cce7d176Sdrh } 731cce7d176Sdrh case TK_LIKE: 732cce7d176Sdrh case TK_GLOB: { 733cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 734cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 735cce7d176Sdrh sqliteVdbeAddOp(v, op, 1, dest, 0, 0); 736cce7d176Sdrh break; 737cce7d176Sdrh } 738cce7d176Sdrh case TK_ISNULL: 739cce7d176Sdrh case TK_NOTNULL: { 740cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 741cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 742cce7d176Sdrh break; 743cce7d176Sdrh } 744fef5208cSdrh case TK_IN: { 745cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 746fef5208cSdrh if( pExpr->pSelect ){ 747fef5208cSdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0); 748fef5208cSdrh }else{ 749fef5208cSdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0); 750fef5208cSdrh } 751fef5208cSdrh break; 752fef5208cSdrh } 753fef5208cSdrh case TK_BETWEEN: { 754fef5208cSdrh int addr; 755fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 756fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 757fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 758fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 759fef5208cSdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0); 760fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0); 761fef5208cSdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0); 762fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 763fef5208cSdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0); 764fef5208cSdrh break; 765fef5208cSdrh } 766cce7d176Sdrh default: { 767cce7d176Sdrh sqliteExprCode(pParse, pExpr); 768cce7d176Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0); 769cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 770cce7d176Sdrh break; 771cce7d176Sdrh } 772cce7d176Sdrh } 773cce7d176Sdrh } 7742282792aSdrh 7752282792aSdrh /* 7762282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 7772282792aSdrh ** if they are identical and return FALSE if they differ in any way. 7782282792aSdrh */ 779d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 7802282792aSdrh int i; 7812282792aSdrh if( pA==0 ){ 7822282792aSdrh return pB==0; 7832282792aSdrh }else if( pB==0 ){ 7842282792aSdrh return 0; 7852282792aSdrh } 7862282792aSdrh if( pA->op!=pB->op ) return 0; 787d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 788d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 7892282792aSdrh if( pA->pList ){ 7902282792aSdrh if( pB->pList==0 ) return 0; 7912282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 7922282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 793d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 7942282792aSdrh return 0; 7952282792aSdrh } 7962282792aSdrh } 7972282792aSdrh }else if( pB->pList ){ 7982282792aSdrh return 0; 7992282792aSdrh } 8002282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 8012282792aSdrh if( pA->token.z ){ 8022282792aSdrh if( pB->token.z==0 ) return 0; 8032282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 8042282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 8052282792aSdrh } 8062282792aSdrh return 1; 8072282792aSdrh } 8082282792aSdrh 8092282792aSdrh /* 8102282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 8112282792aSdrh */ 8122282792aSdrh static int appendAggInfo(Parse *pParse){ 8132282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 8142282792aSdrh int amt = pParse->nAgg + 8; 8152282792aSdrh pParse->aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 8162282792aSdrh if( pParse->aAgg==0 ){ 8172282792aSdrh sqliteSetString(&pParse->zErrMsg, "out of memory", 0); 8182282792aSdrh pParse->nErr++; 8192282792aSdrh return -1; 8202282792aSdrh } 8212282792aSdrh } 8222282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 8232282792aSdrh return pParse->nAgg++; 8242282792aSdrh } 8252282792aSdrh 8262282792aSdrh /* 8272282792aSdrh ** Analyze the given expression looking for aggregate functions and 8282282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 8292282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 8302282792aSdrh ** 8312282792aSdrh ** This routine should only be called after the expression has been 8322282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 8332282792aSdrh ** 8342282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 8352282792aSdrh ** the number of errors. 8362282792aSdrh */ 8372282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 8382282792aSdrh int i; 8392282792aSdrh AggExpr *aAgg; 8402282792aSdrh int nErr = 0; 8412282792aSdrh 8422282792aSdrh if( pExpr==0 ) return 0; 8432282792aSdrh switch( pExpr->op ){ 8442282792aSdrh case TK_FIELD: { 8452282792aSdrh aAgg = pParse->aAgg; 8462282792aSdrh for(i=0; i<pParse->nAgg; i++){ 8472282792aSdrh if( aAgg[i].isAgg ) continue; 8482282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 8492282792aSdrh && aAgg[i].pExpr->iField==pExpr->iField ){ 8502282792aSdrh break; 8512282792aSdrh } 8522282792aSdrh } 8532282792aSdrh if( i>=pParse->nAgg ){ 8542282792aSdrh i = appendAggInfo(pParse); 8552282792aSdrh if( i<0 ) return 1; 8562282792aSdrh pParse->aAgg[i].isAgg = 0; 8572282792aSdrh pParse->aAgg[i].pExpr = pExpr; 8582282792aSdrh } 859aaf88729Sdrh pExpr->iAgg = i; 8602282792aSdrh break; 8612282792aSdrh } 8622282792aSdrh case TK_AGG_FUNCTION: { 8632282792aSdrh if( pExpr->iField==FN_Count || pExpr->iField==FN_Avg ){ 8642282792aSdrh if( pParse->iAggCount>=0 ){ 8652282792aSdrh i = pParse->iAggCount; 8662282792aSdrh }else{ 8672282792aSdrh i = appendAggInfo(pParse); 8682282792aSdrh if( i<0 ) return 1; 8692282792aSdrh pParse->aAgg[i].isAgg = 1; 8702282792aSdrh pParse->aAgg[i].pExpr = 0; 8712282792aSdrh pParse->iAggCount = i; 8722282792aSdrh } 8732282792aSdrh if( pExpr->iField==FN_Count ){ 8742282792aSdrh pExpr->iAgg = i; 8752282792aSdrh break; 8762282792aSdrh } 8772282792aSdrh } 8782282792aSdrh aAgg = pParse->aAgg; 8792282792aSdrh for(i=0; i<pParse->nAgg; i++){ 8802282792aSdrh if( !aAgg[i].isAgg ) continue; 881d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 8822282792aSdrh break; 8832282792aSdrh } 8842282792aSdrh } 8852282792aSdrh if( i>=pParse->nAgg ){ 8862282792aSdrh i = appendAggInfo(pParse); 8872282792aSdrh if( i<0 ) return 1; 8882282792aSdrh pParse->aAgg[i].isAgg = 1; 8892282792aSdrh pParse->aAgg[i].pExpr = pExpr; 8902282792aSdrh } 8912282792aSdrh pExpr->iAgg = i; 8922282792aSdrh break; 8932282792aSdrh } 8942282792aSdrh default: { 8952282792aSdrh if( pExpr->pLeft ){ 8962282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 8972282792aSdrh } 8982282792aSdrh if( nErr==0 && pExpr->pRight ){ 8992282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 9002282792aSdrh } 9012282792aSdrh if( nErr==0 && pExpr->pList ){ 9022282792aSdrh int n = pExpr->pList->nExpr; 9032282792aSdrh int i; 9042282792aSdrh for(i=0; nErr==0 && i<n; i++){ 9052282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 9062282792aSdrh } 9072282792aSdrh } 9082282792aSdrh break; 9092282792aSdrh } 9102282792aSdrh } 9112282792aSdrh return nErr; 9122282792aSdrh } 913