From: drh Date: Tue, 30 Aug 2005 00:54:01 +0000 (+0000) Subject: Minor code enhancements. (CVS 2642) X-Git-Tag: version-3.6.10~3517 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5d9a4af9af921ee6c7cff7970b0ac0ff3bccce34;p=thirdparty%2Fsqlite.git Minor code enhancements. (CVS 2642) FossilOrigin-Name: 4ab994a87ee844f453d693555abd61b51bb44a0e --- diff --git a/manifest b/manifest index ef6646a60f..0cd2efa839 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\shome\spage\sto\sbrag\sabout\s150KiB\scode\sfootprint\swhen\soptional\nfeatures\sare\somitted.\s(CVS\s2641) -D 2005-08-30T00:10:45 +C Minor\scode\senhancements.\s(CVS\s2642) +D 2005-08-30T00:54:02 F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1 F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -40,7 +40,7 @@ F src/complete.c 4de937dfdd4c79a501772ab2035b26082f337a79 F src/date.c 7444b0900a28da77e57e3337a636873cff0ae940 F src/delete.c be1fc25c9e109cd8cbab42a43ee696263da7c04b F src/experimental.c 50c1e3b34f752f4ac10c36f287db095c2b61766d -F src/expr.c 1916cb22c585e1aa0d1e25a8efe7497004b6ae32 +F src/expr.c aef4a3901a5bea6625b9613be9d9ddaccd575bc4 F src/func.c 9da04a6241309a612cf610715944c6a2aaf0f297 F src/hash.c 2b1b13f7400e179631c83a1be0c664608c8f021f F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84 @@ -63,10 +63,10 @@ F src/pragma.c 69413fbdc0c6aaa493a776ea52c1b3e6cf35dfb2 F src/prepare.c 86f0d8e744b8d956eff6bc40e29049efee017610 F src/printf.c cea584c5888688c650d856563aadc4296b5afac7 F src/random.c 90adff4e73a3b249eb4f1fc2a6ff9cf78c7233a4 -F src/select.c f8a9993bcd953eb325c8c3f32985cc52b2947354 +F src/select.c a185b91fd0060a16ada1a32de844d8e570273070 F src/shell.c d2d4ef04732c28a84d108b8413cd4e584754a158 F src/sqlite.h.in d6561d51025d08de4f455607f3f9f9aa76e855d5 -F src/sqliteInt.h f379d29ba17d7082e680c092bce0e6d4bd2d839a +F src/sqliteInt.h 207b63f9782d7faf1f19e694e8052e60841fb377 F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9 F src/tclsqlite.c ac94682f9e601dd373912c46414a5a842db2089a F src/test1.c 810b7563b03efc797f350e9370955120e7072c6f @@ -299,7 +299,7 @@ F www/tclsqlite.tcl 3df553505b6efcad08f91e9b975deb2e6c9bb955 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 71a71cef5b3c97744322ceceb48ac3055512c987 -R 9f0bd6ab83c95af2ee3f859814217549 +P 0e1ac1284c0547af0bb0eb4ff320b9f5ae9c248d +R baaeb5d73948ab9b678cf5ec65e8b13b U drh -Z a72776bd54cae672bcaa8ae9f32804c5 +Z 677bb92f950696e8a5b8946d54c8a93f diff --git a/manifest.uuid b/manifest.uuid index 68a8957c17..2ed8191d79 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e1ac1284c0547af0bb0eb4ff320b9f5ae9c248d \ No newline at end of file +4ab994a87ee844f453d693555abd61b51bb44a0e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 10283ef2e8..3d3655d7ee 100644 --- a/src/expr.c +++ b/src/expr.c @@ -12,7 +12,7 @@ ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.221 2005/08/25 12:45:04 drh Exp $ +** $Id: expr.c,v 1.222 2005/08/30 00:54:02 drh Exp $ */ #include "sqliteInt.h" #include @@ -2071,28 +2071,30 @@ static int appendAggInfo(Parse *pParse){ */ static int analyzeAggregate(void *pArg, Expr *pExpr){ int i; - AggExpr *aAgg; + AggExpr *pAgg; NameContext *pNC = (NameContext *)pArg; Parse *pParse = pNC->pParse; SrcList *pSrcList = pNC->pSrcList; + Expr *pAggExpr; switch( pExpr->op ){ case TK_COLUMN: { for(i=0; pSrcList && inSrc; i++){ if( pExpr->iTable==pSrcList->a[i].iCursor ){ - aAgg = pParse->aAgg; - for(i=0; inAgg; i++){ - if( aAgg[i].isAgg ) continue; - if( aAgg[i].pExpr->iTable==pExpr->iTable - && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ + pAgg = pParse->aAgg; + for(i=0; inAgg; i++, pAgg++){ + if( pAgg->isAgg ) continue; + if( (pAggExpr = pAgg->pExpr)->iTable==pExpr->iTable + && pAggExpr->iColumn==pExpr->iColumn ){ break; } } if( i>=pParse->nAgg ){ i = appendAggInfo(pParse); if( i<0 ) return 1; - pParse->aAgg[i].isAgg = 0; - pParse->aAgg[i].pExpr = pExpr; + pAgg = &pParse->aAgg[i]; + pAgg->isAgg = 0; + pAgg->pExpr = pExpr; } pExpr->iAgg = i; pExpr->iAggCtx = pNC->nDepth; @@ -2103,10 +2105,10 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){ } case TK_AGG_FUNCTION: { if( pNC->nDepth==0 ){ - aAgg = pParse->aAgg; - for(i=0; inAgg; i++){ - if( !aAgg[i].isAgg ) continue; - if( sqlite3ExprCompare(aAgg[i].pExpr, pExpr) ){ + pAgg = pParse->aAgg; + for(i=0; inAgg; i++, pAgg++){ + if( !pAgg->isAgg ) continue; + if( sqlite3ExprCompare(pAgg->pExpr, pExpr) ){ break; } } @@ -2114,9 +2116,10 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){ u8 enc = pParse->db->enc; i = appendAggInfo(pParse); if( i<0 ) return 1; - pParse->aAgg[i].isAgg = 1; - pParse->aAgg[i].pExpr = pExpr; - pParse->aAgg[i].pFunc = sqlite3FindFunction(pParse->db, + pAgg = &pParse->aAgg[i]; + pAgg->isAgg = 1; + pAgg->pExpr = pExpr; + pAgg->pFunc = sqlite3FindFunction(pParse->db, pExpr->token.z, pExpr->token.n, pExpr->pList ? pExpr->pList->nExpr : 0, enc, 0); } @@ -2149,3 +2152,21 @@ int sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ walkExprTree(pExpr, analyzeAggregate, pNC); return pNC->pParse->nErr - nErr; } + +/* +** Call sqlite3ExprAnalyzeAggregates() for every expression in an +** expression list. Return the number of errors. +** +** If an error is found, the analysis is cut short. +*/ +int sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ + struct ExprList_item *pItem; + int i; + int nErr = 0; + if( pList ){ + for(pItem=pList->a, i=0; nErr==0 && inExpr; i++, pItem++){ + nErr += sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); + } + } + return nErr; +} diff --git a/src/select.c b/src/select.c index 33c5f24491..bb8c06e863 100644 --- a/src/select.c +++ b/src/select.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** -** $Id: select.c,v 1.255 2005/08/28 01:34:22 drh Exp $ +** $Id: select.c,v 1.256 2005/08/30 00:54:03 drh Exp $ */ #include "sqliteInt.h" @@ -2632,10 +2632,10 @@ int sqlite3Select( ** names that have been explicitly specified. */ if( pOrderBy ){ - for(i=0; inExpr; i++){ - if( pOrderBy->a[i].zName ){ - pOrderBy->a[i].pExpr->pColl = - sqlite3LocateCollSeq(pParse, pOrderBy->a[i].zName, -1); + struct ExprList_item *pTerm; + for(i=0, pTerm=pOrderBy->a; inExpr; i++, pTerm++){ + if( pTerm->zName ){ + pTerm->pExpr->pColl = sqlite3LocateCollSeq(pParse, pTerm->zName, -1); } } if( pParse->nErr ){ @@ -2664,27 +2664,17 @@ int sqlite3Select( assert( pParse->nAgg==0 ); isAgg = 1; - for(i=0; inExpr; i++){ - if( sqlite3ExprAnalyzeAggregates(&sNC, pEList->a[i].pExpr) ){ - goto select_end; - } + if( sqlite3ExprAnalyzeAggList(&sNC, pEList) ){ + goto select_end; } - if( pGroupBy ){ - for(i=0; inExpr; i++){ - if( sqlite3ExprAnalyzeAggregates(&sNC, pGroupBy->a[i].pExpr) ){ - goto select_end; - } - } + if( sqlite3ExprAnalyzeAggList(&sNC, pGroupBy) ){ + goto select_end; } if( pHaving && sqlite3ExprAnalyzeAggregates(&sNC, pHaving) ){ goto select_end; } - if( pOrderBy ){ - for(i=0; inExpr; i++){ - if( sqlite3ExprAnalyzeAggregates(&sNC, pOrderBy->a[i].pExpr) ){ - goto select_end; - } - } + if( sqlite3ExprAnalyzeAggList(&sNC, pOrderBy) ){ + goto select_end; } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8042ae0473..b391eb3bf6 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.405 2005/08/29 23:00:04 drh Exp $ +** @(#) $Id: sqliteInt.h,v 1.406 2005/08/30 00:54:03 drh Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ @@ -892,6 +892,7 @@ struct ExprList { u8 sortOrder; /* 1 for DESC or 0 for ASC */ u8 isAgg; /* True if this is an aggregate like count(*) */ u8 done; /* A flag to indicate when processing is finished */ + u8 orderByDup[2]; /* Corresponding term in OrderBy/GroupBy clause */ } *a; /* One entry for each expression */ }; @@ -1452,6 +1453,7 @@ int sqlite3ExprCompare(Expr*, Expr*); int sqliteFuncId(Token*); int sqlite3ExprResolveNames(NameContext *, Expr *); int sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); +int sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); Vdbe *sqlite3GetVdbe(Parse*); void sqlite3Randomness(int, void*); void sqlite3RollbackAll(sqlite3*);