diff options
author | dan <dan@noemail.net> | 2010-08-17 19:34:13 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2010-08-17 19:34:13 +0000 |
commit | c8d735aed30be0d41689a08dd273330a3cd63ec8 (patch) | |
tree | 668dfb92d98175abab4a0c02d744a203db68ab6e /src/expr.c | |
parent | 0028486b7346479504b43a5bd5cd0b4e3d4bd907 (diff) | |
download | sqlite-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.c | 5 |
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]); } |