]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Tweaks to the IN expression code generator. Fix an an unrelated bug
authordrh <drh@noemail.net>
Fri, 27 Jun 2008 00:47:28 +0000 (00:47 +0000)
committerdrh <drh@noemail.net>
Fri, 27 Jun 2008 00:47:28 +0000 (00:47 +0000)
in the compound SELECT code generator. (CVS 5318)

FossilOrigin-Name: a4005782690f022e982df4873779a029b28b9306

manifest
manifest.uuid
src/expr.c
src/select.c

index 07632088b7c66b6449f20c1408b03d3b764003e7..2271c7001f200a34c4fc4c293ccbde4fe0f3df90 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbug\sintroduced\sby\scheck-in\s(5316).\s\sAdd\ssome\sVDBE\scomments\sto\nthe\sIN\sexpression\scode\sgenerator.\s(CVS\s5317)
-D 2008-06-26T21:45:26
+C Tweaks\sto\sthe\sIN\sexpression\scode\sgenerator.\s\sFix\san\san\sunrelated\sbug\nin\sthe\scompound\sSELECT\scode\sgenerator.\s(CVS\s5318)
+D 2008-06-27T00:47:29
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 325dfac0a0dd1cb4d975f1ace6453157892e6042
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -103,7 +103,7 @@ F src/callback.c 3ba98ae46f60aa7c2c40eac7d18fe5ba9b706b83
 F src/complete.c cb14e06dbe79dee031031f0d9e686ff306afe07c
 F src/date.c e841168e5520bbbb2a1cbcdce7531d8b23017b4d
 F src/delete.c d3fc5987f2eb88f7b9549d58a5dfea079a83fe8b
-F src/expr.c 3bb6d63230df920c46a6790c6f0e204b00973fb7
+F src/expr.c f166ce09a2468695b429b4e27e2a82558267374a
 F src/fault.c 3638519d1e0b82bccfafcb9f5ff491918b28f8e1
 F src/func.c 1e7d9569570134ac0771a00382d9d4b41c4aa052
 F src/global.c 2304cfa3288763bd2fed10caf8c6fbaa2b383f4e
@@ -140,7 +140,7 @@ F src/pragma.c 9a95f5b3708f6d3ddd987eab5f369a19ffcb6795
 F src/prepare.c aba51dad52308e3d9d2074d8ff4e612e7f1cab51
 F src/printf.c 8b063da9dcde26b7c500a01444b718d86f21bc6e
 F src/random.c 5c754319d38abdd6acd74601ee0105504adc508a
-F src/select.c e27de53be426254e1b75690c9c99482bb1431b79
+F src/select.c c4f8aa2a9e8f67341b00564e3376017c5de8c26b
 F src/shell.c 479807b87f0409289eec4a776cd6ae56d30544b1
 F src/sqlite.h.in bcdf4f68ce70ca30f0c3d351858383ce398e3c66
 F src/sqlite3ext.h f162a72daef5ebf8b211fe8c0ec96e85d22fbf9b
@@ -594,7 +594,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P ec80474b1c157a29fb6978dd5575c396c57973b3
-R 2776a8777b2027a36d141711118a9d4a
+P 1043a605e2dcad4b5222674efe392ee9915dc57d
+R 282907968b33788026ea00a12d860ba1
 U drh
-Z 08c80bc1275e333a7b4bb518d0147ebb
+Z fc31e53c5f5925543c80485c128b7811
index 32767f8ee432f2aeed3ec71cffded235ecf77f46..d42a72afa91db09d4fb3e43c8b32e9f8762b4180 100644 (file)
@@ -1 +1 @@
-1043a605e2dcad4b5222674efe392ee9915dc57d
\ No newline at end of file
+a4005782690f022e982df4873779a029b28b9306
\ No newline at end of file
index cb78adabd06ed96fa7edc3a5591618e88781b5d3..492832fe6cd7ac1c22725b5e7e5f6cc656cf6ca3 100644 (file)
@@ -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.379 2008/06/26 21:45:26 drh Exp $
+** $Id: expr.c,v 1.380 2008/06/27 00:47:29 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -2594,20 +2594,18 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
       */
       affinity = comparisonAffinity(pExpr);
 
