diff options
author | drh <drh@noemail.net> | 2020-01-08 20:37:45 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2020-01-08 20:37:45 +0000 |
commit | 2eeca2046eae31d913e7bae79893e343c17bd624 (patch) | |
tree | 2a96ccd42c48c51fa961ebe065f7abe7a51b119c /src | |
parent | 0dfa5255bc012a1991809e23ad2ac1a4089e1261 (diff) | |
download | sqlite-2eeca2046eae31d913e7bae79893e343c17bd624.tar.gz sqlite-2eeca2046eae31d913e7bae79893e343c17bd624.zip |
Performance improvements and test cases added. Allow "PRAGMA trusted_schema=ON"
FossilOrigin-Name: 30882ca80f6c51f6bb7b2692c1ac3f19a7c61a23aa8730be79aec0ae3ef08d54
Diffstat (limited to 'src')
-rw-r--r-- | src/callback.c | 9 | ||||
-rw-r--r-- | src/expr.c | 9 | ||||
-rw-r--r-- | src/pragma.c | 2 | ||||
-rw-r--r-- | src/resolve.c | 5 |
4 files changed, 15 insertions, 10 deletions
diff --git a/src/callback.c b/src/callback.c index a360e46ee..3d991901d 100644 --- a/src/callback.c +++ b/src/callback.c @@ -288,12 +288,13 @@ static int matchQuality( u8 enc /* Desired text encoding */ ){ int match; - - /* nArg of -2 is a special case */ - if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + assert( p->nArg>=-1 ); /* Wrong number of arguments means "no match" */ - if( p->nArg!=nArg && p->nArg>=0 ) return 0; + if( p->nArg!=nArg ){ + if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + if( p->nArg>=0 ) return 0; + } /* Give a better score to a function with a specific number of arguments ** than to function that accepts any number of arguments. */ diff --git a/src/expr.c b/src/expr.c index 7d712ad67..a9d59cfa6 100644 --- a/src/expr.c +++ b/src/expr.c @@ -990,9 +990,8 @@ void sqlite3ExprFunctionUsable( FuncDef *pDef /* The function being invoked */ ){ assert( !IN_RENAME_OBJECT ); - if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 - && ExprHasProperty(pExpr, EP_FromDDL) - ){ + assert( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 ); + if( ExprHasProperty(pExpr, EP_FromDDL) ){ if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 || (pParse->db->flags & SQLITE_TrustedSchema)==0 ){ @@ -4112,8 +4111,9 @@ expr_code_doover: assert( (pDef->funcFlags & SQLITE_FUNC_DIRECT)==0 ); return exprCodeInlineFunction(pParse, pFarg, SQLITE_PTR_TO_INT(pDef->pUserData), target); + }else if( pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE) ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); } - sqlite3ExprFunctionUsable(pParse, pExpr, pDef); for(i=0; i<nFarg; i++){ if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){ @@ -5778,7 +5778,6 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ }else{ pItem->iDistinct = -1; } - sqlite3ExprFunctionUsable(pParse, pExpr, pItem->pFunc); } } /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry diff --git a/src/pragma.c b/src/pragma.c index f577fd2b5..2c127ed5a 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1107,7 +1107,7 @@ void sqlite3Pragma( #endif if( sqlite3GetBoolean(zRight, 0) ){ - db->flags |= (mask & ~(SQLITE_TrustedSchema)); + db->flags |= mask; }else{ db->flags &= ~mask; if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; diff --git a/src/resolve.c b/src/resolve.c index 16546ada4..cfdbc569f 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -888,6 +888,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** used to activate internal functionsn for testing purposes */ no_such_func = 1; pDef = 0; + }else + if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 + && !IN_RENAME_OBJECT + ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); } } |