| 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
|
|
|