1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Modify the OR-clause handling so that it can safely deal with OR-clause

with 17 or more terms.  Fix for ticket [10fb063b1179be53ea0b53bb].

FossilOrigin-Name: a67b5312f63909737c052fe58ab5772d45530d49
This commit is contained in:
drh
2014-04-10 02:24:48 +00:00
parent 48e080b26c
commit d83cad235a
6 changed files with 68 additions and 18 deletions

View File

@@ -1,5 +1,5 @@
C Performance\simprovements\swhen\sreading\slarge\sblobs,\sespecially\sif\nSQLITE_DIRECT_OVERFLOW_READ\sis\sdefined. 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-04T18:49:19.417 D 2014-04-10T02:24:48.549
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -216,13 +216,13 @@ F src/prepare.c 677521ab7132615a8a26107a1d1c3132f44ae337
F src/printf.c e5a0005f8b3de21f85da6a709d2fbee76775bf4b F src/printf.c e5a0005f8b3de21f85da6a709d2fbee76775bf4b
F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece
F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66 F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66
F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/rowset.c a9c9aae3234b44a6d7c6f5a3cadf90dce1e627be
F src/select.c 269c3e31a450fce642a10569221a49180348c88e F src/select.c 269c3e31a450fce642a10569221a49180348c88e
F src/shell.c 5260f2ada8dd06e9f5ae0a448c8c01e7a75dd881 F src/shell.c 5260f2ada8dd06e9f5ae0a448c8c01e7a75dd881
F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80 F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80
F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
F src/sqliteInt.h cc9582a91b2910404ccda7b7e198815ea0f75948 F src/sqliteInt.h 9b1361478e821b1a68f7993047a922e3155ca87d
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -278,7 +278,7 @@ F src/update.c 5b3e74a03b3811e586b4f2b4cbd7c49f01c93115
F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c
F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
F src/vdbe.c e811a0081149fb90db367026d154cd7efb3c7098 F src/vdbe.c bf284edea1cee0508dc93c79a73498e0f317edb7
F src/vdbe.h 394464909ed682334aa3d5831aae0c2fe2abef94 F src/vdbe.h 394464909ed682334aa3d5831aae0c2fe2abef94
F src/vdbeInt.h e6d83e5bfd62fc6685ba1ed6153f7099f82de9f7 F src/vdbeInt.h e6d83e5bfd62fc6685ba1ed6153f7099f82de9f7
F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4 F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4
@@ -1089,7 +1089,7 @@ F test/where9.test 4f3eab951353a3ae164befc521c777dfa903e46c
F test/whereA.test 4d253178d135ec46d1671e440cd8f2b916aa6e6b F test/whereA.test 4d253178d135ec46d1671e440cd8f2b916aa6e6b
F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5
F test/whereC.test d6f4ecd4fa2d9429681a5b22a25d2bda8e86ab8a F test/whereC.test d6f4ecd4fa2d9429681a5b22a25d2bda8e86ab8a
F test/whereD.test 6c2feb79ef1f68381b07f39017fe5f9b96da8d62 F test/whereD.test fd9120e262f9da3c45940f52aefeef4d15b904e5
F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f
F test/whereF.test 5b2ba0dbe8074aa13e416b37c753991f0a2492d7 F test/whereF.test 5b2ba0dbe8074aa13e416b37c753991f0a2492d7
F test/whereG.test 2533b72ed4a31fd1687230a499b557b911525344 F test/whereG.test 2533b72ed4a31fd1687230a499b557b911525344
@@ -1160,8 +1160,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
P 683dd379a293b2f330e1e4cd746f190527fe48ee 834bf1c367e1ccd498c7f9f843be2d2aa11ffb3c P 2312eb6a9eb31051db4e0baf19e033ba39adc7b1
R 3de83004edd963c4959934c7f5a61b03 R 2f4de3ec11a98155d746ed7623586007
T +closed 834bf1c367e1ccd498c7f9f843be2d2aa11ffb3c
U drh U drh
Z f4df6ef034f1a63bb656a3ddc69e0011 Z d44fb7b759451f899c9b9bdcaf2f6d96

View File

@@ -1 +1 @@
2312eb6a9eb31051db4e0baf19e033ba39adc7b1 a67b5312f63909737c052fe58ab5772d45530d49

View File

@@ -112,8 +112,8 @@ struct RowSet {
struct RowSetEntry *pFresh; /* Source of new entry objects */ struct RowSetEntry *pFresh; /* Source of new entry objects */
struct RowSetEntry *pForest; /* List of binary trees of entries */ struct RowSetEntry *pForest; /* List of binary trees of entries */
u16 nFresh; /* Number of objects on pFresh */ u16 nFresh; /* Number of objects on pFresh */
u8 rsFlags; /* Various flags */ u16 rsFlags; /* Various flags */
u8 iBatch; /* Current insert batch */ 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 ** on pRowSet->pEntry, then sort those entires into the forest at
** pRowSet->pForest so that they can be tested. ** 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; struct RowSetEntry *p, *pTree;
/* This routine is never called after sqlite3RowSetNext() */ /* This routine is never called after sqlite3RowSetNext() */

View File

@@ -3019,7 +3019,7 @@ int sqlite3BitvecBuiltinTest(int,int*);
RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int); RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
void sqlite3RowSetClear(RowSet*); void sqlite3RowSetClear(RowSet*);
void sqlite3RowSetInsert(RowSet*, i64); void sqlite3RowSetInsert(RowSet*, i64);
int sqlite3RowSetTest(RowSet*, u8 iBatch, i64); int sqlite3RowSetTest(RowSet*, int iBatch, i64);
int sqlite3RowSetNext(RowSet*, i64*); int sqlite3RowSetNext(RowSet*, i64*);
void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int); void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int);

View File

@@ -5227,9 +5227,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */
assert( pOp->p4type==P4_INT32 ); assert( pOp->p4type==P4_INT32 );
assert( iSet==-1 || iSet>=0 ); assert( iSet==-1 || iSet>=0 );
if( iSet ){ if( iSet ){
exists = sqlite3RowSetTest(pIn1->u.pRowSet, exists = sqlite3RowSetTest(pIn1->u.pRowSet, iSet, pIn3->u.i);
(u8)(iSet>=0 ? iSet & 0xf : 0xff),
pIn3->u.i);
VdbeBranchTaken(exists!=0,2); VdbeBranchTaken(exists!=0,2);
if( exists ){ if( exists ){
pc = pOp->p2 - 1; pc = pOp->p2 - 1;

View File

@@ -217,6 +217,59 @@ do_execsql_test 4.7 {
ORDER BY a; ORDER BY a;
} {3 4 3 4} } {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 finish_test