From: drh Date: Fri, 23 Dec 2016 13:30:53 +0000 (+0000) Subject: Fix the VList object so that it actually works. X-Git-Tag: version-3.16.0~27^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f326d66d618c50bfcb348e3023793524da25c28b;p=thirdparty%2Fsqlite.git Fix the VList object so that it actually works. FossilOrigin-Name: 9dcd85698af46fd5ba34004ca690d368c4ae3078 --- diff --git a/manifest b/manifest index 7c7b701cf1..ed40e8d7f5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\sVList\sobject\sto\sreplace\sParse.azVar\sfor\stracking\sthe\smapping\sbetween\nSQL\sparameter\snames\sand\sparameter\snumbers.\s\sThere\sis\sa\sperformance\nimprovement,\sthough\sthere\sare\sstill\sa\sfew\shiccups\sin\sthe\scurrent\scode. -D 2016-12-23T03:59:31.797 +C Fix\sthe\sVList\sobject\sso\sthat\sit\sactually\sworks. +D 2016-12-23T13:30:53.667 F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da @@ -341,7 +341,7 @@ F src/ctime.c 9f2296a4e5d26ebf0e0d95a0af4628f1ea694e7a F src/date.c b48378aeac68fa20c811404955a9b62108df47d8 F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d F src/delete.c c8bc10d145c9666a34ae906250326fdaa8d58fa5 -F src/expr.c e640b1c82b0f22f6c00b75989b0c13503bd5083e +F src/expr.c fedcfcd8749f95627dfe0aeb5630b68c5979cb0b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae F src/func.c 43916c1d8e6da5d107d91d2b212577d4f69a876a @@ -459,7 +459,7 @@ F src/vdbe.c 54b12d95dbf10533ab2584acbf31ae12b8bfe171 F src/vdbe.h 50ee139f9c68fff91be1d717ed3a6abbd496919c F src/vdbeInt.h 281cb70332dc8b593b8c7afe776f3a2ba7d4255e F src/vdbeapi.c d6ebaa465f070eb1af8ba4e7b34583ece87bdd24 -F src/vdbeaux.c 1e2840804828d32332565485b7faa755a3acabdb +F src/vdbeaux.c 12919c5aa354296d6b9ba808bca3e9dda836858c F src/vdbeblob.c f4f98ea672b242f807c08c92c7faaa79e5091b65 F src/vdbemem.c d3fd85b7b7ef3eb75de29c6d7e1d10d3ca78b4fd F src/vdbesort.c eda25cb2d1727efca6f7862fea32b8aa33c0face @@ -1539,10 +1539,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fa86db2f915c0a189c3be02b1aaa7f24d339d7d6 -R 4ff4f0f6aea9a4ccf6f07bfaa8f513d5 -T *branch * VList -T *sym-VList * -T -sym-trunk * +P 68ecafa1425a41358c88f41efea3262f1b4490f2 +R e3b464298f4645ba05beea0d35779569 U drh -Z d52e7f32e7ed6699ecd9b8a5a1a7ee92 +Z e1b50397ad009309edd4038594b0291c diff --git a/manifest.uuid b/manifest.uuid index f19d36a035..d87d18b9ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68ecafa1425a41358c88f41efea3262f1b4490f2 \ No newline at end of file +9dcd85698af46fd5ba34004ca690d368c4ae3078 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ae6107449d..3f8406bc53 100644 --- a/src/expr.c +++ b/src/expr.c @@ -945,6 +945,7 @@ Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ sqlite3 *db = pParse->db; const char *z; + ynVar x; if( pExpr==0 ) return; assert( !ExprHasProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) ); @@ -955,9 +956,9 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ if( z[1]==0 ){ /* Wildcard of the form "?". Assign the next variable number */ assert( z[0]=='?' ); - pExpr->iColumn = (ynVar)(++pParse->nVar); + x = (ynVar)(++pParse->nVar); }else{ - ynVar x; + int doAdd = 0; if( z[0]=='?' ){ /* Wildcard of the form "?nnn". Convert "nnn" to an integer and ** use it as the variable number */ @@ -973,8 +974,11 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); return; } - if( i>pParse->nVar ){ - pParse->nVar = (int)i; + if( x>pParse->nVar ){ + pParse->nVar = (int)x; + doAdd = 1; + }else if( sqlite3VListNumToName(pParse->pVList, x)==0 ){ + doAdd = 1; } }else{ /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable @@ -984,12 +988,15 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ x = (ynVar)sqlite3VListNameToNum(pParse->pVList, z, n); if( x==0 ){ x = (ynVar)(++pParse->nVar); - pParse->pVList = sqlite3VListAdd(db, pParse->pVList, z, n, x); + doAdd = 1; } } - pExpr->iColumn = x; - } - if( pParse->nVar>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + if( doAdd ){ + pParse->pVList = sqlite3VListAdd(db, pParse->pVList, z, n, x); + } + } + pExpr->iColumn = x; + if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "too many SQL variables"); } } @@ -3414,10 +3421,8 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); if( pExpr->u.zToken[1]!=0 ){ const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); - if( z ){ - assert( pExpr->u.zToken[0]=='?' || strcmp(pExpr->u.zToken, z)==0 ); - sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); - } + assert( pExpr->u.zToken[0]=='?' || strcmp(pExpr->u.zToken, z)==0 ); + sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); } return target; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 53aedf4983..7c9a295c92 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2970,7 +2970,6 @@ void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, int mask){ */ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ SubProgram *pSub, *pNext; - int i; assert( p->db==0 || p->db==db ); releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); for(pSub=p->pProgram; pSub; pSub=pNext){ @@ -2987,10 +2986,13 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - for(i=0; inScan; i++){ - sqlite3DbFree(db, p->aScan[i].zName); + { + int i; + for(i=0; inScan; i++){ + sqlite3DbFree(db, p->aScan[i].zName); + } + sqlite3DbFree(db, p->aScan); } - sqlite3DbFree(db, p->aScan); #endif }