]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the VList object so that it actually works.
authordrh <drh@noemail.net>
Fri, 23 Dec 2016 13:30:53 +0000 (13:30 +0000)
committerdrh <drh@noemail.net>
Fri, 23 Dec 2016 13:30:53 +0000 (13:30 +0000)
FossilOrigin-Name: 9dcd85698af46fd5ba34004ca690d368c4ae3078

manifest
manifest.uuid
src/expr.c
src/vdbeaux.c

index 7c7b701cf132bd8c7405332874d2eb92a3e62a9e..ed40e8d7f513dffc4fd158986b572b40d273d245 100644 (file)
--- 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
index f19d36a035757c55ad79c22ae341c477ef24c9c6..d87d18b9ad043b6c3934d9fe9b3df4f771f7edd7 100644 (file)
@@ -1 +1 @@
-68ecafa1425a41358c88f41efea3262f1b4490f2
\ No newline at end of file
+9dcd85698af46fd5ba34004ca690d368c4ae3078
\ No newline at end of file
index ae6107449da91664f6b087399118581caaaf50a8..3f8406bc53dad88149325275dbd60ede74fbf9b9 100644 (file)
@@ -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;
     }
index 53aedf4983755a819aba267f0677d34c0fe40273..7c9a295c9293594951cf9461a6351b88f05919da 100644 (file)
@@ -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; i<p->nScan; i++){
-    sqlite3DbFree(db, p->aScan[i].zName);
+  {
+    int i;
+    for(i=0; i<p->nScan; i++){
+      sqlite3DbFree(db, p->aScan[i].zName);
+    }
+    sqlite3DbFree(db, p->aScan);
   }
-  sqlite3DbFree(db, p->aScan);
 #endif
 }