aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2024-12-12 15:11:27 +0000
committerdrh <>2024-12-12 15:11:27 +0000
commit35d302ccb1d79b801d0b8c6a564ab6c1e492df43 (patch)
tree50014615d74acfffb8a20b6fcf6b8dfe5afdce0e /src
parent6e53f67c63771b72d5419265038f428c34fa99d5 (diff)
downloadsqlite-35d302ccb1d79b801d0b8c6a564ab6c1e492df43.tar.gz
sqlite-35d302ccb1d79b801d0b8c6a564ab6c1e492df43.zip
Increase the maximum number of arguments on an SQL function to 1000 with the
capability to increase it further up to 32767 using a compile-time option. FossilOrigin-Name: e8d7d68ba0bb0bc2f948db5d9966990a5d23597fc3658b7cd0bc99d53c7353a9
Diffstat (limited to 'src')
-rw-r--r--src/expr.c2
-rw-r--r--src/main.c4
-rw-r--r--src/pragma.c2
-rw-r--r--src/select.c4
-rw-r--r--src/sqliteInt.h2
-rw-r--r--src/sqliteLimit.h6
-rw-r--r--src/test_func.c4
-rw-r--r--src/trigger.c2
-rw-r--r--src/vdbeInt.h2
-rw-r--r--src/window.c2
10 files changed, 17 insertions, 13 deletions
diff --git a/src/expr.c b/src/expr.c
index 37923bc84..86c966683 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -479,7 +479,7 @@ static int codeCompare(
p5 = binaryCompareP5(pLeft, pRight, jumpIfNull);
addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1,
(void*)p4, P4_COLLSEQ);
- sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5);
+ sqlite3VdbeChangeP5(pParse->pVdbe, (u16)p5);
return addr;
}
diff --git a/src/main.c b/src/main.c
index 3a535e3cd..5e9a03a47 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2857,8 +2857,8 @@ static const int aHardLimit[] = {
#if SQLITE_MAX_VDBE_OP<40
# error SQLITE_MAX_VDBE_OP must be at least 40
#endif
-#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127
-# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127
+#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>32767
+# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 32767
#endif
#if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>125
# error SQLITE_MAX_ATTACHED must be between 0 and 125
diff --git a/src/pragma.c b/src/pragma.c
index ae0c86f03..291ccf7af 100644
--- a/src/pragma.c
+++ b/src/pragma.c
@@ -1761,7 +1761,7 @@ void sqlite3Pragma(
/* Do the b-tree integrity checks */
sqlite3VdbeAddOp4(v, OP_IntegrityCk, 1, cnt, 8, (char*)aRoot,P4_INTARRAY);
- sqlite3VdbeChangeP5(v, (u8)i);
+ sqlite3VdbeChangeP5(v, (u16)i);
addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v);
sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,
sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zDbSName),
diff --git a/src/select.c b/src/select.c
index 9d35e1832..cf25c8e67 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6826,7 +6826,7 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
}
sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i));
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, (u8)nArg);
+ sqlite3VdbeChangeP5(v, (u16)nArg);
sqlite3VdbeAddOp2(v, OP_Next, pF->iOBTab, iTop+1); VdbeCoverage(v);
sqlite3VdbeJumpHere(v, iTop);
sqlite3ReleaseTempRange(pParse, regAgg, nArg);
@@ -6989,7 +6989,7 @@ static void updateAccumulator(
}
sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i));
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, (u8)nArg);
+ sqlite3VdbeChangeP5(v, (u16)nArg);
sqlite3ReleaseTempRange(pParse, regAgg, nArg);
}
if( addrNext ){
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index dbdf36200..b8c9136a5 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -1925,7 +1925,7 @@ struct sqlite3 {
** field is used by per-connection app-def functions.
*/
struct FuncDef {
- i8 nArg; /* Number of arguments. -1 means unlimited */
+ i16 nArg; /* Number of arguments. -1 means unlimited */
u32 funcFlags; /* Some combination of SQLITE_FUNC_* */
void *pUserData; /* User data parameter */
FuncDef *pNext; /* Next function with same name */
diff --git a/src/sqliteLimit.h b/src/sqliteLimit.h
index c7185b1c5..620b0f8e5 100644
--- a/src/sqliteLimit.h
+++ b/src/sqliteLimit.h
@@ -89,9 +89,13 @@
/*
** The maximum number of arguments to an SQL function.
+**
+** This value has a hard upper limit of 32767 due to storage
+** constraints (it needs to fit inside a i16). We keep it
+** lower than that to prevent abuse.
*/
#ifndef SQLITE_MAX_FUNCTION_ARG
-# define SQLITE_MAX_FUNCTION_ARG 127
+# define SQLITE_MAX_FUNCTION_ARG 1000
#endif
/*
diff --git a/src/test_func.c b/src/test_func.c
index 8c06705ae..82f7b3d9c 100644
--- a/src/test_func.c
+++ b/src/test_func.c
@@ -773,7 +773,7 @@ static int SQLITE_TCLAPI abuse_create_function(
rc = sqlite3_create_function(db, "tx", -2, SQLITE_UTF8, 0, tStep, 0, 0);
if( rc!=SQLITE_MISUSE ) goto abuse_err;
- rc = sqlite3_create_function(db, "tx", 128, SQLITE_UTF8, 0, tStep, 0, 0);
+ rc = sqlite3_create_function(db, "tx", 32768, SQLITE_UTF8, 0, tStep, 0, 0);
if( rc!=SQLITE_MISUSE ) goto abuse_err;
rc = sqlite3_create_function(db, "funcxx"
@@ -789,7 +789,7 @@ static int SQLITE_TCLAPI abuse_create_function(
** a no-op function (that always returns NULL) and which has the
** maximum-length function name and the maximum number of parameters.
*/
- sqlite3_limit(db, SQLITE_LIMIT_FUNCTION_ARG, 10000);
+ sqlite3_limit(db, SQLITE_LIMIT_FUNCTION_ARG, 1000000);
mxArg = sqlite3_limit(db, SQLITE_LIMIT_FUNCTION_ARG, -1);
rc = sqlite3_create_function(db, "nullx"
"_123456789_123456789_123456789_123456789_123456789"
diff --git a/src/trigger.c b/src/trigger.c
index ff2df82cb..e306a2e66 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -1409,7 +1409,7 @@ void sqlite3CodeRowTriggerDirect(
** invocation is disallowed if (a) the sub-program is really a trigger,
** not a foreign key action, and (b) the flag to enable recursive triggers
** is clear. */
- sqlite3VdbeChangeP5(v, (u8)bRecursive);
+ sqlite3VdbeChangeP5(v, (u16)bRecursive);
}
}
diff --git a/src/vdbeInt.h b/src/vdbeInt.h
index 467f48890..2cb4f8c2a 100644
--- a/src/vdbeInt.h
+++ b/src/vdbeInt.h
@@ -393,7 +393,7 @@ struct sqlite3_context {
int isError; /* Error code returned by the function. */
u8 enc; /* Encoding to use for results */
u8 skipFlag; /* Skip accumulator loading if true */
- u8 argc; /* Number of arguments */
+ u16 argc; /* Number of arguments */
sqlite3_value *argv[1]; /* Argument set */
};
diff --git a/src/window.c b/src/window.c
index acc6ea854..8373e3641 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1751,7 +1751,7 @@ static void windowAggStep(
sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep,
bInverse, regArg, pWin->regAccum);
sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, (u8)nArg);
+ sqlite3VdbeChangeP5(v, (u16)nArg);
if( pWin->bExprArgs ){
sqlite3ReleaseTempRange(pParse, regArg, nArg);
}