Remove the P3 and label arguments from the internal sqliteVdbeAddOp()
function.  This makes the code easier to read and perhaps smaller as
well. (CVS 286)

FossilOrigin-Name: 288ef1247b94c6c933451d120cdc78e471efc14e
diff --git a/src/build.c b/src/build.c
index 59b993b..8d42886 100644
--- a/src/build.c
+++ b/src/build.c
@@ -25,7 +25,7 @@
 **     ROLLBACK
 **     PRAGMA
 **
-** $Id: build.c,v 1.47 2001/10/12 17:30:05 drh Exp $
+** $Id: build.c,v 1.48 2001/10/13 01:06:48 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -421,12 +421,13 @@
   pParse->pNewTable = pTable;
   if( !pParse->initFlag && (v = sqliteGetVdbe(pParse))!=0 ){
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
       pParse->schemaVerified = 1;
     }
     if( !isTemp ){
-      sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2, MASTER_NAME, 0);
+      sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2);
+      sqliteVdbeChangeP3(v, -1, MASTER_NAME, P3_STATIC);
     }
   }
 }
@@ -605,25 +606,28 @@
     if( v==0 ) return;
     n = (int)pEnd->z - (int)pParse->sFirstToken.z + 1;
     if( !p->isTemp ){
-      sqliteVdbeAddOp(v, OP_NewRecno, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_String, 0, 0, "table", 0);
-      sqliteVdbeAddOp(v, OP_String, 0, 0, p->zName, 0);
-      sqliteVdbeAddOp(v, OP_String, 0, 0, p->zName, 0);
+      sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
+      sqliteVdbeChangeP3(v, -1, "table", P3_STATIC);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
+      sqliteVdbeChangeP3(v, -1, p->zName, P3_STATIC);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
+      sqliteVdbeChangeP3(v, -1, p->zName, P3_STATIC);
     }
-    addr = sqliteVdbeAddOp(v, OP_CreateTable, 0, 0, 0, 0);
-    sqliteVdbeChangeP3(v, addr, (char *)&p->tnum, -1);
+    addr = sqliteVdbeAddOp(v, OP_CreateTable, 0, 0);
+    sqliteVdbeChangeP3(v, addr, (char *)&p->tnum, P3_POINTER);
     p->tnum = 0;
     if( !p->isTemp ){
-      addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
+      addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
       sqliteVdbeChangeP3(v, addr, pParse->sFirstToken.z, n);
-      sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0);
+      sqliteVdbeAddOp(v, OP_Put, 0, 0);
       changeCookie(db);
-      sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_Close, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0);
+      sqliteVdbeAddOp(v, OP_Close, 0, 0);
     }
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Commit, 0, 0);
     }
   }
 }
@@ -687,22 +691,22 @@
     };
     Index *pIdx;
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
       pParse->schemaVerified = 1;
     }
     if( !pTable->isTemp ){
       base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable);
-      sqliteVdbeChangeP3(v, base+2, pTable->zName, 0);
+      sqliteVdbeChangeP3(v, base+2, pTable->zName, P3_STATIC);
       changeCookie(db);
       sqliteVdbeChangeP1(v, base+9, db->next_cookie);
     }
-    sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->isTemp, 0, 0);
+    sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->isTemp);
     for(pIdx=pTable->pIndex; pIdx; pIdx=pIdx->pNext){
-      sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pTable->isTemp, 0, 0);
+      sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pTable->isTemp);
     }
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Commit, 0, 0);
     }
   }
 
@@ -916,66 +920,72 @@
     if( v==0 ) goto exit_create_index;
     if( pTable!=0 ){
       if( (db->flags & SQLITE_InTrans)==0 ){
-        sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+        sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
         pParse->schemaVerified = 1;
       }
       if( !isTemp ){
-        sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2, MASTER_NAME, 0);
+        sqliteVdbeAddOp(v, OP_OpenWrite, 0, 2);
+        sqliteVdbeChangeP3(v, -1, MASTER_NAME, P3_STATIC);
       }
     }
     if( !isTemp ){
-      sqliteVdbeAddOp(v, OP_NewRecno, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_String, 0, 0, "index", 0);
-      sqliteVdbeAddOp(v, OP_String, 0, 0, pIndex->zName, 0);
-      sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->zName, 0);
+      sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
+      sqliteVdbeChangeP3(v, -1, "index", P3_STATIC);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
+      sqliteVdbeChangeP3(v, -1, pIndex->zName, P3_STATIC);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
+      sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
     }
-    addr = sqliteVdbeAddOp(v, OP_CreateIndex, 0, isTemp, 0, 0);
-    sqliteVdbeChangeP3(v, addr, (char*)&pIndex->tnum, -1);
+    addr = sqliteVdbeAddOp(v, OP_CreateIndex, 0, isTemp);
+    sqliteVdbeChangeP3(v, addr, (char*)&pIndex->tnum, P3_POINTER);
     pIndex->tnum = 0;
     if( pTable ){
       if( isTemp ){
-        sqliteVdbeAddOp(v, OP_OpenWrAux, 1, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_OpenWrAux, 1, 0);
       }else{
-        sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Dup, 0, 0);
+        sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0);
       }
     }
     if( !isTemp ){
-      addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
+      addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
       if( pStart && pEnd ){
         n = (int)pEnd->z - (int)pStart->z + 1;
         sqliteVdbeChangeP3(v, addr, pStart->z, n);
       }
-      sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0);
+      sqliteVdbeAddOp(v, OP_Put, 0, 0);
     }
     if( pTable ){
-      sqliteVdbeAddOp(v, isTemp ? OP_OpenAux : OP_Open, 
-                      2, pTab->tnum, pTab->zName, 0);
+      sqliteVdbeAddOp(v, isTemp ? OP_OpenAux : OP_Open, 2, pTab->tnum);
+      sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
       lbl1 = sqliteVdbeMakeLabel(v);
       lbl2 = sqliteVdbeMakeLabel(v);
-      sqliteVdbeAddOp(v, OP_Rewind, 2, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_Next, 2, lbl2, 0, lbl1);
-      sqliteVdbeAddOp(v, OP_Recno, 2, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Rewind, 2, 0);
+      sqliteVdbeResolveLabel(v, lbl1);
+      sqliteVdbeAddOp(v, OP_Next, 2, lbl2);
+      sqliteVdbeAddOp(v, OP_Recno, 2, 0);
       for(i=0; i<pIndex->nColumn; i++){
-        sqliteVdbeAddOp(v, OP_Column, 2, pIndex->aiColumn[i], 0, 0);
+        sqliteVdbeAddOp(v, OP_Column, 2, pIndex->aiColumn[i]);
       }
-      sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_PutIdx, 1, pIndex->isUnique, 0, 0);
-      sqliteVdbeAddOp(v, OP_Goto, 0, lbl1, 0, 0);
-      sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, lbl2);
-      sqliteVdbeAddOp(v, OP_Close, 2, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_Close, 1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_MakeIdxKey, pIndex->nColumn, 0);
+      sqliteVdbeAddOp(v, OP_PutIdx, 1, pIndex->isUnique);
+      sqliteVdbeAddOp(v, OP_Goto, 0, lbl1);
+      sqliteVdbeResolveLabel(v, lbl2);
+      sqliteVdbeAddOp(v, OP_Noop, 0, 0);
+      sqliteVdbeAddOp(v, OP_Close, 2, 0);
+      sqliteVdbeAddOp(v, OP_Close, 1, 0);
     }
     if( pTable!=0 ){
       if( !isTemp ){
         changeCookie(db);
-        sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_Close, 0, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_SetCookie, db->next_cookie, 0);
+        sqliteVdbeAddOp(v, OP_Close, 0, 0);
       }
       if( (db->flags & SQLITE_InTrans)==0 ){
-        sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Commit, 0, 0);
       }
     }
   }
@@ -1028,19 +1038,19 @@
     Table *pTab = pIndex->pTable;
 
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
       pParse->schemaVerified = 1;
     }
     if( !pTab->isTemp ){
       base = sqliteVdbeAddOpList(v, ArraySize(dropIndex), dropIndex);
-      sqliteVdbeChangeP3(v, base+2, pIndex->zName, 0);
+      sqliteVdbeChangeP3(v, base+2, pIndex->zName, P3_STATIC);
       changeCookie(db);
       sqliteVdbeChangeP1(v, base+9, db->next_cookie);
     }
-    sqliteVdbeAddOp(v, OP_Destroy, pIndex->tnum, pTab->isTemp, 0, 0);
+    sqliteVdbeAddOp(v, OP_Destroy, pIndex->tnum, pTab->isTemp);
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Commit, 0, 0);
     }
   }
 
@@ -1205,49 +1215,52 @@
   if( v ){
     int openOp;
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+      sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
       pParse->schemaVerified = 1;
     }
