Add the SQLITE_LIMIT_TRIGGER_DEPTH option to sqlite3_limit().
FossilOrigin-Name: d7dc8b433691745b3842282569f1573d1e057963
This commit is contained in:
@@ -1448,6 +1448,7 @@ static const int aHardLimit[] = {
|
||||
SQLITE_MAX_ATTACHED,
|
||||
SQLITE_MAX_LIKE_PATTERN_LENGTH,
|
||||
SQLITE_MAX_VARIABLE_NUMBER,
|
||||
SQLITE_MAX_TRIGGER_DEPTH,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -1483,6 +1484,9 @@ static const int aHardLimit[] = {
|
||||
#if SQLITE_MAX_COLUMN>32767
|
||||
# error SQLITE_MAX_COLUMN must not exceed 32767
|
||||
#endif
|
||||
#if SQLITE_MAX_TRIGGER_DEPTH<1
|
||||
# error SQLITE_MAX_TRIGGER_DEPTH must be at least 1
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
|
||||
+7
-11
@@ -881,7 +881,7 @@ static const char *columnType(
|
||||
int iCol = pExpr->iColumn; /* Index of column in pTab */
|
||||
testcase( pExpr->op==TK_AGG_COLUMN );
|
||||
testcase( pExpr->op==TK_COLUMN );
|
||||
while( pNC && !pTab ){
|
||||
while( ALWAYS(pNC) && !pTab ){
|
||||
SrcList *pTabList = pNC->pSrcList;
|
||||
for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++);
|
||||
if( j<pTabList->nSrc ){
|
||||
@@ -892,16 +892,12 @@ static const char *columnType(
|
||||
}
|
||||
}
|
||||
|
||||
if( pTab==0 ){
|
||||
/* FIX ME:
|
||||
** This can occurs if you have something like "SELECT new.x;" inside
|
||||
** a trigger. In other words, if you reference the special "new"
|
||||
** table in the result set of a select. We do not have a good way
|
||||
** to find the actual table type, so call it "TEXT". This is really
|
||||
** something of a bug, but I do not know how to fix it.
|
||||
**
|
||||
** This code does not produce the correct answer - it just prevents
|
||||
** a segfault. See ticket #1229.
|
||||
if( NEVER(pTab==0) ){
|
||||
/* At one time, code such as "SELECT new.x" within a trigger would
|
||||
** cause this condition to run. Since then, we have restructured how
|
||||
** trigger code is generated and so this condition is no longer
|
||||
** possible. But it seems prudent to keep the test in place in
|
||||
** case something else changes.
|
||||
*/
|
||||
zType = "TEXT";
|
||||
break;
|
||||
|
||||
@@ -2317,6 +2317,9 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
|
||||
** <dt>SQLITE_LIMIT_VARIABLE_NUMBER</dt>
|
||||
** <dd>The maximum number of variables in an SQL statement that can
|
||||
** be bound.</dd>
|
||||
**
|
||||
** <dt>SQLITE_LIMIT_TRIGGER_DEPTH</dt>
|
||||
** <dd>The maximum depth of recursion for triggers.</dd>
|
||||
** </dl>
|
||||
*/
|
||||
#define SQLITE_LIMIT_LENGTH 0
|
||||
@@ -2329,6 +2332,7 @@ int sqlite3_limit(sqlite3*, int id, int newVal);
|
||||
#define SQLITE_LIMIT_ATTACHED 7
|
||||
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8
|
||||
#define SQLITE_LIMIT_VARIABLE_NUMBER 9
|
||||
#define SQLITE_LIMIT_TRIGGER_DEPTH 10
|
||||
|
||||
/*
|
||||
** CAPI3REF: Compiling An SQL Statement {H13010} <S10000>
|
||||
|
||||
+1
-1
@@ -707,7 +707,7 @@ struct Schema {
|
||||
** The number of different kinds of things that can be limited
|
||||
** using the sqlite3_limit() interface.
|
||||
*/
|
||||
#define SQLITE_N_LIMIT (SQLITE_LIMIT_VARIABLE_NUMBER+1)
|
||||
#define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1)
|
||||
|
||||
/*
|
||||
** Lookaside malloc is a set of fixed-size buffers that can be used
|
||||
|
||||
@@ -188,3 +188,10 @@
|
||||
#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
|
||||
# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Maximum depth of recursion for triggers.
|
||||
*/
|
||||
#ifndef SQLITE_MAX_TRIGGER_DEPTH
|
||||
# define SQLITE_MAX_TRIGGER_DEPTH 1000
|
||||
#endif
|
||||
|
||||
+2
-1
@@ -4721,10 +4721,11 @@ static int test_limit(
|
||||
{ "SQLITE_LIMIT_ATTACHED", SQLITE_LIMIT_ATTACHED },
|
||||
{ "SQLITE_LIMIT_LIKE_PATTERN_LENGTH", SQLITE_LIMIT_LIKE_PATTERN_LENGTH },
|
||||
{ "SQLITE_LIMIT_VARIABLE_NUMBER", SQLITE_LIMIT_VARIABLE_NUMBER },
|
||||
{ "SQLITE_LIMIT_TRIGGER_DEPTH", SQLITE_LIMIT_TRIGGER_DEPTH },
|
||||
|
||||
/* Out of range test cases */
|
||||
{ "SQLITE_LIMIT_TOOSMALL", -1, },
|
||||
{ "SQLITE_LIMIT_TOOBIG", SQLITE_LIMIT_VARIABLE_NUMBER+1 },
|
||||
{ "SQLITE_LIMIT_TOOBIG", SQLITE_LIMIT_TRIGGER_DEPTH+1 },
|
||||
};
|
||||
int i, id;
|
||||
int val;
|
||||
|
||||
+1
-2
@@ -4802,8 +4802,7 @@ case OP_Program: { /* jump */
|
||||
if( pFrame ) break;
|
||||
}
|
||||
|
||||
/* TODO: This constant should be configurable. */
|
||||
if( p->nFrame>1000 ){
|
||||
if( p->nFrame>db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){
|
||||
rc = SQLITE_ERROR;
|
||||
sqlite3SetString(&p->zErrMsg, db, "too many levels of trigger recursion");
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user