]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Omit OP_Close operations that occur immediately prior to OP_Halt and which
authordrh <drh@noemail.net>
Sat, 4 Jan 2014 16:49:02 +0000 (16:49 +0000)
committerdrh <drh@noemail.net>
Sat, 4 Jan 2014 16:49:02 +0000 (16:49 +0000)
cannot be jumped over.

FossilOrigin-Name: 874b7e9999811c288ad41d07709f88e458d2d497

manifest
manifest.uuid
src/build.c
src/delete.c
src/sqliteInt.h
src/vdbe.h
src/vdbeaux.c

index 6bd605599ff875e505a211357517b73ea2881cca..6426172ac44e3560465d3d3ba1f426c34303fd47 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improvements\sto\sthe\scolumn-cache\sfor\snested\sAND/OR\soperators.
-D 2014-01-04T15:17:04.888
+C Omit\sOP_Close\soperations\sthat\soccur\simmediately\sprior\sto\sOP_Halt\sand\swhich\ncannot\sbe\sjumped\sover.
+D 2014-01-04T16:49:02.617
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -169,12 +169,12 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
 F src/btree.c 11e29ef8cf16a42925fde036bcffbeffd9cc82df
 F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9
 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0
-F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda
+F src/build.c 5597ffa6d60759f89da3dd8a326c291a75e83c23
 F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98
 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
 F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd
 F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
-F src/delete.c 22f3dc3fd6b82ebce3dabf951a4b157026943ac1
+F src/delete.c f7c47fbbcbddf83c4af5df3681aa05a741a8d536
 F src/expr.c 15a86b7632da09924ccffb53fafa86e7d8727b70
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5
@@ -224,7 +224,7 @@ F src/shell.c a3541193d5fce37e91dad8ef46a9505aa7c9b344
 F src/sqlite.h.in d94a8b89522f526ba711182ee161e06f8669bcc9
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
-F src/sqliteInt.h a77cb6c7404d1a20e536211be4a2e4be01cde213
+F src/sqliteInt.h 40fa66cb72bc88bcd0a16967f4ad58cff7e2c4fd
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -281,10 +281,10 @@ F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
 F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c
 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
 F src/vdbe.c b110887e415b5d2af58c2374c4dfdcf774c5d46c
-F src/vdbe.h 298e0492827ef9db626934d060df62ed27ba56bc
+F src/vdbe.h e6c4c610fcabad4fa80ebb1efc6822a9367e2b26
 F src/vdbeInt.h 42db251e9f863401ff847b90d5fe1614c89a6a56
 F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad
-F src/vdbeaux.c 915fda7ca876aa2df2a13b0621ad0326342c0638
+F src/vdbeaux.c 9f4bfc52672acbb0bb4493d6a03603dc5a595ac1
 F src/vdbeblob.c bc40f98f256f0b34116d6a44b114da4a81a15d33
 F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2
 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147
@@ -1148,7 +1148,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P fa8be488a3ad290722dae7a1a7396c77277b2149
-R 7b52b4a00e9a7616715e494e48bd3657
+P 4e725f53131d3584319c710c8710a068989543c6
+R 9d927180209ef7717259744d3fe6bde8
 U drh