-    addr = sqliteVdbeAddOp(v, OP_FileOpen, 0, 0, 0, 0);
+    addr = sqliteVdbeAddOp(v, OP_FileOpen, 0, 0);
     sqliteVdbeChangeP3(v, addr, pFilename->z, pFilename->n);
     sqliteVdbeDequoteP3(v, addr);
     openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite;
-    sqliteVdbeAddOp(v, openOp, 0, pTab->tnum, pTab->zName, 0);
+    sqliteVdbeAddOp(v, openOp, 0, pTab->tnum);
+    sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
     for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
-      sqliteVdbeAddOp(v, openOp, i, pIdx->tnum, pIdx->zName, 0);
+      sqliteVdbeAddOp(v, openOp, i, pIdx->tnum);
+      sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
     }
     end = sqliteVdbeMakeLabel(v);
-    addr = sqliteVdbeAddOp(v, OP_FileRead, pTab->nCol, end, 0, 0);
+    addr = sqliteVdbeAddOp(v, OP_FileRead, pTab->nCol, end);
     if( pDelimiter ){
       sqliteVdbeChangeP3(v, addr, pDelimiter->z, pDelimiter->n);
       sqliteVdbeDequoteP3(v, addr);
     }else{
       sqliteVdbeChangeP3(v, addr, "\t", 1);
     }
-    sqliteVdbeAddOp(v, OP_NewRecno, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);
     if( pTab->pIndex ){
-      sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Dup, 0, 0);
     }
     for(i=0; i<pTab->nCol; i++){
-      sqliteVdbeAddOp(v, OP_FileColumn, i, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_FileColumn, i, 0);
     }
-    sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0);
+    sqliteVdbeAddOp(v, OP_Put, 0, 0);
     for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
       if( pIdx->pNext ){
-        sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Dup, 0, 0);
       }
       for(j=0; j<pIdx->nColumn; j++){
-        sqliteVdbeAddOp(v, OP_FileColumn, pIdx->aiColumn[j], 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_FileColumn, pIdx->aiColumn[j], 0);
       }
-      sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_PutIdx, i, pIdx->isUnique, 0, 0);
+      sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0);
+      sqliteVdbeAddOp(v, OP_PutIdx, i, pIdx->isUnique);
     }
-    sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0);
-    sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, end);
+    sqliteVdbeAddOp(v, OP_Goto, 0, addr);
+    sqliteVdbeResolveLabel(v, end);
+    sqliteVdbeAddOp(v, OP_Noop, 0, 0);
     if( (db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Commit, 0, 0);
     }
   }
   
@@ -1280,26 +1293,29 @@
   v = sqliteGetVdbe(pParse);
   if( v==0 ) goto vacuum_cleanup;
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
     pParse->schemaVerified = 1;
   }
   if( zName ){
-    sqliteVdbeAddOp(v, OP_Reorganize, 0, 0, zName, 0);
+    sqliteVdbeAddOp(v, OP_Reorganize, 0, 0);
+    sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
   }else{
     Table *pTab;
     Index *pIdx;
     HashElem *pE;
     for(pE=sqliteHashFirst(&db->tblHash); pE; pE=sqliteHashNext(pE)){
       pTab = sqliteHashData(pE);
-      sqliteVdbeAddOp(v, OP_Reorganize, 0, 0, pTab->zName, 0);
+      sqliteVdbeAddOp(v, OP_Reorganize, 0, 0);
+      sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
       for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
-        sqliteVdbeAddOp(v, OP_Reorganize, 0, 0, pIdx->zName, 0);
+        sqliteVdbeAddOp(v, OP_Reorganize, 0, 0);
+        sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
       }
     }
   }
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Commit, 0, 0);
   }
 
 vacuum_cleanup:
@@ -1319,8 +1335,8 @@
   if( db->flags & SQLITE_InTrans ) return;
   v = sqliteGetVdbe(pParse);
   if( v ){
-    sqliteVdbeAddOp(v, OP_Transaction, 1, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Transaction, 1, 0);
+    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
     pParse->schemaVerified = 1;
   }
   db->flags |= SQLITE_InTrans;
@@ -1338,7 +1354,7 @@
   if( (db->flags & SQLITE_InTrans)==0 ) return;
   v = sqliteGetVdbe(pParse);
   if( v ){
-    sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Commit, 0, 0);
   }
   db->flags &= ~SQLITE_InTrans;
 }
@@ -1355,7 +1371,7 @@
   if( (db->flags & SQLITE_InTrans)==0 ) return;
   v = sqliteGetVdbe(pParse);
   if( v ){
-    sqliteVdbeAddOp(v, OP_Rollback, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Rollback, 0, 0);
   }
   db->flags &= ~SQLITE_InTrans;
 }
@@ -1440,13 +1456,16 @@
       int i;
       sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface);
       for(i=0; i<pTab->nCol; i++){
-        sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zName, 0);
-        sqliteVdbeAddOp(v, OP_String, 0, 0, 
-           pTab->aCol[i].zType ? pTab->aCol[i].zType : "text", 0);
-        sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zDflt, 0);
-        sqliteVdbeAddOp(v, OP_Callback, 5, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Integer, i, 0);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zName, P3_STATIC);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, 
+           pTab->aCol[i].zType ? pTab->aCol[i].zType : "text", P3_STATIC);
+        sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC);
+        sqliteVdbeAddOp(v, OP_Callback, 5, 0);
       }
     }
   }else
@@ -1468,11 +1487,12 @@
       pTab = pIdx->pTable;
       sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface);
       for(i=0; i<pIdx->nColumn; i++){
-        sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_Integer, pIdx->aiColumn[i], 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_String, 0, 0,
-            pTab->aCol[pIdx->aiColumn[i]].zName, 0);
-        sqliteVdbeAddOp(v, OP_Callback, 3, 0, 0, 0);
+        int cnum = pIdx->aiColumn[i];
+        sqliteVdbeAddOp(v, OP_Integer, i, 0);
+        sqliteVdbeAddOp(v, OP_Integer, cnum, 0);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, pTab->aCol[cnum].zName, P3_STATIC);
+        sqliteVdbeAddOp(v, OP_Callback, 3, 0);
       }
     }
   }else
@@ -1497,10 +1517,11 @@
 
       sqliteVdbeAddOpList(v, ArraySize(indexListPreface), indexListPreface);
       while(pIdx){
-        sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_String, 0, 0, pIdx->zName, 0);
-        sqliteVdbeAddOp(v, OP_Integer, pIdx->isUnique, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_Callback, 3, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Integer, i, 0);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
+        sqliteVdbeAddOp(v, OP_Integer, pIdx->isUnique, 0);
+        sqliteVdbeAddOp(v, OP_Callback, 3, 0);
 	++i;
 	pIdx = pIdx->pNext;
       }
diff --git a/src/delete.c b/src/delete.c
index 6b02eb5..6534f30 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -12,7 +12,7 @@
 ** This file contains C code routines that are called by the parser
 ** to handle DELETE FROM statements.
 **
-** $Id: delete.c,v 1.16 2001/10/08 13:22:32 drh Exp $
+** $Id: delete.c,v 1.17 2001/10/13 01:06:48 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -81,8 +81,8 @@
   v = sqliteGetVdbe(pParse);
   if( v==0 ) goto delete_from_cleanup;
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
     pParse->schemaVerified = 1;
   }
 
@@ -91,9 +91,9 @@
   ** It is easier just to erase the whole table.
   */
   if( pWhere==0 ){
-    sqliteVdbeAddOp(v, OP_Clear, pTab->tnum, pTab->isTemp, 0, 0);
+    sqliteVdbeAddOp(v, OP_Clear, pTab->tnum, pTab->isTemp);
     for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
-      sqliteVdbeAddOp(v, OP_Clear, pIdx->tnum, pTab->isTemp, 0, 0);
+      sqliteVdbeAddOp(v, OP_Clear, pIdx->tnum, pTab->isTemp);
     }
   }
 
@@ -105,13 +105,13 @@
 
     /* Begin the database scan
     */
-    sqliteVdbeAddOp(v, OP_ListOpen, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_ListOpen, 0, 0);
     pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 1);
     if( pWInfo==0 ) goto delete_from_cleanup;
 
     /* Remember the key of every item to be deleted.
     */
-    sqliteVdbeAddOp(v, OP_ListWrite, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_ListWrite, 0, 0);
 
     /* End the database scan loop.
     */
@@ -122,32 +122,33 @@
     ** because deleting an item can change the scan order.
     */
     base = pParse->nTab;
-    sqliteVdbeAddOp(v, OP_ListRewind, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_ListRewind, 0, 0);
     openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite;
-    sqliteVdbeAddOp(v, openOp, base, pTab->tnum, 0, 0);
+    sqliteVdbeAddOp(v, openOp, base, pTab->tnum);
     for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
-      sqliteVdbeAddOp(v, openOp, base+i, pIdx->tnum, 0, 0);
+      sqliteVdbeAddOp(v, openOp, base+i, pIdx->tnum);
     }
     end = sqliteVdbeMakeLabel(v);
