Index: third_party/sqlite/src/src/resolve.c |
diff --git a/third_party/sqlite/src/src/resolve.c b/third_party/sqlite/src/src/resolve.c |
index bb6646256a0fc4a0d50b5dc131aa5ef7fa288365..7d89b6fec5729c7b2187f22432ddcd8e732fb4cf 100644 |
--- a/third_party/sqlite/src/src/resolve.c |
+++ b/third_party/sqlite/src/src/resolve.c |
@@ -15,8 +15,6 @@ |
** table and column. |
*/ |
#include "sqliteInt.h" |
-#include <stdlib.h> |
-#include <string.h> |
/* |
** Walk the expression tree pExpr and increase the aggregate function |
@@ -221,8 +219,8 @@ static int lookupName( |
zDb = 0; |
}else{ |
for(i=0; i<db->nDb; i++){ |
- assert( db->aDb[i].zName ); |
- if( sqlite3StrICmp(db->aDb[i].zName,zDb)==0 ){ |
+ assert( db->aDb[i].zDbSName ); |
+ if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ |
pSchema = db->aDb[i].pSchema; |
break; |
} |
@@ -400,6 +398,10 @@ static int lookupName( |
sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); |
return WRC_Abort; |
} |
+ if( sqlite3ExprVectorSize(pOrig)!=1 ){ |
+ sqlite3ErrorMsg(pParse, "row value misused"); |
+ return WRC_Abort; |
+ } |
resolveAlias(pParse, pEList, j, pExpr, "", nSubquery); |
cnt = 1; |
pMatch = 0; |
@@ -623,7 +625,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ |
/* if( pSrcList==0 ) break; */ |
notValid(pParse, pNC, "the \".\" operator", NC_IdxExpr); |
- /*notValid(pParse, pNC, "the \".\" operator", NC_PartIdx|NC_IsCheck, 1);*/ |
pRight = pExpr->pRight; |
if( pRight->op==TK_ID ){ |
zDb = 0; |
@@ -646,26 +647,24 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ |
int no_such_func = 0; /* True if no such function exists */ |
int wrong_num_args = 0; /* True if wrong number of arguments */ |
int is_agg = 0; /* True if is an aggregate function */ |
- int auth; /* Authorization to use the function */ |
int nId; /* Number of characters in function name */ |
const char *zId; /* The function name. */ |
FuncDef *pDef; /* Information about the function */ |
u8 enc = ENC(pParse->db); /* The database encoding */ |
assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
- notValid(pParse, pNC, "functions", NC_PartIdx); |
zId = pExpr->u.zToken; |
nId = sqlite3Strlen30(zId); |
- pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0); |
+ pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); |
if( pDef==0 ){ |
- pDef = sqlite3FindFunction(pParse->db, zId, nId, -2, enc, 0); |
+ pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); |
if( pDef==0 ){ |
no_such_func = 1; |
}else{ |
wrong_num_args = 1; |
} |
}else{ |
- is_agg = pDef->xFunc==0; |
+ is_agg = pDef->xFinalize!=0; |
if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ |
ExprSetProperty(pExpr, EP_Unlikely|EP_Skip); |
if( n==2 ){ |
@@ -690,15 +689,17 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ |
} |
} |
#ifndef SQLITE_OMIT_AUTHORIZATION |
- auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0); |
- if( auth!=SQLITE_OK ){ |
- if( auth==SQLITE_DENY ){ |
- sqlite3ErrorMsg(pParse, "not authorized to use function: %s", |
- pDef->zName); |
- pNC->nErr++; |
+ { |
+ int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0); |
+ if( auth!=SQLITE_OK ){ |
+ if( auth==SQLITE_DENY ){ |
+ sqlite3ErrorMsg(pParse, "not authorized to use function: %s", |
+ pDef->zName); |
+ pNC->nErr++; |
+ } |
+ pExpr->op = TK_NULL; |
+ return WRC_Prune; |
} |
- pExpr->op = TK_NULL; |
- return WRC_Prune; |
} |
#endif |
if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ |
@@ -711,14 +712,19 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ |
/* Date/time functions that use 'now', and other functions like |
** sqlite_version() that might change over time cannot be used |
** in an index. */ |
- notValid(pParse, pNC, "non-deterministic functions", NC_IdxExpr); |
+ notValid(pParse, pNC, "non-deterministic functions", |
+ NC_IdxExpr|NC_PartIdx); |
} |
} |
if( is_agg && (pNC->ncFlags & NC_AllowAgg)==0 ){ |
sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); |
pNC->nErr++; |
is_agg = 0; |
- }else if( no_such_func && pParse->db->init.busy==0 ){ |
+ }else if( no_such_func && pParse->db->init.busy==0 |
+#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION |
+ && pParse->explain==0 |
+#endif |
+ ){ |
sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); |
pNC->nErr++; |
}else if( wrong_num_args ){ |
@@ -763,6 +769,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ |
assert( pNC->nRef>=nRef ); |
if( nRef!=pNC->nRef ){ |
ExprSetProperty(pExpr, EP_VarSelect); |
+ pNC->ncFlags |= NC_VarSelect; |
} |
} |
break; |
@@ -771,6 +778,42 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ |
notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); |
break; |
} |
+ case TK_BETWEEN: |
+ case TK_EQ: |
+ case TK_NE: |
+ case TK_LT: |
+ case TK_LE: |
+ case TK_GT: |
+ case TK_GE: |
+ case TK_IS: |
+ case TK_ISNOT: { |
+ int nLeft, nRight; |
+ if( pParse->db->mallocFailed ) break; |
+ assert( pExpr->pLeft!=0 ); |
+ nLeft = sqlite3ExprVectorSize(pExpr->pLeft); |
+ if( pExpr->op==TK_BETWEEN ){ |
+ nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr); |
+ if( nRight==nLeft ){ |
+ nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr); |
+ } |
+ }else{ |
+ assert( pExpr->pRight!=0 ); |
+ nRight = sqlite3ExprVectorSize(pExpr->pRight); |
+ } |
+ if( nLeft!=nRight ){ |
+ testcase( pExpr->op==TK_EQ ); |
+ testcase( pExpr->op==TK_NE ); |
+ testcase( pExpr->op==TK_LT ); |
+ testcase( pExpr->op==TK_LE ); |
+ testcase( pExpr->op==TK_GT ); |
+ testcase( pExpr->op==TK_GE ); |
+ testcase( pExpr->op==TK_IS ); |
+ testcase( pExpr->op==TK_ISNOT ); |
+ testcase( pExpr->op==TK_BETWEEN ); |
+ sqlite3ErrorMsg(pParse, "row value misused"); |
+ } |
+ break; |
+ } |
} |
return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; |
} |
@@ -1393,10 +1436,12 @@ int sqlite3ResolveExprNames( |
#endif |
savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg); |
pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg); |
- memset(&w, 0, sizeof(w)); |
+ w.pParse = pNC->pParse; |
w.xExprCallback = resolveExprStep; |
w.xSelectCallback = resolveSelectStep; |
- w.pParse = pNC->pParse; |
+ w.xSelectCallback2 = 0; |
+ w.walkerDepth = 0; |
+ w.eCode = 0; |
w.u.pNC = pNC; |
sqlite3WalkExpr(&w, pExpr); |
#if SQLITE_MAX_EXPR_DEPTH>0 |