aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/callback.c9
-rw-r--r--src/expr.c9
-rw-r--r--src/pragma.c2
-rw-r--r--src/resolve.c5
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);
}
}