-    addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end, 0, 0);
-    sqliteVdbeAddOp(v, OP_MoveTo, base, 0, 0, 0);
+    addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end);
+    sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
     if( pTab->pIndex ){
       for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
         int j;
-        sqliteVdbeAddOp(v, OP_Recno, base, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Recno, base, 0);
         for(j=0; j<pIdx->nColumn; j++){
-          sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j], 0, 0);
+          sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j]);
         }
-        sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0);
-        sqliteVdbeAddOp(v, OP_DeleteIdx, base+i, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0);
+        sqliteVdbeAddOp(v, OP_DeleteIdx, base+i, 0);
       }
     }
-    sqliteVdbeAddOp(v, OP_Delete, base, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0);
-    sqliteVdbeAddOp(v, OP_ListClose, 0, 0, 0, end);
+    sqliteVdbeAddOp(v, OP_Delete, base, 0);
+    sqliteVdbeAddOp(v, OP_Goto, 0, addr);
+    sqliteVdbeResolveLabel(v, end);
+    sqliteVdbeAddOp(v, OP_ListClose, 0, 0);
   }
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Commit, 0, 0);
   }
 
 
diff --git a/src/expr.c b/src/expr.c
index 0bf7472..5ace178 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -12,7 +12,7 @@
 ** This file contains routines used for analyzing expressions and
 ** for generating VDBE code that evaluates expressions in SQLite.
 **
-** $Id: expr.c,v 1.29 2001/10/06 16:33:03 drh Exp $
+** $Id: expr.c,v 1.30 2001/10/13 01:06:48 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -234,7 +234,7 @@
         ** table.  The cursor number of the temporary table has already
         ** been put in iTable by sqliteExprResolveInSelect().
         */
-        sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 0);
         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
       }else if( pExpr->pList ){
         /* Case 2:     expr IN (exprlist)
@@ -262,14 +262,14 @@
             case TK_FLOAT:
             case TK_INTEGER:
             case TK_STRING: {
-              int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
+              int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
               sqliteVdbeDequoteP3(v, addr);
               break;
             }
             default: {
               sqliteExprCode(pParse, pE2);
-              sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
+              sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
               break;
             }
           }
@@ -501,32 +501,32 @@
   switch( pExpr->op ){
     case TK_COLUMN: {
       if( pParse->useAgg ){
-        sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
+        sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
       }else if( pExpr->iColumn>=0 ){
-        sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn, 0, 0);
+        sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
       }else{
-        sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
       }
       break;
     }
     case TK_INTEGER: {
       int i = atoi(pExpr->token.z);
-      sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Integer, i, 0);
       break;
     }
     case TK_FLOAT: {
-      int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
+      int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
       break;
     }
     case TK_STRING: {
-      int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
+      int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
       sqliteVdbeDequoteP3(v, addr);
       break;
     }
     case TK_NULL: {
-      sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
       break;
     }
     case TK_AND:
@@ -537,13 +537,13 @@
     case TK_SLASH: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
-      sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, 0);
       break;
     }
     case TK_CONCAT: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
-      sqliteVdbeAddOp(v, OP_Concat, 2, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Concat, 2, 0);
       break;
     }
     case TK_LT:
@@ -555,25 +555,26 @@
     case TK_LIKE: 
     case TK_GLOB: {
       int dest;
-      sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Integer, 1, 0);
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
       dest = sqliteVdbeCurrentAddr(v) + 2;
-      sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
-      sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, dest);
+      sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
       break;
     }
     case TK_UMINUS: {
       assert( pExpr->pLeft );
       if( pExpr->pLeft->op==TK_INTEGER ){
         int i = atoi(pExpr->pLeft->token.z);
-        sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Integer, -i, 0);
         break;
       }else if( pExpr->pLeft->op==TK_FLOAT ){
         Token *p = &pExpr->pLeft->token;
         char *z = sqliteMalloc( p->n + 2 );
         sprintf(z, "-%.*s", p->n, p->z);
-        sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, z, p->n+1);
         sqliteFree(z);
         break;
       }
@@ -581,25 +582,25 @@
     }
     case TK_NOT: {
       sqliteExprCode(pParse, pExpr->pLeft);
-      sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, 0);
       break;
     }
     case TK_ISNULL:
     case TK_NOTNULL: {
       int dest;
-      sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Integer, 1, 0);
       sqliteExprCode(pParse, pExpr->pLeft);
       dest = sqliteVdbeCurrentAddr(v) + 2;
-      sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
-      sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, dest);
+      sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
       break;
     }
     case TK_AGG_FUNCTION: {
-      sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
+      sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
       if( pExpr->iColumn==FN_Avg ){
         assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
-        sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0);
-        sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
+        sqliteVdbeAddOp(v, OP_Divide, 0, 0);
       }
       break;
     }
@@ -610,7 +611,7 @@
       ExprList *pList = pExpr->pList;
       switch( id ){
         case FN_Fcnt: {
-          sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0);
+          sqliteVdbeAddOp(v, OP_Fcnt, 0, 0);
           break;
         }
         case FN_Min: 
@@ -619,21 +620,21 @@
           for(i=0; i<pList->nExpr; i++){
             sqliteExprCode(pParse, pList->a[i].pExpr);
             if( i>0 ){
-              sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
+              sqliteVdbeAddOp(v, op, 0, 0);
             }
           }
           break;
         }
         case FN_Length: {
           sqliteExprCode(pParse, pList->a[0].pExpr);
-          sqliteVdbeAddOp(v, OP_Strlen, 0, 0, 0, 0);
+          sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
           break;
         }
         case FN_Substr: {
           for(i=0; i<pList->nExpr; i++){
             sqliteExprCode(pParse, pList->a[i].pExpr);
           }
-          sqliteVdbeAddOp(v, OP_Substr, 0, 0, 0, 0);
+          sqliteVdbeAddOp(v, OP_Substr, 0, 0);
           break;
         }
         default: {
@@ -644,27 +645,27 @@
       break;
     }
     case TK_SELECT: {
-      sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
       break;
     }
     case TK_IN: {
       int addr;
-      sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Integer, 1, 0);
       sqliteExprCode(pParse, pExpr->pLeft);
       addr = sqliteVdbeCurrentAddr(v);
       if( pExpr->pSelect ){
-        sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0);
+        sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
       }else{
-        sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0);
+        sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
       }
-      sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
       break;
     }
     case TK_BETWEEN: {
       int lbl = sqliteVdbeMakeLabel(v);
-      sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Integer, 0, 0);
       sqliteExprIfFalse(pParse, pExpr, lbl);
-      sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
       sqliteVdbeResolveLabel(v, lbl);
       break;
     }
@@ -721,39 +722,40 @@
     case TK_GLOB: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
-      sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, dest);
       break;
     }
     case TK_ISNULL:
     case TK_NOTNULL: {
       sqliteExprCode(pParse, pExpr->pLeft);
-      sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, dest);
       break;
     }
     case TK_IN: {
       sqliteExprCode(pParse, pExpr->pLeft);
       if( pExpr->pSelect ){
-        sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0);
+        sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
       }else{
-        sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0);
+        sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
       }
       break;
     }
     case TK_BETWEEN: {
       int lbl = sqliteVdbeMakeLabel(v);
       sqliteExprCode(pParse, pExpr->pLeft);
-      sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Dup, 0, 0);
       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
-      sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0);
+      sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
-      sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0);
-      sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl);
+      sqliteVdbeAddOp(v, OP_Le, 0, dest);
+      sqliteVdbeAddOp(v, OP_Integer, 0, 0);
+      sqliteVdbeResolveLabel(v, lbl);
+      sqliteVdbeAddOp(v, OP_Pop, 1, 0);
       break;
     }
     default: {
       sqliteExprCode(pParse, pExpr);
-      sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, OP_If, 0, dest);
       break;
     }
   }
@@ -806,48 +808,48 @@
     case TK_EQ: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
-      sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, dest);
       break;
     }
     case TK_LIKE:
     case TK_GLOB: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
-      sqliteVdbeAddOp(v, op, 1, dest, 0, 0);
+      sqliteVdbeAddOp(v, op, 1, dest);
       break;
     }
     case TK_ISNULL:
     case TK_NOTNULL: {
       sqliteExprCode(pParse, pExpr->pLeft);
-      sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, dest);
       break;
     }
     case TK_IN: {
       sqliteExprCode(pParse, pExpr->pLeft);
       if( pExpr->pSelect ){
-        sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0);
+        sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
       }else{
-        sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0);
+        sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
       }
       break;
     }
     case TK_BETWEEN: {
       int addr;
       sqliteExprCode(pParse, pExpr->pLeft);
-      sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Dup, 0, 0);
       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
       addr = sqliteVdbeCurrentAddr(v);
-      sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0);
-      sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
+      sqliteVdbeAddOp(v, OP_Pop, 1, 0);
+      sqliteVdbeAddOp(v, OP_Goto, 0, dest);
       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
-      sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, OP_Gt, 0, dest);
       break;
     }
     default: {
       sqliteExprCode(pParse, pExpr);
-      sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
+      sqliteVdbeAddOp(v, OP_Not, 0, 0);
+      sqliteVdbeAddOp(v, OP_If, 0, dest);
       break;
     }
   }
diff --git a/src/insert.c b/src/insert.c
index 711f8eb..489f738 100644
--- a/src/insert.c
+++ b/src/insert.c
@@ -12,7 +12,7 @@
 ** This file contains C code routines that are called by the parser
 ** to handle INSERT statements in SQLite.
 **
-** $Id: insert.c,v 1.22 2001/10/08 13:22:33 drh Exp $
+** $Id: insert.c,v 1.23 2001/10/13 01:06:48 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -77,8 +77,8 @@
   v = sqliteGetVdbe(pParse);
   if( v==0 ) goto insert_cleanup;
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
     pParse->schemaVerified = 1;
   }
 
@@ -91,7 +91,7 @@
   if( pSelect ){
     int rc;
     srcTab = pParse->nTab++;
-    sqliteVdbeAddOp(v, OP_OpenTemp, srcTab, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_OpenTemp, srcTab, 0);
     rc = sqliteSelect(pParse, pSelect, SRT_Table, srcTab);
     if( rc || pParse->nErr || sqlite_malloc_failed ) goto insert_cleanup;
     assert( pSelect->pEList );
@@ -157,9 +157,11 @@
   */
   base = pParse->nTab;
   openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite;
-  sqliteVdbeAddOp(v, openOp, base, pTab->tnum, pTab->zName, 0);
+  sqliteVdbeAddOp(v, openOp, base, pTab->tnum);
+  sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
   for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
-    sqliteVdbeAddOp(v, openOp, idx+base, pIdx->tnum, pIdx->zName, 0);
+    sqliteVdbeAddOp(v, openOp, idx+base, pIdx->tnum);
+    sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC);
   }
 
   /* If the data source is a SELECT statement, then we have to create
@@ -168,16 +170,16 @@
   ** and the loop is not used.
   */
   if( srcTab>=0 ){
-    sqliteVdbeAddOp(v, OP_Rewind, srcTab, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Rewind, srcTab, 0);
     iBreak = sqliteVdbeMakeLabel(v);
-    iCont = sqliteVdbeAddOp(v, OP_Next, srcTab, iBreak, 0, 0);
+    iCont = sqliteVdbeAddOp(v, OP_Next, srcTab, iBreak);
   }
 
   /* Create a new entry in the table and fill it with data.
   */
