aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2010-08-17 19:34:13 +0000
committerdan <dan@noemail.net>2010-08-17 19:34:13 +0000
commitc8d735aed30be0d41689a08dd273330a3cd63ec8 (patch)
tree668dfb92d98175abab4a0c02d744a203db68ab6e /src/expr.c
parent0028486b7346479504b43a5bd5cd0b4e3d4bd907 (diff)
downloadsqlite-c8d735aed30be0d41689a08dd273330a3cd63ec8.tar.gz
sqlite-c8d735aed30be0d41689a08dd273330a3cd63ec8.zip
Return an error when parsing "?NNN" if NNN is so large it cannot be stored as a 32-bit int.
FossilOrigin-Name: fc9014be0f00d046e7ba830a644f9ce93eca5db8
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/expr.c b/src/expr.c
index 153751f7c..fd21eb558 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -554,13 +554,14 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
}else if( z[0]=='?' ){
/* Wildcard of the form "?nnn". Convert "nnn" to an integer and
** use it as the variable number */
- int i = atoi((char*)&z[1]);
+ i64 i;
+ int bOk = sqlite3Atoi64(&z[1], &i);
pExpr->iColumn = (ynVar)i;
testcase( i==0 );
testcase( i==1 );
testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 );
testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] );
- if( i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
+ if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d",
db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]);
}