]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Modify the OR-clause handling so that it can safely deal with OR-clause
authordrh <drh@noemail.net>
Thu, 10 Apr 2014 02:24:48 +0000 (02:24 +0000)
committerdrh <drh@noemail.net>
Thu, 10 Apr 2014 02:24:48 +0000 (02:24 +0000)
with 17 or more terms.  Fix for ticket [10fb063b1179be53ea0b53bb].

FossilOrigin-Name: a67b5312f63909737c052fe58ab5772d45530d49

manifest
manifest.uuid
src/rowset.c
src/sqliteInt.h
src/vdbe.c
test/whereD.test

index 51582695c0c6efbc3adc309035c09165716e9f9f..0b43c2f6e587cad8c12a40128ea2207322ed2064 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Performance\simprovements\swhen\sreading\slarge\sblobs,\sespecially\sif\nSQLITE_DIRECT_OVERFLOW_READ\sis\sdefined.
-D 2014-04-04T18:49:19.417
+C Modify\sthe\sOR-clause\shandling\sso\sthat\sit\scan\ssafely\sdeal\swith\sOR-clause\s\nwith\s17\sor\smore\sterms.\s\sFix\sfor\sticket\s[10fb063b1179be53ea0b53bb].
+D 2014-04-10T02:24:48.549
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -216,13 +216,13 @@ F src/prepare.c 677521ab7132615a8a26107a1d1c3132f44ae337
 F src/printf.c e5a0005f8b3de21f85da6a709d2fbee76775bf4b
 F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece
 F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66
-F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
+F src/rowset.c a9c9aae3234b44a6d7c6f5a3cadf90dce1e627be
 F src/select.c 269c3e31a450fce642a10569221a49180348c88e
 F src/shell.c 5260f2ada8dd06e9f5ae0a448c8c01e7a75dd881
 F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
-F src/sqliteInt.h cc9582a91b2910404ccda7b7e198815ea0f75948
+F src/sqliteInt.h 9b1361478e821b1a68f7993047a922e3155ca87d
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -278,7 +278,7 @@ F src/update.c 5b3e74a03b3811e586b4f2b4cbd7c49f01c93115
 F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c
 F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf
 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
-F src/vdbe.c e811a0081149fb90db367026d154cd7efb3c7098
+F src/vdbe.c bf284edea1cee0508dc93c79a73498e0f317edb7
 F src/vdbe.h 394464909ed682334aa3d5831aae0c2fe2abef94
 F src/vdbeInt.h e6d83e5bfd62fc6685ba1ed6153f7099f82de9f7
 F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4
@@ -1089,7 +1089,7 @@ F test/where9.test 4f3eab951353a3ae164befc521c777dfa903e46c
 F test/whereA.test 4d253178d135ec46d1671e440cd8f2b916aa6e6b
 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
 F test/whereC.test d6f4ecd4fa2d9429681a5b22a25d2bda8e86ab8a
-F test/whereD.test 6c2feb79ef1f68381b07f39017fe5f9b96da8d62
+F test/whereD.test fd9120e262f9da3c45940f52aefeef4d15b904e5
 F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f
 F test/whereF.test 5b2ba0dbe8074aa13e416b37c753991f0a2492d7
 F test/whereG.test 2533b72ed4a31fd1687230a499b557b911525344
@@ -1160,8 +1160,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P 683dd379a293b2f330e1e4cd746f190527fe48ee 834bf1c367e1ccd498c7f9f843be2d2aa11ffb3c
-R 3de83004edd963c4959934c7f5a61b03
-T +closed 834bf1c367e1ccd498c7f9f843be2d2aa11ffb3c
+P 2312eb6a9eb31051db4e0baf19e033ba39adc7b1
+R 2f4de3ec11a98155d746ed7623586007
 U drh
-Z f4df6ef034f1a63bb656a3ddc69e0011
+Z d44fb7b759451f899c9b9bdcaf2f6d96
index 0466f25ed2079df34b61f6d8c07ce2488efbf2cd..41b50df7955b671426febdb1dd9e68c308f09b49 100644 (file)
@@ -1 +1 @@
-2312eb6a9eb31051db4e0baf19e033ba39adc7b1
\ No newline at end of file
+a67b5312f63909737c052fe58ab5772d45530d49
\ No newline at end of file
index 5761f98550b176cce11dcbcec93899a075bb64fd..ba2e056bd4145c7628c8e301c7cb0627535370a9 100644 (file)
@@ -112,8 +112,8 @@ struct RowSet {
   struct RowSetEntry *pFresh;    /* Source of new entry objects */
   struct RowSetEntry *pForest;   /* List of binary trees of entries */
   u16 nFresh;                    /* Number of objects on pFresh */
-  u8 rsFlags;                    /* Various flags */
-  u8 iBatch;                     /* Current insert batch */
+  u16 rsFlags;                   /* Various flags */
+  int iBatch;                    /* Current insert batch */
 };
 
 /*
@@ -447,7 +447,7 @@ int sqlite3RowSetNext(RowSet *p, i64 *pRowid){
 ** on pRowSet->pEntry, then sort those entires into the forest at
 ** pRowSet->pForest so that they can be tested.
 */