-  sqliteVdbeAddOp(v, OP_NewRecno, base, 0, 0, 0);
+  sqliteVdbeAddOp(v, OP_NewRecno, base, 0);
   if( pTab->pIndex ){
-    sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Dup, 0, 0);
   }
   for(i=0; i<pTab->nCol; i++){
     if( pColumn==0 ){
@@ -188,22 +190,23 @@
       }
     }
     if( pColumn && j>=pColumn->nId ){
-      sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zDflt, 0);
+      sqliteVdbeAddOp(v, OP_String, 0, 0);
+      sqliteVdbeChangeP3(v, -1, pTab->aCol[i].zDflt, P3_STATIC);
     }else if( srcTab>=0 ){
-      sqliteVdbeAddOp(v, OP_Column, srcTab, i, 0, 0); 
+      sqliteVdbeAddOp(v, OP_Column, srcTab, i); 
     }else{
       sqliteExprCode(pParse, pList->a[j].pExpr);
     }
   }
-  sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0, 0, 0);
-  sqliteVdbeAddOp(v, OP_Put, base, 0, 0, 0);
+  sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0);
+  sqliteVdbeAddOp(v, OP_Put, base, 0);
 
   /* Create appropriate entries for the new data row in all indices
   ** of the table.
   */
   for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
     if( pIdx->pNext ){
-      sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Dup, 0, 0);
     }
     for(i=0; i<pIdx->nColumn; i++){
       int idx = pIdx->aiColumn[i];
@@ -215,25 +218,27 @@
         }
       }
       if( pColumn && j>=pColumn->nId ){
-        sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[idx].zDflt, 0);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, pTab->aCol[idx].zDflt, P3_STATIC);
       }else if( srcTab>=0 ){
-        sqliteVdbeAddOp(v, OP_Column, srcTab, idx, 0, 0); 
+        sqliteVdbeAddOp(v, OP_Column, srcTab, idx); 
       }else{
         sqliteExprCode(pParse, pList->a[j].pExpr);
       }
     }
-    sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_PutIdx, idx+base, pIdx->isUnique, 0, 0);
+    sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0);
+    sqliteVdbeAddOp(v, OP_PutIdx, idx+base, pIdx->isUnique);
   }
 
   /* The bottom of the loop, if the data source is a SELECT statement
   */
   if( srcTab>=0 ){
-    sqliteVdbeAddOp(v, OP_Goto, 0, iCont, 0, 0);
-    sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, iBreak);
+    sqliteVdbeAddOp(v, OP_Goto, 0, iCont);
+    sqliteVdbeResolveLabel(v, iBreak);
+    sqliteVdbeAddOp(v, OP_Noop, 0, 0);
   }
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Commit, 0, 0);
   }
 
 
diff --git a/src/select.c b/src/select.c
index ab1cc5a..ea265ba 100644
--- a/src/select.c
+++ b/src/select.c
@@ -12,7 +12,7 @@
 ** This file contains C code routines that are called by the parser
 ** to handle SELECT statements in SQLite.
 **
-** $Id: select.c,v 1.38 2001/10/06 16:33:03 drh Exp $
+** $Id: select.c,v 1.39 2001/10/13 01:06:48 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -110,7 +110,7 @@
     nColumn = pEList->nExpr;
   }else{
     for(i=0; i<nColumn; i++){
-      sqliteVdbeAddOp(v, OP_Column, srcTab, i, 0, 0);
+      sqliteVdbeAddOp(v, OP_Column, srcTab, i);
     }
   }
 
@@ -120,12 +120,14 @@
   */
   if( distinct>=0 ){
     int lbl = sqliteVdbeMakeLabel(v);
-    sqliteVdbeAddOp(v, OP_MakeKey, pEList->nExpr, 1, 0, 0);
-    sqliteVdbeAddOp(v, OP_Distinct, distinct, lbl, 0, 0);
-    sqliteVdbeAddOp(v, OP_Pop, pEList->nExpr+1, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_Goto, 0, iContinue, 0, 0);
-    sqliteVdbeAddOp(v, OP_String, 0, 0, "", lbl);
-    sqliteVdbeAddOp(v, OP_Put, distinct, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_MakeKey, pEList->nExpr, 1);
+    sqliteVdbeAddOp(v, OP_Distinct, distinct, lbl);
+    sqliteVdbeAddOp(v, OP_Pop, pEList->nExpr+1, 0);
+    sqliteVdbeAddOp(v, OP_Goto, 0, iContinue);
+    sqliteVdbeResolveLabel(v, lbl);
+    sqliteVdbeAddOp(v, OP_String, 0, 0);
+    sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
+    sqliteVdbeAddOp(v, OP_Put, distinct, 0);
   }
 
   /* If there is an ORDER BY clause, then store the results
@@ -133,7 +135,7 @@
   */
   if( pOrderBy ){
     char *zSortOrder;
-    sqliteVdbeAddOp(v, OP_SortMakeRec, nColumn, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_SortMakeRec, nColumn, 0);
     zSortOrder = sqliteMalloc( pOrderBy->nExpr + 1 );
     if( zSortOrder==0 ) return 1;
     for(i=0; i<pOrderBy->nExpr; i++){
@@ -141,27 +143,29 @@
       sqliteExprCode(pParse, pOrderBy->a[i].pExpr);
     }
     zSortOrder[pOrderBy->nExpr] = 0;
-    sqliteVdbeAddOp(v, OP_SortMakeKey, pOrderBy->nExpr, 0, zSortOrder, 0);
+    sqliteVdbeAddOp(v, OP_SortMakeKey, pOrderBy->nExpr, 0);
+    sqliteVdbeChangeP3(v, -1, zSortOrder, strlen(zSortOrder));
     sqliteFree(zSortOrder);
-    sqliteVdbeAddOp(v, OP_SortPut, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_SortPut, 0, 0);
   }else 
 
   /* In this mode, write each query result to the key of the temporary
   ** table iParm.
   */
   if( eDest==SRT_Union ){
-    sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_String, iParm, 0, "", 0);
-    sqliteVdbeAddOp(v, OP_Put, iParm, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
+    sqliteVdbeAddOp(v, OP_String, iParm, 0);
+    sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
+    sqliteVdbeAddOp(v, OP_Put, iParm, 0);
   }else 
 
   /* Store the result as data using a unique key.
   */
   if( eDest==SRT_Table ){
-    sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_NewRecno, iParm, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_Pull, 1, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_Put, iParm, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
+    sqliteVdbeAddOp(v, OP_NewRecno, iParm, 0);
+    sqliteVdbeAddOp(v, OP_Pull, 1, 0);
+    sqliteVdbeAddOp(v, OP_Put, iParm, 0);
   }else 
 
   /* Construct a record from the query result, but instead of
@@ -169,9 +173,9 @@
   ** the temporary table iParm.
   */
   if( eDest==SRT_Except ){
-    int addr = sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_NotFound, iParm, addr+3, 0, 0);
-    sqliteVdbeAddOp(v, OP_Delete, iParm, 0, 0, 0);
+    int addr = sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
+    sqliteVdbeAddOp(v, OP_NotFound, iParm, addr+3);
+    sqliteVdbeAddOp(v, OP_Delete, iParm, 0);
   }else 
 
   /* If we are creating a set for an "expr IN (SELECT ...)" construct,
@@ -180,8 +184,9 @@
   */
   if( eDest==SRT_Set ){
     assert( nColumn==1 );
-    sqliteVdbeAddOp(v, OP_String, 0, 0, "", 0);
-    sqliteVdbeAddOp(v, OP_Put, iParm, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_String, 0, 0);
+    sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
+    sqliteVdbeAddOp(v, OP_Put, iParm, 0);
   }else 
 
 