-Z 701e96c9216858714def7e53249e15db
+Z 5260028c0eafa272f25baa07be63a049
index b3d3207e4a83f1857dfa08a8f2d69e5216cd31e6..eb18276f5b4eb441e2bc7f2bbd5527282c088ccd 100644 (file)
@@ -1 +1 @@
-4e725f53131d3584319c710c8710a068989543c6
\ No newline at end of file
+874b7e9999811c288ad41d07709f88e458d2d497
\ No newline at end of file
index c83ce57cfab14a3570b171bc662084121cde03da..5c8c9300f6cd993dc8130c5d470ec3837b588c9f 100644 (file)
@@ -140,6 +140,7 @@ void sqlite3FinishCoding(Parse *pParse){
   assert( !pParse->isMultiWrite 
        || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort));
   if( v ){
+    while( sqlite3VdbeDeletePriorOpcode(v, OP_Close) ){}
     sqlite3VdbeAddOp0(v, OP_Halt);
 
     /* The cookie mask contains one bit for each database file open.
index 0180ec48c8cbc5098347003b58540711811d7e9a..641b4a763f818a60cb52de776a7959570d7565b3 100644 (file)
@@ -790,9 +790,7 @@ int sqlite3GenerateIndexKey(
     ** But we are getting ready to store this value back into an index, where
     ** it should be converted by to INTEGER again.  So omit the OP_RealAffinity
     ** opcode if it is present */
-    if( sqlite3VdbeGetOp(v, -1)->opcode==OP_RealAffinity ){
-      sqlite3VdbeDeleteLastOpcode(v);
-    }
+    sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity);
   }
   if( regOut ){
     sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut);
index 5943ced2a0f55a63202a4ab06ec02558ec6f861a..035e590bfeacc8c388c3c49c2287a5b8ff1a37cb 100644 (file)
@@ -2293,6 +2293,7 @@ struct Parse {
   int nOpAlloc;        /* Number of slots allocated for Vdbe.aOp[] */
   int nLabel;          /* Number of labels used */
   int *aLabel;         /* Space to hold the labels */
+  int iFixedOp;        /* Never back out opcodes iFixedOp-1 or earlier */
   int ckBase;          /* Base register of data during check constraints */
   int iPartIdxTab;     /* Table corresponding to a partial index */
   int iCacheLevel;     /* ColCache valid when aColCache[].iLevel<=iCacheLevel */
index 46bc89cee87caccc720d829c957d0f3362812423..620f2eaf7267446e981708c5cec32ada99707f07 100644 (file)
@@ -175,7 +175,7 @@ void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3);
 void sqlite3VdbeChangeP5(Vdbe*, u8 P5);
 void sqlite3VdbeJumpHere(Vdbe*, int addr);
 void sqlite3VdbeChangeToNoop(Vdbe*, int addr);
-void sqlite3VdbeDeleteLastOpcode(Vdbe*);
+int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op);
 void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N);
 void sqlite3VdbeSetP4KeyInfo(Parse*, Index*);
 void sqlite3VdbeUsesBtree(Vdbe*, int);
index e0b3c5485f8f0b6787979056c04f790dd9d25bb6..faabaf75d7b17d4aff5ba5cb7d956f8cb80e4aa1 100644 (file)
@@ -276,6 +276,7 @@ void sqlite3VdbeResolveLabel(Vdbe *v, int x){
   if( j>=0 && p->aLabel ){
     p->aLabel[j] = v->nOp;
   }
+  p->iFixedOp = v->nOp - 1;
 }
 
 /*
@@ -624,7 +625,8 @@ void sqlite3VdbeChangeP5(Vdbe *p, u8 val){
 ** the address of the next instruction to be coded.
 */
 void sqlite3VdbeJumpHere(Vdbe *p, int addr){
-  if( ALWAYS(addr>=0) ) sqlite3VdbeChangeP2(p, addr, p->nOp);
+  sqlite3VdbeChangeP2(p, addr, p->nOp);
+  p->pParse->iFixedOp = p->nOp - 1;
 }
 
 
@@ -729,8 +731,13 @@ void sqlite3VdbeChangeToNoop(Vdbe *p, int addr){
 /*
 ** Remove the last opcode inserted
 */
-void sqlite3VdbeDeleteLastOpcode(Vdbe *p){
-  p->nOp--;
+int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){
+  if( (p->nOp-1)>(p->pParse->iFixedOp) && p->aOp[p->nOp-1].opcode==op ){
+    sqlite3VdbeChangeToNoop(p, p->nOp-1);
+    return 1;
+  }else{
+    return 0;
+  }
 }
 
 /*