-int sqlite3RowSetTest(RowSet *pRowSet, u8 iBatch, sqlite3_int64 iRowid){
+int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 iRowid){
   struct RowSetEntry *p, *pTree;
 
   /* This routine is never called after sqlite3RowSetNext() */
index 0f67748fc805146c83972805cab3673d289e214b..57481b1084e8a472b7bc8e9e7ffaa817d84c29b4 100644 (file)
@@ -3019,7 +3019,7 @@ int sqlite3BitvecBuiltinTest(int,int*);
 RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
 void sqlite3RowSetClear(RowSet*);
 void sqlite3RowSetInsert(RowSet*, i64);
-int sqlite3RowSetTest(RowSet*, u8 iBatch, i64);
+int sqlite3RowSetTest(RowSet*, int iBatch, i64);
 int sqlite3RowSetNext(RowSet*, i64*);
 
 void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int);
index 2d1d23e0798d4c417445d7348897152f9b604124..6102cf3c7e5a1d5c4c75baba6e9b2b0d755331aa 100644 (file)
@@ -5227,9 +5227,7 @@ case OP_RowSetTest: {                     /* jump, in1, in3 */
   assert( pOp->p4type==P4_INT32 );
   assert( iSet==-1 || iSet>=0 );
   if( iSet ){
-    exists = sqlite3RowSetTest(pIn1->u.pRowSet, 
-                               (u8)(iSet>=0 ? iSet & 0xf : 0xff),
-                               pIn3->u.i);
+    exists = sqlite3RowSetTest(pIn1->u.pRowSet, iSet, pIn3->u.i);
     VdbeBranchTaken(exists!=0,2);
     if( exists ){
       pc = pOp->p2 - 1;
index eb0f86402561d8f01751f2cea35b4b5c608fbfc3..db993040b014cec18af943fd4b96f93f77edcca8 100644 (file)
@@ -217,6 +217,59 @@ do_execsql_test 4.7 {
    ORDER BY a;
 } {3 4 3 4}
 
+# Verify fix of a bug reported on the mailing list by Peter Reid
+#
+do_execsql_test 5.1 {
+  DROP TABLE IF EXISTS t;
+  CREATE TABLE t(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17);
+  CREATE INDEX tc0 ON t(c0);
+  CREATE INDEX tc1 ON t(c1);
+  CREATE INDEX tc2 ON t(c2);
+  CREATE INDEX tc3 ON t(c3);
+  CREATE INDEX tc4 ON t(c4);
+  CREATE INDEX tc5 ON t(c5);
+  CREATE INDEX tc6 ON t(c6);
+  CREATE INDEX tc7 ON t(c7);
+  CREATE INDEX tc8 ON t(c8);
+  CREATE INDEX tc9 ON t(c9);
+  CREATE INDEX tc10 ON t(c10);
+  CREATE INDEX tc11 ON t(c11);
+  CREATE INDEX tc12 ON t(c12);
+  CREATE INDEX tc13 ON t(c13);
+  CREATE INDEX tc14 ON t(c14);
+  CREATE INDEX tc15 ON t(c15);
+  CREATE INDEX tc16 ON t(c16);
+  CREATE INDEX tc17 ON t(c17);
+  
+  INSERT INTO t(c0, c16) VALUES (1,1);
+  
+  SELECT * FROM t WHERE
+    c0=1 or  c1=1 or  c2=1 or  c3=1 or
+    c4=1 or  c5=1 or  c6=1 or  c7=1 or
+    c8=1 or  c9=1 or c10=1 or c11=1 or
+    c12=1 or c13=1 or c14=1 or c15=1 or
+    c16=1 or c17=1;
+} {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1 {}}
+do_execsql_test 5.2 {
+  DELETE FROM t;
+  INSERT INTO t(c0,c17) VALUES(1,1);
+  SELECT * FROM t WHERE
+    c0=1 or  c1=1 or  c2=1 or  c3=1 or
+    c4=1 or  c5=1 or  c6=1 or  c7=1 or
+    c8=1 or  c9=1 or c10=1 or c11=1 or
+    c12=1 or c13=1 or c14=1 or c15=1 or
+    c16=1 or c17=1;
+} {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1}
+do_execsql_test 5.3 {
+  DELETE FROM t;
+  INSERT INTO t(c0,c15) VALUES(1,1);
+  SELECT * FROM t WHERE
+    c0=1 or  c1=1 or  c2=1 or  c3=1 or
+    c4=1 or  c5=1 or  c6=1 or  c7=1 or
+    c8=1 or  c9=1 or c10=1 or c11=1 or
+    c12=1 or c13=1 or c14=1 or c15=1 or
+    c16=1 or c17=1;
+} {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1 {} {}}
 
 
 finish_test