@@ -191,14 +196,14 @@
   */
   if( eDest==SRT_Mem ){
     assert( nColumn==1 );
-    sqliteVdbeAddOp(v, OP_MemStore, iParm, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_Goto, 0, iBreak, 0, 0);
+    sqliteVdbeAddOp(v, OP_MemStore, iParm, 0);
+    sqliteVdbeAddOp(v, OP_Goto, 0, iBreak);
   }else
 
   /* If none of the above, send the data to the callback function.
   */
   {
-    sqliteVdbeAddOp(v, OP_Callback, nColumn, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Callback, nColumn, 0);
   }
   return 0;
 }
@@ -212,11 +217,12 @@
 static void generateSortTail(Vdbe *v, int nColumn){
   int end = sqliteVdbeMakeLabel(v);
   int addr;
-  sqliteVdbeAddOp(v, OP_Sort, 0, 0, 0, 0);
-  addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end, 0, 0);
-  sqliteVdbeAddOp(v, OP_SortCallback, nColumn, 0, 0, 0);
-  sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0);
-  sqliteVdbeAddOp(v, OP_SortClose, 0, 0, 0, end);
+  sqliteVdbeAddOp(v, OP_Sort, 0, 0);
+  addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end);
+  sqliteVdbeAddOp(v, OP_SortCallback, nColumn, 0);
+  sqliteVdbeAddOp(v, OP_Goto, 0, addr);
+  sqliteVdbeResolveLabel(v, end);
+  sqliteVdbeAddOp(v, OP_SortClose, 0, 0);
 }
 
 /*
@@ -230,25 +236,26 @@
   int i;
   if( pParse->colNamesSet || v==0 || sqlite_malloc_failed ) return;
   pParse->colNamesSet = 1;
-  sqliteVdbeAddOp(v, OP_ColumnCount, pEList->nExpr, 0, 0, 0);
+  sqliteVdbeAddOp(v, OP_ColumnCount, pEList->nExpr, 0);
   for(i=0; i<pEList->nExpr; i++){
     Expr *p;
-    int addr;
     if( pEList->a[i].zName ){
       char *zName = pEList->a[i].zName;
-      sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0);
+      sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
+      sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
       continue;
     }
     p = pEList->a[i].pExpr;
     if( p==0 ) continue;
     if( p->span.z && p->span.z[0] ){
-      addr = sqliteVdbeAddOp(v,OP_ColumnName, i, 0, 0, 0);
-      sqliteVdbeChangeP3(v, addr, p->span.z, p->span.n);
+      int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, 0);
+      sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n);
       sqliteVdbeCompressSpace(v, addr);
     }else if( p->op!=TK_COLUMN || pTabList==0 ){
       char zName[30];
       sprintf(zName, "column%d", i+1);
-      sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0);
+      sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
+      sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
     }else{
       if( pTabList->nId>1 || (pParse->db->flags & SQLITE_FullColNames)!=0 ){
         char *zName = 0;
@@ -258,12 +265,14 @@
         zTab = pTabList->a[p->iTable].zAlias;
         if( zTab==0 ) zTab = pTab->zName;
         sqliteSetString(&zName, zTab, ".", pTab->aCol[p->iColumn].zName, 0);
-        sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0);
+        sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
+        sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
         sqliteFree(zName);
       }else{
         Table *pTab = pTabList->a[0].pTab;
         char *zName = pTab->aCol[p->iColumn].zName;
-        sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0);
+        sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
+        sqliteVdbeChangeP3(v, -1, zName, P3_STATIC);
       }
     }
   }
@@ -504,10 +513,10 @@
           return 1;
         }
         if( p->op!=TK_ALL ){
-          sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0, 0, 0);
-          sqliteVdbeAddOp(v, OP_KeyAsData, unionTab, 1, 0, 0);
+          sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0);
+          sqliteVdbeAddOp(v, OP_KeyAsData, unionTab, 1);
         }else{
-          sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0, 0, 0);
+          sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0);
         }
       }
 
@@ -536,17 +545,18 @@
         assert( p->pEList );
         generateColumnNames(pParse, 0, p->pEList);
         if( p->pOrderBy ){
-          sqliteVdbeAddOp(v, OP_SortOpen, 0, 0, 0, 0);
+          sqliteVdbeAddOp(v, OP_SortOpen, 0, 0);
         }
-        sqliteVdbeAddOp(v, OP_Rewind, unionTab, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_Rewind, unionTab, 0);
         iBreak = sqliteVdbeMakeLabel(v);
-        iCont = sqliteVdbeAddOp(v, OP_Next, unionTab, iBreak, 0, 0);
+        iCont = sqliteVdbeAddOp(v, OP_Next, unionTab, iBreak);
         rc = selectInnerLoop(pParse, 0, unionTab, p->pEList->nExpr,
                              p->pOrderBy, -1, eDest, iParm, 
                              iCont, iBreak);
         if( rc ) return 1;
-        sqliteVdbeAddOp(v, OP_Goto, 0, iCont, 0, 0);
-        sqliteVdbeAddOp(v, OP_Close, unionTab, 0, 0, iBreak);
+        sqliteVdbeAddOp(v, OP_Goto, 0, iCont);
+        sqliteVdbeResolveLabel(v, iBreak);
+        sqliteVdbeAddOp(v, OP_Close, unionTab, 0);
         if( p->pOrderBy ){
           generateSortTail(v, p->pEList->nExpr);
         }
@@ -566,8 +576,8 @@
       if( p->pOrderBy && matchOrderbyToColumn(pParse,p,p->pOrderBy,tab1,1) ){
         return 1;
       }
-      sqliteVdbeAddOp(v, OP_OpenTemp, tab1, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_KeyAsData, tab1, 1, 0, 0);
+      sqliteVdbeAddOp(v, OP_OpenTemp, tab1, 0);
+      sqliteVdbeAddOp(v, OP_KeyAsData, tab1, 1);
 
       /* Code the SELECTs to our left into temporary table "tab1".
       */
@@ -576,8 +586,8 @@
 
       /* Code the current SELECT into temporary table "tab2"
       */
-      sqliteVdbeAddOp(v, OP_OpenTemp, tab2, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_KeyAsData, tab2, 1, 0, 0);
+      sqliteVdbeAddOp(v, OP_OpenTemp, tab2, 0);
+      sqliteVdbeAddOp(v, OP_KeyAsData, tab2, 1);
       p->pPrior = 0;
       rc = sqliteSelect(pParse, p, SRT_Union, tab2);
       p->pPrior = pPrior;
@@ -589,20 +599,21 @@
       assert( p->pEList );
       generateColumnNames(pParse, 0, p->pEList);
       if( p->pOrderBy ){
-        sqliteVdbeAddOp(v, OP_SortOpen, 0, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_SortOpen, 0, 0);
       }
-      sqliteVdbeAddOp(v, OP_Rewind, tab1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Rewind, tab1, 0);
       iBreak = sqliteVdbeMakeLabel(v);
-      iCont = sqliteVdbeAddOp(v, OP_Next, tab1, iBreak, 0, 0);
-      sqliteVdbeAddOp(v, OP_FullKey, tab1, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_NotFound, tab2, iCont, 0, 0);
+      iCont = sqliteVdbeAddOp(v, OP_Next, tab1, iBreak);
+      sqliteVdbeAddOp(v, OP_FullKey, tab1, 0);
+      sqliteVdbeAddOp(v, OP_NotFound, tab2, iCont);
       rc = selectInnerLoop(pParse, 0, tab1, p->pEList->nExpr,
                              p->pOrderBy, -1, eDest, iParm, 
                              iCont, iBreak);
       if( rc ) return 1;
