]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a bug reported on the mailing list triggered by the pattern "SELECT <col>, (SELEC...
authordanielk1977 <danielk1977@noemail.net>
Mon, 3 Nov 2008 09:06:05 +0000 (09:06 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Mon, 3 Nov 2008 09:06:05 +0000 (09:06 +0000)
FossilOrigin-Name: 6c918c4eb9362ebfdbe0486515679102b2862970

manifest
manifest.uuid
src/where.c
test/where.test

index 99ab695234a20b6b9fc89de2355f161595f586b9..881ed3d9de8c2d23a0015ec5418743f3a35aff45 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Test\sthat\ssingle\sbyte\scorruptions\sin\sincreasingly\slarger\squantities\sare\shandled\sgracefully.\s(CVS\s5854)
-D 2008-10-31T13:57:40
+C Fix\sa\sbug\sreported\son\sthe\smailing\slist\striggered\sby\sthe\spattern\s"SELECT\s<col>,\s(SELECT\s...\sFROM\stbl\sWHERE\srowid\s>\s<col>)\sFROM\s...".\s(CVS\s5855)
+D 2008-11-03T09:06:06
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in da817da72422f9b876602c225fcd17d6ca4182f7
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -200,7 +200,7 @@ F src/vdbefifo.c 20fda2a7c4c0bcee1b90eb7e545fefcdbf2e1de7
 F src/vdbemem.c c0e9d9947db8968762c7621369f821bb181c1c86
 F src/vtab.c 527c180e9c5fca417c9167d02af4b5039f892b4b
 F src/walker.c 488c2660e13224ff70c0c82761118efb547f8f0d
-F src/where.c 1853c1bfb567a415d904d70a4613dc07b00c74c5
+F src/where.c 171c9b2583944f66484c8552daa85373ce9e949f
 F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/alias.test 597662c5d777a122f9a3df0047ea5c5bd383a911
@@ -617,7 +617,7 @@ F test/vtabC.test 9f2d9eb84bf65e606d6616f20977c5a32a11f548
 F test/vtab_alter.test 3a299749fee97ca3d53bd55717f536e4a2284856
 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
 F test/vtab_shared.test c19b2555b807ef2ee014c882cdda5bc8d84fcf48
-F test/where.test 12396f15d8bf7a5763aa26129e071cdb441f600c
+F test/where.test de337a3fe0a459ec7c93db16a519657a90552330
 F test/where2.test e446f55417f434929522d87164cd1473d54f10e2
 F test/where3.test 97d3936e6a443b968f1a61cdcc0f673252000e94
 F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2
@@ -653,7 +653,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P bfce91429b1dad6e0ca36929e41a7adfb30f8522
-R 7e7399b4dd0e7285795a33efa071b32a
-U shane
-Z 036cf1ab4484f24cac77efa2333c4427
+P c73d915923e393f72e1c0897526a20527db2e03c
+R 81b77b0f0b421033be987682a8d0b4be
+U danielk1977
+Z 86fef2c70c68267aff5116fbaf03ae0a
index 9e5831302042db132bc69459ade6d47eb90a9c6b..7687b4fe5e4e0a701e1cc04060462849628479aa 100644 (file)
@@ -1 +1 @@
-c73d915923e393f72e1c0897526a20527db2e03c
\ No newline at end of file
+6c918c4eb9362ebfdbe0486515679102b2862970
\ No newline at end of file
index d5f8dabd24050eac58441896e12e8b86af2a8373..a7e393905d9ad38773e17ea89a1899ee3cbfe733 100644 (file)
@@ -16,7 +16,7 @@
 ** so is applicable.  Because this module is responsible for selecting
 ** indices, you might also think of this module as the "query optimizer".
 **
-** $Id: where.c,v 1.327 2008/10/25 15:03:21 drh Exp $
+** $Id: where.c,v 1.328 2008/11/03 09:06:06 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 
@@ -2472,16 +2472,26 @@ WhereInfo *sqlite3WhereBegin(
       }
       if( pStart ){
         Expr *pX;
-        int r1, regFree1;
+        int r1;
         pX = pStart->pExpr;
         assert( pX!=0 );
         assert( pStart->leftCursor==iCur );
-        r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &regFree1);
+
+        /* The ForceInt instruction may modify the register that it operates
+        ** on. For example it may replace a real value with an integer one,
+        ** or if p3 is true it may increment the register value. For this
+        ** reason we need to make sure that register r1 is really a newly
+        ** allocated temporary register, and not part of the column-cache.
+        ** For this reason we cannot use sqlite3ExprCodeTemp() here.
+        */
+        r1 = sqlite3GetTempReg(pParse);
+        sqlite3ExprCode(pParse, pX->pRight, r1);
+
         sqlite3VdbeAddOp3(v, OP_ForceInt, r1, brk, 
                              pX->op==TK_LE || pX->op==TK_GT);
         sqlite3VdbeAddOp3(v, bRev ? OP_MoveLt : OP_MoveGe, iCur, brk, r1);
         VdbeComment((v, "pk"));
-        sqlite3ReleaseTempReg(pParse, regFree1);
+        sqlite3ReleaseTempReg(pParse, r1);
         disableTerm(pLevel, pStart);
       }else{
         sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, brk);
index 4437ff0a65a4d76debe7ce74b98e5cd2a73c8944..9145bcc7535ef6882f5ab60fbc40f096f1a6236a 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing the use of indices in WHERE clases.
 #
-# $Id: where.test,v 1.49 2008/10/07 23:46:38 drh Exp $
+# $Id: where.test,v 1.50 2008/11/03 09:06:06 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -1215,4 +1215,46 @@ do_test where-16.4 {
 
 integrity_check {where-99.0}
 
+#---------------------------------------------------------------------
+# These tests test that a bug surrounding the use of ForceInt has been
+# fixed in where.c.
+#
+do_test where-17.1 {
+  execsql {
+    CREATE TABLE tbooking (
+      id INTEGER PRIMARY KEY,
+      eventtype INTEGER NOT NULL
+    );
+    INSERT INTO tbooking VALUES(42, 3);
+    INSERT INTO tbooking VALUES(43, 4);
+  }
+} {}
+do_test where-17.2 {
+  execsql {
+    SELECT a.id
+    FROM tbooking AS a
+    WHERE a.eventtype=3;
+  }
+} {42}
+do_test where-17.3 {
+  execsql {
+    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
+    FROM tbooking AS a
+    WHERE a.eventtype=3;
+  }
+} {42 43}
+do_test where-17.4 {
+  execsql {
+    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
+    FROM (SELECT 1.5 AS id) AS a
+  }
+} {1.5 42}
+do_test where-17.5 {
+  execsql {
+    CREATE TABLE tother(a, b);
+    INSERT INTO tother VALUES(1, 3.7);
+    SELECT id, a FROM tbooking, tother WHERE id>a;
+  }
+} {42 1 43 1}
+
 finish_test