-      sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
 
       /* Code the <expr> from "<expr> IN (...)". The temporary table
       ** pExpr->iTable contains the values that make up the (...) set.
       */
-      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
-      testcase( regFree1==0 );
-      j1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1);
-      sqlite3VdbeAddOp2(v, OP_Null, 0, target);
-      j2  = sqlite3VdbeAddOp0(v, OP_Goto);
-      sqlite3VdbeJumpHere(v, j1);
+      pParse->disableColCache++;
+      sqlite3ExprCode(pParse, pExpr->pLeft, target);
+      pParse->disableColCache--;
+      j2 = sqlite3VdbeAddOp1(v, OP_IsNull, target);
       if( eType==IN_INDEX_ROWID ){
-        j3 = sqlite3VdbeAddOp1(v, OP_MustBeInt, r1);
-        j4 = sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, 0, r1);
+        j3 = sqlite3VdbeAddOp1(v, OP_MustBeInt, target);
+        j4 = sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, 0, target);
+        sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
         j5 = sqlite3VdbeAddOp0(v, OP_Goto);
         sqlite3VdbeJumpHere(v, j3);
         sqlite3VdbeJumpHere(v, j4);
@@ -2619,8 +2617,8 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
         ** the value, then jump to the end of the test code. The target
         ** register still contains the true (1) value written to it earlier.
         */
-        sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1);
-        sqlite3ExprCacheAffinityChange(pParse, r1, 1);
+        sqlite3VdbeAddOp4(v, OP_MakeRecord, target, 1, r2, &affinity, 1);
+        sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
         j5 = sqlite3VdbeAddOp3(v, OP_Found, pExpr->iTable, 0, r2);
 
         /* If the set membership test fails, then the result of the 
@@ -2644,11 +2642,12 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
           ** other than NULL, then the test has already been run and 
           ** rNotFound is already populated.
           */
+          static const char nullRecord[] = { 0x02, 0x00 };
           j3 = sqlite3VdbeAddOp1(v, OP_NotNull, rMayHaveNull);
           sqlite3VdbeAddOp2(v, OP_Null, 0, rNotFound);
-          sqlite3VdbeAddOp2(v, OP_Integer, 1, rMayHaveNull);
-          sqlite3VdbeAddOp4(v, OP_MakeRecord, rNotFound, 1, r2, 0, 1);
-          j4 = sqlite3VdbeAddOp3(v, OP_Found, pExpr->iTable, 0, r2);
+          sqlite3VdbeAddOp4(v, OP_Blob, 2, rMayHaveNull, 0, 
+                             nullRecord, P4_STATIC);
+          j4 = sqlite3VdbeAddOp3(v, OP_Found, pExpr->iTable, 0, rMayHaveNull);
           sqlite3VdbeAddOp2(v, OP_Integer, 0, rNotFound);
           sqlite3VdbeJumpHere(v, j4);
           sqlite3VdbeJumpHere(v, j3);
index 0f937226ef89a9c1ac4b49120e1b8de7565f3fe1..7f5be11779475241d8c1f05b3977bdae2aec0fd1 100644 (file)
@@ -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.437 2008/06/26 18:04:03 danielk1977 Exp $
+** $Id: select.c,v 1.438 2008/06/27 00:47:29 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -2340,7 +2340,7 @@ static int generateOutputSubroutine(
   Vdbe *v = pParse->pVdbe;
   int iContinue;
   int addr;
-  if( v==0 ) return 0;
+  if( pParse->db->mallocFailed ) return 0;
 
   addr = sqlite3VdbeCurrentAddr(v);
   iContinue = sqlite3VdbeMakeLabel(v);