-      sqliteVdbeAddOp(v, OP_Goto, 0, iCont, 0, 0);
-      sqliteVdbeAddOp(v, OP_Close, tab2, 0, 0, iBreak);
-      sqliteVdbeAddOp(v, OP_Close, tab1, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Goto, 0, iCont);
+      sqliteVdbeResolveLabel(v, iBreak);
+      sqliteVdbeAddOp(v, OP_Close, tab2, 0);
+      sqliteVdbeAddOp(v, OP_Close, tab1, 0);
       if( p->pOrderBy ){
         generateSortTail(v, p->pEList->nExpr);
       }
@@ -842,7 +853,7 @@
   v = sqliteGetVdbe(pParse);
   if( v==0 ) return 1;
   if( pOrderBy ){
-    sqliteVdbeAddOp(v, OP_SortOpen, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_SortOpen, 0, 0);
   }
 
   /* Identify column names if we will be using in the callback.  This
@@ -855,20 +866,20 @@
   /* Reset the aggregator
   */
   if( isAgg ){
-    sqliteVdbeAddOp(v, OP_AggReset, 0, pParse->nAgg, 0, 0);
+    sqliteVdbeAddOp(v, OP_AggReset, 0, pParse->nAgg);
   }
 
   /* Initialize the memory cell to NULL
   */
   if( eDest==SRT_Mem ){
-    sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_MemStore, iParm, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_String, 0, 0);
+    sqliteVdbeAddOp(v, OP_MemStore, iParm, 0);
   }
 
   /* Begin the database scan
   */
   if( isDistinct ){
-    sqliteVdbeAddOp(v, OP_OpenTemp, distinct, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_OpenTemp, distinct, 0);
   }
   pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 0);
   if( pWInfo==0 ) return 1;
@@ -892,7 +903,7 @@
       for(i=0; i<pGroupBy->nExpr; i++){
         sqliteExprCode(pParse, pGroupBy->a[i].pExpr);
       }
-      sqliteVdbeAddOp(v, OP_MakeKey, pGroupBy->nExpr, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_MakeKey, pGroupBy->nExpr, 0);
       doFocus = 1;
     }else{
       doFocus = 0;
@@ -903,16 +914,17 @@
         }
       }
       if( doFocus ){
-        sqliteVdbeAddOp(v, OP_String, 0, 0, "", 0);
+        sqliteVdbeAddOp(v, OP_String, 0, 0);
+        sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
       }
     }
     if( doFocus ){
       int lbl1 = sqliteVdbeMakeLabel(v);
-      sqliteVdbeAddOp(v, OP_AggFocus, 0, lbl1, 0, 0);
+      sqliteVdbeAddOp(v, OP_AggFocus, 0, lbl1);
       for(i=0; i<pParse->nAgg; i++){
         if( pParse->aAgg[i].isAgg ) continue;
         sqliteExprCode(pParse, pParse->aAgg[i].pExpr);
-        sqliteVdbeAddOp(v, OP_AggSet, 0, i, 0, 0);
+        sqliteVdbeAddOp(v, OP_AggSet, 0, i);
       }
       sqliteVdbeResolveLabel(v, lbl1);
     }
@@ -922,21 +934,21 @@
       if( !pParse->aAgg[i].isAgg ) continue;
       pE = pParse->aAgg[i].pExpr;
       if( pE==0 ){
-        sqliteVdbeAddOp(v, OP_AggIncr, 1, i, 0, 0);
+        sqliteVdbeAddOp(v, OP_AggIncr, 1, i);
         continue;
       }
       assert( pE->op==TK_AGG_FUNCTION );
       assert( pE->pList!=0 && pE->pList->nExpr==1 );
       sqliteExprCode(pParse, pE->pList->a[0].pExpr);
-      sqliteVdbeAddOp(v, OP_AggGet, 0, i, 0, 0);
+      sqliteVdbeAddOp(v, OP_AggGet, 0, i);
       switch( pE->iColumn ){
         case FN_Min:  op = OP_Min;   break;
         case FN_Max:  op = OP_Max;   break;
         case FN_Avg:  op = OP_Add;   break;
         case FN_Sum:  op = OP_Add;   break;
       }
-      sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_AggSet, 0, i, 0, 0);
+      sqliteVdbeAddOp(v, op, 0, 0);
+      sqliteVdbeAddOp(v, OP_AggSet, 0, i);
     }
   }
 
@@ -951,7 +963,7 @@
   if( isAgg ){
     int endagg = sqliteVdbeMakeLabel(v);
     int startagg;
-    startagg = sqliteVdbeAddOp(v, OP_AggNext, 0, endagg, 0, 0);
+    startagg = sqliteVdbeAddOp(v, OP_AggNext, 0, endagg);
     pParse->useAgg = 1;
     if( pHaving ){
       sqliteExprIfFalse(pParse, pHaving, startagg);
@@ -960,8 +972,9 @@
                     startagg, endagg) ){
       return 1;
     }
-    sqliteVdbeAddOp(v, OP_Goto, 0, startagg, 0, 0);
-    sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, endagg);
+    sqliteVdbeAddOp(v, OP_Goto, 0, startagg);
+    sqliteVdbeResolveLabel(v, endagg);
+    sqliteVdbeAddOp(v, OP_Noop, 0, 0);
     pParse->useAgg = 0;
   }
 
diff --git a/src/update.c b/src/update.c
index db23bb6..f9f69fe 100644
--- a/src/update.c
+++ b/src/update.c
@@ -12,7 +12,7 @@
 ** This file contains C code routines that are called by the parser
 ** to handle UPDATE statements.
 **
-** $Id: update.c,v 1.17 2001/10/08 13:22:33 drh Exp $
+** $Id: update.c,v 1.18 2001/10/13 01:06:48 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -136,20 +136,20 @@
   v = sqliteGetVdbe(pParse);
   if( v==0 ) goto update_cleanup;
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Transaction, 0, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Transaction, 0, 0);
+    sqliteVdbeAddOp(v, OP_VerifyCookie, db->schema_cookie, 0);
     pParse->schemaVerified = 1;
   }
 
   /* Begin the database scan
   */
-  sqliteVdbeAddOp(v, OP_ListOpen, 0, 0, 0, 0);
+  sqliteVdbeAddOp(v, OP_ListOpen, 0, 0);
   pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 1);
   if( pWInfo==0 ) goto update_cleanup;
 
   /* Remember the index of every item to be updated.
   */
-  sqliteVdbeAddOp(v, OP_ListWrite, 0, 0, 0, 0);
+  sqliteVdbeAddOp(v, OP_ListWrite, 0, 0);
 
   /* End the database scan loop.
   */
@@ -158,12 +158,12 @@
   /* Rewind the list of records that need to be updated and
   ** open every index that needs updating.
   */
-  sqliteVdbeAddOp(v, OP_ListRewind, 0, 0, 0, 0);
+  sqliteVdbeAddOp(v, OP_ListRewind, 0, 0);
   base = pParse->nTab;
   openOp = pTab->isTemp ? OP_OpenWrAux : OP_OpenWrite;
-  sqliteVdbeAddOp(v, openOp, base, pTab->tnum, 0, 0);
+  sqliteVdbeAddOp(v, openOp, base, pTab->tnum);
   for(i=0; i<nIdx; i++){
-    sqliteVdbeAddOp(v, openOp, base+i+1, apIdx[i]->tnum, 0, 0);
+    sqliteVdbeAddOp(v, openOp, base+i+1, apIdx[i]->tnum);
   }
 
   /* Loop over every record that needs updating.  We have to load
@@ -172,20 +172,20 @@
   ** Also, the old data is needed to delete the old index entires.
   */
   end = sqliteVdbeMakeLabel(v);
-  addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end, 0, 0);
-  sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
-  sqliteVdbeAddOp(v, OP_MoveTo, base, 0, 0, 0);
+  addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end);
+  sqliteVdbeAddOp(v, OP_Dup, 0, 0);
+  sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
 
   /* Delete the old indices for the current record.
   */
   for(i=0; i<nIdx; i++){
-    sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Dup, 0, 0);
     pIdx = apIdx[i];
     for(j=0; j<pIdx->nColumn; j++){
-      sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j], 0, 0);
+      sqliteVdbeAddOp(v, OP_Column, base, pIdx->aiColumn[j]);
     }
