mirror of
https://github.com/DBD-SQLite/DBD-SQLite
synced 2025-06-07 22:28:47 -04:00
updated 3.7.12.1 not to cause a segfault
This commit is contained in:
parent
4b011555a8
commit
329fdfdb72
2 changed files with 66 additions and 33 deletions
95
sqlite3.c
95
sqlite3.c
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
** This file is an amalgamation of many separate C source files from SQLite
|
** This file is an amalgamation of many separate C source files from SQLite
|
||||||
** version 3.7.12. By combining all the individual C code files into this
|
** version 3.7.12.1. By combining all the individual C code files into this
|
||||||
** single large file, the entire code can be compiled as a single translation
|
** single large file, the entire code can be compiled as a single translation
|
||||||
** unit. This allows many compilers to do optimizations that would not be
|
** unit. This allows many compilers to do optimizations that would not be
|
||||||
** possible if the files were compiled separately. Performance improvements
|
** possible if the files were compiled separately. Performance improvements
|
||||||
|
@ -657,9 +657,9 @@ extern "C" {
|
||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||||
** [sqlite_version()] and [sqlite_source_id()].
|
** [sqlite_version()] and [sqlite_source_id()].
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.7.12"
|
#define SQLITE_VERSION "3.7.12.1"
|
||||||
#define SQLITE_VERSION_NUMBER 3007012
|
#define SQLITE_VERSION_NUMBER 3007012
|
||||||
#define SQLITE_SOURCE_ID "2012-05-14 01:41:23 8654aa9540fe9fd210899d83d17f3f407096c004"
|
#define SQLITE_SOURCE_ID "2012-05-22 02:45:53 6d326d44fd1d626aae0e8456e5fa2049f1ce0789"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers
|
** CAPI3REF: Run-Time Library Version Numbers
|
||||||
|
@ -10935,15 +10935,21 @@ struct NameContext {
|
||||||
Parse *pParse; /* The parser */
|
Parse *pParse; /* The parser */
|
||||||
SrcList *pSrcList; /* One or more tables used to resolve names */
|
SrcList *pSrcList; /* One or more tables used to resolve names */
|
||||||
ExprList *pEList; /* Optional list of named expressions */
|
ExprList *pEList; /* Optional list of named expressions */
|
||||||
int nRef; /* Number of names resolved by this context */
|
|
||||||
int nErr; /* Number of errors encountered while resolving names */
|
|
||||||
u8 allowAgg; /* Aggregate functions allowed here */
|
|
||||||
u8 hasAgg; /* True if aggregates are seen */
|
|
||||||
u8 isCheck; /* True if resolving names in a CHECK constraint */
|
|
||||||
AggInfo *pAggInfo; /* Information about aggregates at this level */
|
AggInfo *pAggInfo; /* Information about aggregates at this level */
|
||||||
NameContext *pNext; /* Next outer name context. NULL for outermost */
|
NameContext *pNext; /* Next outer name context. NULL for outermost */
|
||||||
|
int nRef; /* Number of names resolved by this context */
|
||||||
|
int nErr; /* Number of errors encountered while resolving names */
|
||||||
|
u8 ncFlags; /* Zero or more NC_* flags defined below */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Allowed values for the NameContext, ncFlags field.
|
||||||
|
*/
|
||||||
|
#define NC_AllowAgg 0x01 /* Aggregate functions are allowed here */
|
||||||
|
#define NC_HasAgg 0x02 /* One or more aggregate functions seen */
|
||||||
|
#define NC_IsCheck 0x04 /* True if resolving names in a CHECK constraint */
|
||||||
|
#define NC_InAggFunc 0x08 /* True if analyzing arguments to an agg func */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** An instance of the following structure contains all information
|
** An instance of the following structure contains all information
|
||||||
** needed to generate code for a single SELECT statement.
|
** needed to generate code for a single SELECT statement.
|
||||||
|
@ -19106,6 +19112,10 @@ SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){
|
||||||
}
|
}
|
||||||
if( isLookaside(db, p) ){
|
if( isLookaside(db, p) ){
|
||||||
LookasideSlot *pBuf = (LookasideSlot*)p;
|
LookasideSlot *pBuf = (LookasideSlot*)p;
|
||||||
|
#if SQLITE_DEBUG
|
||||||
|
/* Trash all content in the buffer being freed */
|
||||||
|
memset(p, 0xaa, db->lookaside.sz);
|
||||||
|
#endif
|
||||||
pBuf->pNext = db->lookaside.pFree;
|
pBuf->pNext = db->lookaside.pFree;
|
||||||
db->lookaside.pFree = pBuf;
|
db->lookaside.pFree = pBuf;
|
||||||
db->lookaside.nOut--;
|
db->lookaside.nOut--;
|
||||||
|
@ -64499,8 +64509,9 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
|
||||||
*/
|
*/
|
||||||
SQLITE_PRIVATE void sqlite3ExplainBegin(Vdbe *pVdbe){
|
SQLITE_PRIVATE void sqlite3ExplainBegin(Vdbe *pVdbe){
|
||||||
if( pVdbe ){
|
if( pVdbe ){
|
||||||
|
Explain *p;
|
||||||
sqlite3BeginBenignMalloc();
|
sqlite3BeginBenignMalloc();
|
||||||
Explain *p = sqlite3_malloc( sizeof(Explain) );
|
p = sqlite3_malloc( sizeof(Explain) );
|
||||||
if( p ){
|
if( p ){
|
||||||
memset(p, 0, sizeof(*p));
|
memset(p, 0, sizeof(*p));
|
||||||
p->pVdbe = pVdbe;
|
p->pVdbe = pVdbe;
|
||||||
|
@ -73769,7 +73780,7 @@ static int lookupName(
|
||||||
assert( pExpr->x.pList==0 );
|
assert( pExpr->x.pList==0 );
|
||||||
assert( pExpr->x.pSelect==0 );
|
assert( pExpr->x.pSelect==0 );
|
||||||
pOrig = pEList->a[j].pExpr;
|
pOrig = pEList->a[j].pExpr;
|
||||||
if( !pNC->allowAgg && ExprHasProperty(pOrig, EP_Agg) ){
|
if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){
|
||||||
sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs);
|
sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs);
|
||||||
return WRC_Abort;
|
return WRC_Abort;
|
||||||
}
|
}
|
||||||
|
@ -74014,7 +74025,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if( is_agg && !pNC->allowAgg ){
|
if( is_agg && (pNC->ncFlags & NC_AllowAgg)==0 ){
|
||||||
sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId);
|
sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId);
|
||||||
pNC->nErr++;
|
pNC->nErr++;
|
||||||
is_agg = 0;
|
is_agg = 0;
|
||||||
|
@ -74028,11 +74039,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||||
}
|
}
|
||||||
if( is_agg ){
|
if( is_agg ){
|
||||||
pExpr->op = TK_AGG_FUNCTION;
|
pExpr->op = TK_AGG_FUNCTION;
|
||||||
pNC->hasAgg = 1;
|
pNC->ncFlags |= NC_HasAgg;
|
||||||
}
|
}
|
||||||
if( is_agg ) pNC->allowAgg = 0;
|
if( is_agg ) pNC->ncFlags &= ~NC_AllowAgg;
|
||||||
sqlite3WalkExprList(pWalker, pList);
|
sqlite3WalkExprList(pWalker, pList);
|
||||||
if( is_agg ) pNC->allowAgg = 1;
|
if( is_agg ) pNC->ncFlags |= NC_AllowAgg;
|
||||||
/* FIX ME: Compute pExpr->affinity based on the expected return
|
/* FIX ME: Compute pExpr->affinity based on the expected return
|
||||||
** type of the function
|
** type of the function
|
||||||
*/
|
*/
|
||||||
|
@ -74047,7 +74058,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||||
if( ExprHasProperty(pExpr, EP_xIsSelect) ){
|
if( ExprHasProperty(pExpr, EP_xIsSelect) ){
|
||||||
int nRef = pNC->nRef;
|
int nRef = pNC->nRef;
|
||||||
#ifndef SQLITE_OMIT_CHECK
|
#ifndef SQLITE_OMIT_CHECK
|
||||||
if( pNC->isCheck ){
|
if( (pNC->ncFlags & NC_IsCheck)!=0 ){
|
||||||
sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints");
|
sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -74061,7 +74072,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||||
}
|
}
|
||||||
#ifndef SQLITE_OMIT_CHECK
|
#ifndef SQLITE_OMIT_CHECK
|
||||||
case TK_VARIABLE: {
|
case TK_VARIABLE: {
|
||||||
if( pNC->isCheck ){
|
if( (pNC->ncFlags & NC_IsCheck)!=0 ){
|
||||||
sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints");
|
sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -74143,7 +74154,7 @@ static int resolveOrderByTermToExprList(
|
||||||
nc.pParse = pParse;
|
nc.pParse = pParse;
|
||||||
nc.pSrcList = pSelect->pSrc;
|
nc.pSrcList = pSelect->pSrc;
|
||||||
nc.pEList = pEList;
|
nc.pEList = pEList;
|
||||||
nc.allowAgg = 1;
|
nc.ncFlags = NC_AllowAgg;
|
||||||
nc.nErr = 0;
|
nc.nErr = 0;
|
||||||
db = pParse->db;
|
db = pParse->db;
|
||||||
savedSuppErr = db->suppressErr;
|
savedSuppErr = db->suppressErr;
|
||||||
|
@ -74445,7 +74456,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
|
||||||
/* Set up the local name-context to pass to sqlite3ResolveExprNames() to
|
/* Set up the local name-context to pass to sqlite3ResolveExprNames() to
|
||||||
** resolve the result-set expression list.
|
** resolve the result-set expression list.
|
||||||
*/
|
*/
|
||||||
sNC.allowAgg = 1;
|
sNC.ncFlags = NC_AllowAgg;
|
||||||
sNC.pSrcList = p->pSrc;
|
sNC.pSrcList = p->pSrc;
|
||||||
sNC.pNext = pOuterNC;
|
sNC.pNext = pOuterNC;
|
||||||
|
|
||||||
|
@ -74491,10 +74502,10 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
|
||||||
*/
|
*/
|
||||||
assert( (p->selFlags & SF_Aggregate)==0 );
|
assert( (p->selFlags & SF_Aggregate)==0 );
|
||||||
pGroupBy = p->pGroupBy;
|
pGroupBy = p->pGroupBy;
|
||||||
if( pGroupBy || sNC.hasAgg ){
|
if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){
|
||||||
p->selFlags |= SF_Aggregate;
|
p->selFlags |= SF_Aggregate;
|
||||||
}else{
|
}else{
|
||||||
sNC.allowAgg = 0;
|
sNC.ncFlags &= ~NC_AllowAgg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If a HAVING clause is present, then there must be a GROUP BY clause.
|
/* If a HAVING clause is present, then there must be a GROUP BY clause.
|
||||||
|
@ -74523,7 +74534,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
|
||||||
** outer queries
|
** outer queries
|
||||||
*/
|
*/
|
||||||
sNC.pNext = 0;
|
sNC.pNext = 0;
|
||||||
sNC.allowAgg = 1;
|
sNC.ncFlags |= NC_AllowAgg;
|
||||||
|
|
||||||
/* Process the ORDER BY clause for singleton SELECT statements.
|
/* Process the ORDER BY clause for singleton SELECT statements.
|
||||||
** The ORDER BY clause for compounds SELECT statements is handled
|
** The ORDER BY clause for compounds SELECT statements is handled
|
||||||
|
@ -74611,7 +74622,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
|
||||||
**
|
**
|
||||||
** Function calls are checked to make sure that the function is
|
** Function calls are checked to make sure that the function is
|
||||||
** defined and that the correct number of arguments are specified.
|
** defined and that the correct number of arguments are specified.
|
||||||
** If the function is an aggregate function, then the pNC->hasAgg is
|
** If the function is an aggregate function, then the NC_HasAgg flag is
|
||||||
** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION.
|
** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION.
|
||||||
** If an expression contains aggregate functions then the EP_Agg
|
** If an expression contains aggregate functions then the EP_Agg
|
||||||
** property on the expression is set.
|
** property on the expression is set.
|
||||||
|
@ -74623,7 +74634,7 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames(
|
||||||
NameContext *pNC, /* Namespace to resolve expressions in. */
|
NameContext *pNC, /* Namespace to resolve expressions in. */
|
||||||
Expr *pExpr /* The expression to be analyzed. */
|
Expr *pExpr /* The expression to be analyzed. */
|
||||||
){
|
){
|
||||||
int savedHasAgg;
|
u8 savedHasAgg;
|
||||||
Walker w;
|
Walker w;
|
||||||
|
|
||||||
if( pExpr==0 ) return 0;
|
if( pExpr==0 ) return 0;
|
||||||
|
@ -74636,8 +74647,8 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames(
|
||||||
pParse->nHeight += pExpr->nHeight;
|
pParse->nHeight += pExpr->nHeight;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
savedHasAgg = pNC->hasAgg;
|
savedHasAgg = pNC->ncFlags & NC_HasAgg;
|
||||||
pNC->hasAgg = 0;
|
pNC->ncFlags &= ~NC_HasAgg;
|
||||||
w.xExprCallback = resolveExprStep;
|
w.xExprCallback = resolveExprStep;
|
||||||
w.xSelectCallback = resolveSelectStep;
|
w.xSelectCallback = resolveSelectStep;
|
||||||
w.pParse = pNC->pParse;
|
w.pParse = pNC->pParse;
|
||||||
|
@ -74649,10 +74660,10 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames(
|
||||||
if( pNC->nErr>0 || w.pParse->nErr>0 ){
|
if( pNC->nErr>0 || w.pParse->nErr>0 ){
|
||||||
ExprSetProperty(pExpr, EP_Error);
|
ExprSetProperty(pExpr, EP_Error);
|
||||||
}
|
}
|
||||||
if( pNC->hasAgg ){
|
if( pNC->ncFlags & NC_HasAgg ){
|
||||||
ExprSetProperty(pExpr, EP_Agg);
|
ExprSetProperty(pExpr, EP_Agg);
|
||||||
}else if( savedHasAgg ){
|
}else if( savedHasAgg ){
|
||||||
pNC->hasAgg = 1;
|
pNC->ncFlags |= NC_HasAgg;
|
||||||
}
|
}
|
||||||
return ExprHasProperty(pExpr, EP_Error);
|
return ExprHasProperty(pExpr, EP_Error);
|
||||||
}
|
}
|
||||||
|
@ -78466,7 +78477,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Expr *pA, Expr *pB){
|
||||||
if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
|
if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
}else if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){
|
}else if( pA->op!=TK_COLUMN && ALWAYS(pA->op!=TK_AGG_COLUMN) && pA->u.zToken){
|
||||||
if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2;
|
if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2;
|
||||||
if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
|
if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -78653,7 +78664,9 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
|
||||||
return WRC_Prune;
|
return WRC_Prune;
|
||||||
}
|
}
|
||||||
case TK_AGG_FUNCTION: {
|
case TK_AGG_FUNCTION: {
|
||||||
if( !sqlite3FunctionUsesOtherSrc(pExpr, pSrcList) ){
|
if( (pNC->ncFlags & NC_InAggFunc)==0
|
||||||
|
&& !sqlite3FunctionUsesOtherSrc(pExpr, pSrcList)
|
||||||
|
){
|
||||||
/* Check to see if pExpr is a duplicate of another aggregate
|
/* Check to see if pExpr is a duplicate of another aggregate
|
||||||
** function that is already in the pAggInfo structure
|
** function that is already in the pAggInfo structure
|
||||||
*/
|
*/
|
||||||
|
@ -78690,8 +78703,8 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
|
||||||
ExprSetIrreducible(pExpr);
|
ExprSetIrreducible(pExpr);
|
||||||
pExpr->iAgg = (i16)i;
|
pExpr->iAgg = (i16)i;
|
||||||
pExpr->pAggInfo = pAggInfo;
|
pExpr->pAggInfo = pAggInfo;
|
||||||
return WRC_Prune;
|
|
||||||
}
|
}
|
||||||
|
return WRC_Prune;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return WRC_Continue;
|
return WRC_Continue;
|
||||||
|
@ -82071,9 +82084,16 @@ static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){
|
||||||
** the table data structure from the hash table. But it does destroy
|
** the table data structure from the hash table. But it does destroy
|
||||||
** memory structures of the indices and foreign keys associated with
|
** memory structures of the indices and foreign keys associated with
|
||||||
** the table.
|
** the table.
|
||||||
|
**
|
||||||
|
** The db parameter is optional. It is needed if the Table object
|
||||||
|
** contains lookaside memory. (Table objects in the schema do not use
|
||||||
|
** lookaside memory, but some ephemeral Table objects do.) Or the
|
||||||
|
** db parameter can be used with db->pnBytesFreed to measure the memory
|
||||||
|
** used by the Table object.
|
||||||
*/
|
*/
|
||||||
SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
||||||
Index *pIndex, *pNext;
|
Index *pIndex, *pNext;
|
||||||
|
TESTONLY( int nLookaside; ) /* Used to verify lookaside not used for schema */
|
||||||
|
|
||||||
assert( !pTable || pTable->nRef>0 );
|
assert( !pTable || pTable->nRef>0 );
|
||||||
|
|
||||||
|
@ -82081,6 +82101,12 @@ SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
||||||
if( !pTable ) return;
|
if( !pTable ) return;
|
||||||
if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
|
if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
|
||||||
|
|
||||||
|
/* Record the number of outstanding lookaside allocations in schema Tables
|
||||||
|
** prior to doing any free() operations. Since schema Tables do not use
|
||||||
|
** lookaside, this number should not change. */
|
||||||
|
TESTONLY( nLookaside = (db && (pTable->tabFlags & TF_Ephemeral)==0) ?
|
||||||
|
db->lookaside.nOut : 0 );
|
||||||
|
|
||||||
/* Delete all indices associated with this table. */
|
/* Delete all indices associated with this table. */
|
||||||
for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
|
for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
|
||||||
pNext = pIndex->pNext;
|
pNext = pIndex->pNext;
|
||||||
|
@ -82112,6 +82138,9 @@ SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
|
||||||
sqlite3VtabClear(db, pTable);
|
sqlite3VtabClear(db, pTable);
|
||||||
#endif
|
#endif
|
||||||
sqlite3DbFree(db, pTable);
|
sqlite3DbFree(db, pTable);
|
||||||
|
|
||||||
|
/* Verify that no lookaside memory was used by schema tables */
|
||||||
|
assert( nLookaside==0 || nLookaside==db->lookaside.nOut );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -83060,7 +83089,7 @@ SQLITE_PRIVATE void sqlite3EndTable(
|
||||||
sSrc.a[0].iCursor = -1;
|
sSrc.a[0].iCursor = -1;
|
||||||
sNC.pParse = pParse;
|
sNC.pParse = pParse;
|
||||||
sNC.pSrcList = &sSrc;
|
sNC.pSrcList = &sSrc;
|
||||||
sNC.isCheck = 1;
|
sNC.ncFlags = NC_IsCheck;
|
||||||
pList = p->pCheck;
|
pList = p->pCheck;
|
||||||
for(i=0; i<pList->nExpr; i++){
|
for(i=0; i<pList->nExpr; i++){
|
||||||
if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){
|
if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){
|
||||||
|
@ -94753,6 +94782,7 @@ static int sqlite3LockAndPrepare(
|
||||||
}
|
}
|
||||||
sqlite3BtreeLeaveAll(db);
|
sqlite3BtreeLeaveAll(db);
|
||||||
sqlite3_mutex_leave(db->mutex);
|
sqlite3_mutex_leave(db->mutex);
|
||||||
|
assert( rc==SQLITE_OK || *ppStmt==0 );
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98060,6 +98090,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){
|
||||||
|
|
||||||
if( IsVirtual(pTab) ) return 0;
|
if( IsVirtual(pTab) ) return 0;
|
||||||
if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
|
if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
|
||||||
|
if( pAggInfo->nFunc==0 ) return 0;
|
||||||
if( (pAggInfo->aFunc[0].pFunc->flags&SQLITE_FUNC_COUNT)==0 ) return 0;
|
if( (pAggInfo->aFunc[0].pFunc->flags&SQLITE_FUNC_COUNT)==0 ) return 0;
|
||||||
if( pExpr->flags&EP_Distinct ) return 0;
|
if( pExpr->flags&EP_Distinct ) return 0;
|
||||||
|
|
||||||
|
@ -99050,7 +99081,9 @@ SQLITE_PRIVATE int sqlite3Select(
|
||||||
sAggInfo.nAccumulator = sAggInfo.nColumn;
|
sAggInfo.nAccumulator = sAggInfo.nColumn;
|
||||||
for(i=0; i<sAggInfo.nFunc; i++){
|
for(i=0; i<sAggInfo.nFunc; i++){
|
||||||
assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );
|
assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );
|
||||||
|
sNC.ncFlags |= NC_InAggFunc;
|
||||||
sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList);
|
sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList);
|
||||||
|
sNC.ncFlags &= ~NC_InAggFunc;
|
||||||
}
|
}
|
||||||
if( db->mallocFailed ) goto select_end;
|
if( db->mallocFailed ) goto select_end;
|
||||||
|
|
||||||
|
|
|
@ -107,9 +107,9 @@ extern "C" {
|
||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||||
** [sqlite_version()] and [sqlite_source_id()].
|
** [sqlite_version()] and [sqlite_source_id()].
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.7.12"
|
#define SQLITE_VERSION "3.7.12.1"
|
||||||
#define SQLITE_VERSION_NUMBER 3007012
|
#define SQLITE_VERSION_NUMBER 3007012
|
||||||
#define SQLITE_SOURCE_ID "2012-05-14 01:41:23 8654aa9540fe9fd210899d83d17f3f407096c004"
|
#define SQLITE_SOURCE_ID "2012-05-22 02:45:53 6d326d44fd1d626aae0e8456e5fa2049f1ce0789"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers
|
** CAPI3REF: Run-Time Library Version Numbers
|
||||||
|
|
Loading…
Add table
Reference in a new issue