mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-08 03:22:21 +03:00
Minor code enhancements. (CVS 2642)
FossilOrigin-Name: 4ab994a87ee844f453d693555abd61b51bb44a0e
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Update\sthe\shome\spage\sto\sbrag\sabout\s150KiB\scode\sfootprint\swhen\soptional\nfeatures\sare\somitted.\s(CVS\s2641)
|
C Minor\scode\senhancements.\s(CVS\s2642)
|
||||||
D 2005-08-30T00:10:45
|
D 2005-08-30T00:54:02
|
||||||
F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1
|
F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1
|
||||||
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
|
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
|
||||||
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
|
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
|
||||||
@@ -40,7 +40,7 @@ F src/complete.c 4de937dfdd4c79a501772ab2035b26082f337a79
|
|||||||
F src/date.c 7444b0900a28da77e57e3337a636873cff0ae940
|
F src/date.c 7444b0900a28da77e57e3337a636873cff0ae940
|
||||||
F src/delete.c be1fc25c9e109cd8cbab42a43ee696263da7c04b
|
F src/delete.c be1fc25c9e109cd8cbab42a43ee696263da7c04b
|
||||||
F src/experimental.c 50c1e3b34f752f4ac10c36f287db095c2b61766d
|
F src/experimental.c 50c1e3b34f752f4ac10c36f287db095c2b61766d
|
||||||
F src/expr.c 1916cb22c585e1aa0d1e25a8efe7497004b6ae32
|
F src/expr.c aef4a3901a5bea6625b9613be9d9ddaccd575bc4
|
||||||
F src/func.c 9da04a6241309a612cf610715944c6a2aaf0f297
|
F src/func.c 9da04a6241309a612cf610715944c6a2aaf0f297
|
||||||
F src/hash.c 2b1b13f7400e179631c83a1be0c664608c8f021f
|
F src/hash.c 2b1b13f7400e179631c83a1be0c664608c8f021f
|
||||||
F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
|
F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
|
||||||
@@ -63,10 +63,10 @@ F src/pragma.c 69413fbdc0c6aaa493a776ea52c1b3e6cf35dfb2
|
|||||||
F src/prepare.c 86f0d8e744b8d956eff6bc40e29049efee017610
|
F src/prepare.c 86f0d8e744b8d956eff6bc40e29049efee017610
|
||||||
F src/printf.c cea584c5888688c650d856563aadc4296b5afac7
|
F src/printf.c cea584c5888688c650d856563aadc4296b5afac7
|
||||||
F src/random.c 90adff4e73a3b249eb4f1fc2a6ff9cf78c7233a4
|
F src/random.c 90adff4e73a3b249eb4f1fc2a6ff9cf78c7233a4
|
||||||
F src/select.c f8a9993bcd953eb325c8c3f32985cc52b2947354
|
F src/select.c a185b91fd0060a16ada1a32de844d8e570273070
|
||||||
F src/shell.c d2d4ef04732c28a84d108b8413cd4e584754a158
|
F src/shell.c d2d4ef04732c28a84d108b8413cd4e584754a158
|
||||||
F src/sqlite.h.in d6561d51025d08de4f455607f3f9f9aa76e855d5
|
F src/sqlite.h.in d6561d51025d08de4f455607f3f9f9aa76e855d5
|
||||||
F src/sqliteInt.h f379d29ba17d7082e680c092bce0e6d4bd2d839a
|
F src/sqliteInt.h 207b63f9782d7faf1f19e694e8052e60841fb377
|
||||||
F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9
|
F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9
|
||||||
F src/tclsqlite.c ac94682f9e601dd373912c46414a5a842db2089a
|
F src/tclsqlite.c ac94682f9e601dd373912c46414a5a842db2089a
|
||||||
F src/test1.c 810b7563b03efc797f350e9370955120e7072c6f
|
F src/test1.c 810b7563b03efc797f350e9370955120e7072c6f
|
||||||
@@ -299,7 +299,7 @@ F www/tclsqlite.tcl 3df553505b6efcad08f91e9b975deb2e6c9bb955
|
|||||||
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
|
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
|
||||||
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
|
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
|
||||||
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
|
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
|
||||||
P 71a71cef5b3c97744322ceceb48ac3055512c987
|
P 0e1ac1284c0547af0bb0eb4ff320b9f5ae9c248d
|
||||||
R 9f0bd6ab83c95af2ee3f859814217549
|
R baaeb5d73948ab9b678cf5ec65e8b13b
|
||||||
U drh
|
U drh
|
||||||
Z a72776bd54cae672bcaa8ae9f32804c5
|
Z 677bb92f950696e8a5b8946d54c8a93f
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
0e1ac1284c0547af0bb0eb4ff320b9f5ae9c248d
|
4ab994a87ee844f453d693555abd61b51bb44a0e
|
||||||
53
src/expr.c
53
src/expr.c
@@ -12,7 +12,7 @@
|
|||||||
** This file contains routines used for analyzing expressions and
|
** This file contains routines used for analyzing expressions and
|
||||||
** for generating VDBE code that evaluates expressions in SQLite.
|
** 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 "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -2071,28 +2071,30 @@ static int appendAggInfo(Parse *pParse){
|
|||||||
*/
|
*/
|
||||||
static int analyzeAggregate(void *pArg, Expr *pExpr){
|
static int analyzeAggregate(void *pArg, Expr *pExpr){
|
||||||
int i;
|
int i;
|
||||||
AggExpr *aAgg;
|
AggExpr *pAgg;
|
||||||
NameContext *pNC = (NameContext *)pArg;
|
NameContext *pNC = (NameContext *)pArg;
|
||||||
Parse *pParse = pNC->pParse;
|
Parse *pParse = pNC->pParse;
|
||||||
SrcList *pSrcList = pNC->pSrcList;
|
SrcList *pSrcList = pNC->pSrcList;
|
||||||
|
Expr *pAggExpr;
|
||||||
|
|
||||||
switch( pExpr->op ){
|
switch( pExpr->op ){
|
||||||
case TK_COLUMN: {
|
case TK_COLUMN: {
|
||||||
for(i=0; pSrcList && i<pSrcList->nSrc; i++){
|
for(i=0; pSrcList && i<pSrcList->nSrc; i++){
|
||||||
if( pExpr->iTable==pSrcList->a[i].iCursor ){
|
if( pExpr->iTable==pSrcList->a[i].iCursor ){
|
||||||
aAgg = pParse->aAgg;
|
pAgg = pParse->aAgg;
|
||||||
for(i=0; i<pParse->nAgg; i++){
|
for(i=0; i<pParse->nAgg; i++, pAgg++){
|
||||||
if( aAgg[i].isAgg ) continue;
|
if( pAgg->isAgg ) continue;
|
||||||
if( aAgg[i].pExpr->iTable==pExpr->iTable
|
if( (pAggExpr = pAgg->pExpr)->iTable==pExpr->iTable
|
||||||
&& aAgg[i].pExpr->iColumn==pExpr->iColumn ){
|
&& pAggExpr->iColumn==pExpr->iColumn ){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( i>=pParse->nAgg ){
|
if( i>=pParse->nAgg ){
|
||||||
i = appendAggInfo(pParse);
|
i = appendAggInfo(pParse);
|
||||||
if( i<0 ) return 1;
|
if( i<0 ) return 1;
|
||||||
pParse->aAgg[i].isAgg = 0;
|
pAgg = &pParse->aAgg[i];
|
||||||
pParse->aAgg[i].pExpr = pExpr;
|
pAgg->isAgg = 0;
|
||||||
|
pAgg->pExpr = pExpr;
|
||||||
}
|
}
|
||||||
pExpr->iAgg = i;
|
pExpr->iAgg = i;
|
||||||
pExpr->iAggCtx = pNC->nDepth;
|
pExpr->iAggCtx = pNC->nDepth;
|
||||||
@@ -2103,10 +2105,10 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){
|
|||||||
}
|
}
|
||||||
case TK_AGG_FUNCTION: {
|
case TK_AGG_FUNCTION: {
|
||||||
if( pNC->nDepth==0 ){
|
if( pNC->nDepth==0 ){
|
||||||
aAgg = pParse->aAgg;
|
pAgg = pParse->aAgg;
|
||||||
for(i=0; i<pParse->nAgg; i++){
|
for(i=0; i<pParse->nAgg; i++, pAgg++){
|
||||||
if( !aAgg[i].isAgg ) continue;
|
if( !pAgg->isAgg ) continue;
|
||||||
if( sqlite3ExprCompare(aAgg[i].pExpr, pExpr) ){
|
if( sqlite3ExprCompare(pAgg->pExpr, pExpr) ){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2114,9 +2116,10 @@ static int analyzeAggregate(void *pArg, Expr *pExpr){
|
|||||||
u8 enc = pParse->db->enc;
|
u8 enc = pParse->db->enc;
|
||||||
i = appendAggInfo(pParse);
|
i = appendAggInfo(pParse);
|
||||||
if( i<0 ) return 1;
|
if( i<0 ) return 1;
|
||||||
pParse->aAgg[i].isAgg = 1;
|
pAgg = &pParse->aAgg[i];
|
||||||
pParse->aAgg[i].pExpr = pExpr;
|
pAgg->isAgg = 1;
|
||||||
pParse->aAgg[i].pFunc = sqlite3FindFunction(pParse->db,
|
pAgg->pExpr = pExpr;
|
||||||
|
pAgg->pFunc = sqlite3FindFunction(pParse->db,
|
||||||
pExpr->token.z, pExpr->token.n,
|
pExpr->token.z, pExpr->token.n,
|
||||||
pExpr->pList ? pExpr->pList->nExpr : 0, enc, 0);
|
pExpr->pList ? pExpr->pList->nExpr : 0, enc, 0);
|
||||||
}
|
}
|
||||||
@@ -2149,3 +2152,21 @@ int sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){
|
|||||||
walkExprTree(pExpr, analyzeAggregate, pNC);
|
walkExprTree(pExpr, analyzeAggregate, pNC);
|
||||||
return pNC->pParse->nErr - nErr;
|
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 && i<pList->nExpr; i++, pItem++){
|
||||||
|
nErr += sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nErr;
|
||||||
|
}
|
||||||
|
|||||||
32
src/select.c
32
src/select.c
@@ -12,7 +12,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** to handle SELECT statements in SQLite.
|
** 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"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@@ -2632,10 +2632,10 @@ int sqlite3Select(
|
|||||||
** names that have been explicitly specified.
|
** names that have been explicitly specified.
|
||||||
*/
|
*/
|
||||||
if( pOrderBy ){
|
if( pOrderBy ){
|
||||||
for(i=0; i<pOrderBy->nExpr; i++){
|
struct ExprList_item *pTerm;
|
||||||
if( pOrderBy->a[i].zName ){
|
for(i=0, pTerm=pOrderBy->a; i<pOrderBy->nExpr; i++, pTerm++){
|
||||||
pOrderBy->a[i].pExpr->pColl =
|
if( pTerm->zName ){
|
||||||
sqlite3LocateCollSeq(pParse, pOrderBy->a[i].zName, -1);
|
pTerm->pExpr->pColl = sqlite3LocateCollSeq(pParse, pTerm->zName, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pParse->nErr ){
|
if( pParse->nErr ){
|
||||||
@@ -2664,27 +2664,17 @@ int sqlite3Select(
|
|||||||
|
|
||||||
assert( pParse->nAgg==0 );
|
assert( pParse->nAgg==0 );
|
||||||
isAgg = 1;
|
isAgg = 1;
|
||||||
for(i=0; i<pEList->nExpr; i++){
|
if( sqlite3ExprAnalyzeAggList(&sNC, pEList) ){
|
||||||
if( sqlite3ExprAnalyzeAggregates(&sNC, pEList->a[i].pExpr) ){
|
goto select_end;
|
||||||
goto select_end;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if( pGroupBy ){
|
if( sqlite3ExprAnalyzeAggList(&sNC, pGroupBy) ){
|
||||||
for(i=0; i<pGroupBy->nExpr; i++){
|
goto select_end;
|
||||||
if( sqlite3ExprAnalyzeAggregates(&sNC, pGroupBy->a[i].pExpr) ){
|
|
||||||
goto select_end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if( pHaving && sqlite3ExprAnalyzeAggregates(&sNC, pHaving) ){
|
if( pHaving && sqlite3ExprAnalyzeAggregates(&sNC, pHaving) ){
|
||||||
goto select_end;
|
goto select_end;
|
||||||
}
|
}
|
||||||
if( pOrderBy ){
|
if( sqlite3ExprAnalyzeAggList(&sNC, pOrderBy) ){
|
||||||
for(i=0; i<pOrderBy->nExpr; i++){
|
goto select_end;
|
||||||
if( sqlite3ExprAnalyzeAggregates(&sNC, pOrderBy->a[i].pExpr) ){
|
|
||||||
goto select_end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** Internal interface definitions for SQLite.
|
** 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_
|
#ifndef _SQLITEINT_H_
|
||||||
#define _SQLITEINT_H_
|
#define _SQLITEINT_H_
|
||||||
@@ -892,6 +892,7 @@ struct ExprList {
|
|||||||
u8 sortOrder; /* 1 for DESC or 0 for ASC */
|
u8 sortOrder; /* 1 for DESC or 0 for ASC */
|
||||||
u8 isAgg; /* True if this is an aggregate like count(*) */
|
u8 isAgg; /* True if this is an aggregate like count(*) */
|
||||||
u8 done; /* A flag to indicate when processing is finished */
|
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 */
|
} *a; /* One entry for each expression */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1452,6 +1453,7 @@ int sqlite3ExprCompare(Expr*, Expr*);
|
|||||||
int sqliteFuncId(Token*);
|
int sqliteFuncId(Token*);
|
||||||
int sqlite3ExprResolveNames(NameContext *, Expr *);
|
int sqlite3ExprResolveNames(NameContext *, Expr *);
|
||||||
int sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
|
int sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
|
||||||
|
int sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
|
||||||
Vdbe *sqlite3GetVdbe(Parse*);
|
Vdbe *sqlite3GetVdbe(Parse*);
|
||||||
void sqlite3Randomness(int, void*);
|
void sqlite3Randomness(int, void*);
|
||||||
void sqlite3RollbackAll(sqlite3*);
|
void sqlite3RollbackAll(sqlite3*);
|
||||||
|
|||||||
Reference in New Issue
Block a user