-    sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_DeleteIdx, base+i+1, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0);
+    sqliteVdbeAddOp(v, OP_DeleteIdx, base+i+1, 0);
   }
 
   /* Compute a completely new data for this record.  
@@ -193,7 +193,7 @@
   for(i=0; i<pTab->nCol; i++){
     j = aXRef[i];
     if( j<0 ){
-      sqliteVdbeAddOp(v, OP_Column, base, i, 0, 0);
+      sqliteVdbeAddOp(v, OP_Column, base, i);
     }else{
       sqliteExprCode(pParse, pChanges->a[j].pExpr);
     }
@@ -202,27 +202,28 @@
   /* Insert new index entries that correspond to the new data
   */
   for(i=0; i<nIdx; i++){
-    sqliteVdbeAddOp(v, OP_Dup, pTab->nCol, 0, 0, 0); /* The KEY */
+    sqliteVdbeAddOp(v, OP_Dup, pTab->nCol, 0); /* The KEY */
     pIdx = apIdx[i];
     for(j=0; j<pIdx->nColumn; j++){
-      sqliteVdbeAddOp(v, OP_Dup, j+pTab->nCol-pIdx->aiColumn[j], 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Dup, j+pTab->nCol-pIdx->aiColumn[j], 0);
     }
-    sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0, 0, 0);
-    sqliteVdbeAddOp(v, OP_PutIdx, base+i+1, pIdx->isUnique, 0, 0);
+    sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0);
+    sqliteVdbeAddOp(v, OP_PutIdx, base+i+1, pIdx->isUnique);
   }
 
   /* Write the new data back into the database.
   */
-  sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0, 0, 0);
-  sqliteVdbeAddOp(v, OP_Put, base, 0, 0, 0);
+  sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0);
+  sqliteVdbeAddOp(v, OP_Put, base, 0);
 
   /* Repeat the above with the next record to be updated, until
   ** all record selected by the WHERE clause have been updated.
   */
-  sqliteVdbeAddOp(v, OP_Goto, 0, addr, 0, 0);
-  sqliteVdbeAddOp(v, OP_ListClose, 0, 0, 0, end);
+  sqliteVdbeAddOp(v, OP_Goto, 0, addr);
+  sqliteVdbeResolveLabel(v, end);
+  sqliteVdbeAddOp(v, OP_ListClose, 0, 0);
   if( (db->flags & SQLITE_InTrans)==0 ){
-    sqliteVdbeAddOp(v, OP_Commit, 0, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Commit, 0, 0);
   }
 
 update_cleanup:
diff --git a/src/vdbe.c b/src/vdbe.c
index 185e539..2cace34 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -30,7 +30,7 @@
 ** But other routines are also provided to help in building up
 ** a program instruction by instruction.
 **
-** $Id: vdbe.c,v 1.82 2001/10/09 04:19:47 drh Exp $
+** $Id: vdbe.c,v 1.83 2001/10/13 01:06:48 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -233,24 +233,20 @@
 **
 **    op              The opcode for this instruction
 **
-**    p1, p2, p3      Three operands.
+**    p1, p2          First two of the three possible operands.
 **
-**    lbl             A symbolic label for this instruction.
-**
-** Symbolic labels are negative numbers that stand for the address
-** of instructions that have yet to be coded.  When the instruction
-** is coded, its real address is substituted in the p2 field of
-** prior and subsequent instructions that have the lbl value in
-** their p2 fields.
+** Use the sqliteVdbeResolveLabel() function to fix an address and
+** the sqliteVdbeChangeP3() function to change the value of the P3
+** operand.
 */
-int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2, const char *p3, int lbl){
-  int i, j;
+int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){
+  int i;
 
   i = p->nOp;
   p->nOp++;
   if( i>=p->nOpAlloc ){
     int oldSize = p->nOpAlloc;
-    p->nOpAlloc = p->nOpAlloc*2 + 10;
+    p->nOpAlloc = p->nOpAlloc*2 + 100;
     p->aOp = sqliteRealloc(p->aOp, p->nOpAlloc*sizeof(Op));
     if( p->aOp==0 ){
       p->nOp = 0;
@@ -265,18 +261,8 @@
     p2 = p->aLabel[-1-p2];
   }
   p->aOp[i].p2 = p2;
-  if( p3 && p3[0] ){
-    p->aOp[i].p3 = sqliteStrDup(p3);
-    p->aOp[i].p3dyn = 1;
-  }else{
-    p->aOp[i].p3 = 0;
-  }
-  if( lbl<0 && (-lbl)<=p->nLabel ){
-    p->aLabel[-1-lbl] = i;
-    for(j=0; j<i; j++){
-      if( p->aOp[j].p2==lbl ) p->aOp[j].p2 = i;
-    }
-  }
+  p->aOp[i].p3 = 0;
+  p->aOp[i].p3type = P3_NOTUSED;
   return i;
 }
 
@@ -323,9 +309,11 @@
     int i;
     for(i=0; i<nOp; i++){
       int p2 = aOp[i].p2;
-      if( p2<0 ) p2 = addr + ADDR(p2);
-      sqliteVdbeAddOp(p, aOp[i].opcode, aOp[i].p1, p2, aOp[i].p3, 0);
+      p->aOp[i+addr] = aOp[i];
+      if( p2<0 ) p->aOp[i+addr].p2 = addr + ADDR(p2);
+      p->aOp[i+addr].p3type = aOp[i].p3 ? P3_STATIC : P3_NOTUSED;
     }
+    p->nOp += nOp;
   }
   return addr;
 }
@@ -353,22 +341,33 @@
 ** A value of n==0 means copy bytes of zP3 up to and including the
 ** first null byte.  If n>0 then copy n+1 bytes of zP3.
 **
-** If n<0 then zP3 is assumed to be a pointer to a static string.
-** P3 is made to point directly to this string without any copying.
+** If n==P3_STATIC  it means that zP3 is a pointer to a constant static
+** string we can just copy the pointer.  n==P3_POINTER means zP3 is
+** a pointer to some object other than a string.
+**
+** If addr<0 then change P3 on the most recently inserted instruction.
 */
 void sqliteVdbeChangeP3(Vdbe *p, int addr, char *zP3, int n){
-  if( p && addr>=0 && p->nOp>addr && zP3 ){
-    Op *pOp = &p->aOp[addr];
-    if( pOp->p3 && pOp->p3dyn ){
-      sqliteFree(pOp->p3);
-    }
-    if( n<0 ){
-      pOp->p3 = zP3;
-      pOp->p3dyn = 0;
-    }else{
-      sqliteSetNString(&p->aOp[addr].p3, zP3, n, 0);
-      pOp->p3dyn = 1;
-    }
+  Op *pOp;
+  if( p==0 ) return;
+  if( addr<0 || addr>=p->nOp ){
+    addr = p->nOp - 1;
+    if( addr<0 ) return;
+  }
+  pOp = &p->aOp[addr];
+  if( pOp->p3 && pOp->p3type==P3_DYNAMIC ){
+    sqliteFree(pOp->p3);
+    pOp->p3 = 0;
+  }
+  if( zP3==0 ){
+    pOp->p3 = 0;
+    pOp->p3type = P3_NOTUSED;
+  }else if( n<0 ){
+    pOp->p3 = zP3;
+    pOp->p3type = n;
+  }else{
+    sqliteSetNString(&pOp->p3, zP3, n, 0);
+    pOp->p3type = P3_DYNAMIC;
   }
 }
 
@@ -386,11 +385,12 @@
   if( addr<0 || addr>=p->nOp ) return;
   pOp = &p->aOp[addr];
   if( pOp->p3==0 || pOp->p3[0]==0 ) return;
-  if( !pOp->p3dyn ){
+  if( pOp->p3type==P3_POINTER ) return;
+  if( pOp->p3type!=P3_DYNAMIC ){
     pOp->p3 = sqliteStrDup(pOp->p3);
-    pOp->p3dyn = 1;
+    pOp->p3type = P3_DYNAMIC;
   }
-  if( pOp->p3 ) sqliteDequote(pOp->p3);
+  sqliteDequote(pOp->p3);
 }
 
 /*
@@ -404,9 +404,11 @@
   Op *pOp;
   if( addr<0 || addr>=p->nOp ) return;
   pOp = &p->aOp[addr];
-  if( !pOp->p3dyn ){
+  if( pOp->p3type!=P3_DYNAMIC ){
     pOp->p3 = sqliteStrDup(pOp->p3);
-    pOp->p3dyn = 1;
+    pOp->p3type = P3_DYNAMIC;
+  }else if( pOp->p3type!=P3_STATIC ){
+    return;
   }
   z = pOp->p3;
   if( z==0 ) return;
@@ -770,7 +772,7 @@
     p->nOp = 0;
   }
   for(i=0; i<p->nOp; i++){
-    if( p->aOp[i].p3dyn ){
+    if( p->aOp[i].p3type==P3_DYNAMIC ){
       sqliteFree(p->aOp[i].p3);
     }
   }
@@ -873,7 +875,7 @@
     sprintf(zAddr,"%d",i);
     sprintf(zP1,"%d", p->aOp[i].p1);
     sprintf(zP2,"%d", p->aOp[i].p2);
-    azValue[4] = p->aOp[i].p3;
+    azValue[4] = p->aOp[i].p3type!=P3_POINTER ? p->aOp[i].p3 : "";
     azValue[1] = zOpName[p->aOp[i].opcode];
     if( xCallback(pArg, 5, azValue, azColumnNames) ){
       rc = SQLITE_ABORT;
@@ -2871,7 +2873,7 @@
   int i = ++p->tos;
   int pgno;
   VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
-  assert( pOp->p3!=0 && pOp->p3dyn==0 );
+  assert( pOp->p3!=0 && pOp->p3type==P3_POINTER );
   rc = sqliteBtreeCreateTable(pOp->p2 ? db->pBeTemp : pBt, &pgno);
   if( rc==SQLITE_OK ){
     aStack[i].i = pgno;
diff --git a/src/vdbe.h b/src/vdbe.h
index b70c5c6..69a1eaa 100644
--- a/src/vdbe.h
+++ b/src/vdbe.h
@@ -15,7 +15,7 @@
 ** or VDBE.  The VDBE implements an abstract machine that runs a
 ** simple program to access and modify the underlying database.
 **
-** $Id: vdbe.h,v 1.27 2001/10/12 17:30:05 drh Exp $
+** $Id: vdbe.h,v 1.28 2001/10/13 01:06:49 drh Exp $
 */
 #ifndef _SQLITE_VDBE_H_
 #define _SQLITE_VDBE_H_
@@ -38,11 +38,19 @@
   int p1;             /* First operand */
   int p2;             /* Second parameter (often the jump destination) */
   char *p3;           /* Third parameter */
-  int p3dyn;          /* True if p3 is malloced.  False if it is static */
+  int p3type;         /* P3_STATIC, P3_DYNAMIC or P3_POINTER */
 };
 typedef struct VdbeOp VdbeOp;
 
 /*
+** Allowed values of VdbeOp.p3type
+*/
+#define P3_NOTUSED    0   /* The P3 parameter is not used */
+#define P3_DYNAMIC    1   /* Pointer to a string obtained from sqliteMalloc() */
+#define P3_STATIC   (-1)  /* Pointer to a static string */
+#define P3_POINTER  (-2)  /* P3 is a pointer to some structure or object */
+
+/*
 ** The following macro converts a relative address in the p2 field
 ** of a VdbeOp structure into a negative number so that 
 ** sqliteVdbeAddOpList() knows that the address is relative.  Calling
@@ -199,7 +207,7 @@
 */
 Vdbe *sqliteVdbeCreate(sqlite*);
 void sqliteVdbeCreateCallback(Vdbe*, int*);
-int sqliteVdbeAddOp(Vdbe*,int,int,int,const char*,int);
+int sqliteVdbeAddOp(Vdbe*,int,int,int);
 int sqliteVdbeAddOpList(Vdbe*, int nOp, VdbeOp const *aOp);
 void sqliteVdbeChangeP1(Vdbe*, int addr, int P1);
 void sqliteVdbeChangeP3(Vdbe*, int addr, char *zP1, int N);
diff --git a/src/where.c b/src/where.c
index 971e20a..b63bc05 100644
--- a/src/where.c
+++ b/src/where.c
@@ -13,7 +13,7 @@
 ** the WHERE clause of SQL statements.  Also found here are subroutines
 ** to generate VDBE code to evaluate expressions.
 **
-** $Id: where.c,v 1.22 2001/10/08 13:22:33 drh Exp $
+** $Id: where.c,v 1.23 2001/10/13 01:06:49 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -290,15 +290,16 @@
 
     pTab = pTabList->a[i].pTab;
     openOp = pTab->isTemp ? OP_OpenAux : OP_Open;
-    sqliteVdbeAddOp(v, openOp, base+i, pTab->tnum, pTab->zName, 0);
+    sqliteVdbeAddOp(v, openOp, base+i, pTab->tnum);
+    sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC);
     if( i==0 && !pParse->schemaVerified &&
           (pParse->db->flags & SQLITE_InTrans)==0 ){
-      sqliteVdbeAddOp(v, OP_VerifyCookie, pParse->db->schema_cookie, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_VerifyCookie, pParse->db->schema_cookie, 0);
       pParse->schemaVerified = 1;
     }
     if( i<ARRAYSIZE(aIdx) && aIdx[i]!=0 ){
-      sqliteVdbeAddOp(v, openOp, base+pTabList->nId+i, aIdx[i]->tnum,
-          aIdx[i]->zName, 0);
+      sqliteVdbeAddOp(v, openOp, base+pTabList->nId+i, aIdx[i]->tnum);
+      sqliteVdbeChangeP3(v, -1, aIdx[i]->zName, P3_STATIC);
     }
   }
   memcpy(pWInfo->aIdx, aIdx, sizeof(aIdx));
@@ -344,20 +345,21 @@
           break;
         }
       }
-      sqliteVdbeAddOp(v, OP_AddImm, 0, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_AddImm, 0, 0);
       if( i==pTabList->nId-1 && pushKey ){
         haveKey = 1;
       }else{
-        sqliteVdbeAddOp(v, OP_NotFound, base+idx, brk, 0, 0);
+        sqliteVdbeAddOp(v, OP_NotFound, base+idx, brk);
         haveKey = 0;
       }
     }else if( pIdx==0 ){
       /* Case 2:  There was no usable index.  We must do a complete
       ** scan of the table.
       */
-      sqliteVdbeAddOp(v, OP_Rewind, base+idx, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Rewind, base+idx, 0);
       cont = sqliteVdbeMakeLabel(v);
-      sqliteVdbeAddOp(v, OP_Next, base+idx, brk, 0, cont);
+      sqliteVdbeResolveLabel(v, cont);
+      sqliteVdbeAddOp(v, OP_Next, base+idx, brk);
       haveKey = 0;
     }else{
       /* Case 3:  We do have a usable index in pIdx.
@@ -384,13 +386,14 @@
           }
         }
       }
-      sqliteVdbeAddOp(v, OP_MakeKey, pIdx->nColumn, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_BeginIdx, base+pTabList->nId+i, 0, 0, 0);
-      sqliteVdbeAddOp(v, OP_NextIdx, base+pTabList->nId+i, brk, 0, cont);
+      sqliteVdbeAddOp(v, OP_MakeKey, pIdx->nColumn, 0);
+      sqliteVdbeAddOp(v, OP_BeginIdx, base+pTabList->nId+i, 0);
+      sqliteVdbeResolveLabel(v, cont);
+      sqliteVdbeAddOp(v, OP_NextIdx, base+pTabList->nId+i, brk);
       if( i==pTabList->nId-1 && pushKey ){
         haveKey = 1;
       }else{
-        sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0);
         haveKey = 0;
       }
     }
@@ -405,7 +408,7 @@
       if( (aExpr[j].prereqLeft & loopMask)!=aExpr[j].prereqLeft ) continue;
       if( haveKey ){
         haveKey = 0;
-        sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0, 0, 0);
+        sqliteVdbeAddOp(v, OP_MoveTo, base+idx, 0);
       }
       sqliteExprIfFalse(pParse, aExpr[j].p, cont);
       aExpr[j].p = 0;
@@ -414,7 +417,7 @@
   }
   pWInfo->iContinue = cont;
   if( pushKey && !haveKey ){
-    sqliteVdbeAddOp(v, OP_Recno, base, 0, 0, 0);
+    sqliteVdbeAddOp(v, OP_Recno, base, 0);
   }
   sqliteFree(aOrder);
   return pWInfo;
@@ -429,16 +432,18 @@
   int brk = pWInfo->iBreak;
   int base = pWInfo->base;
 
-  sqliteVdbeAddOp(v, OP_Goto, 0, pWInfo->iContinue, 0, 0);
+  sqliteVdbeAddOp(v, OP_Goto, 0, pWInfo->iContinue);
   for(i=0; i<pWInfo->pTabList->nId; i++){
-    sqliteVdbeAddOp(v, OP_Close, base+i, 0, 0, brk);
+    sqliteVdbeResolveLabel(v, brk);
+    sqliteVdbeAddOp(v, OP_Close, base+i, 0);
     brk = 0;
     if( i<ARRAYSIZE(pWInfo->aIdx) && pWInfo->aIdx[i]!=0 ){
-      sqliteVdbeAddOp(v, OP_Close, base+pWInfo->pTabList->nId+i, 0, 0, 0);
+      sqliteVdbeAddOp(v, OP_Close, base+pWInfo->pTabList->nId+i, 0);
     }
   }
   if( brk!=0 ){
-    sqliteVdbeAddOp(v, OP_Noop, 0, 0, 0, brk);
+    sqliteVdbeResolveLabel(v, brk);
+    sqliteVdbeAddOp(v, OP_Noop, 0, 0);
   }
   sqliteFree(pWInfo);
   return;