1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-15 11:41:13 +03:00

Merge the 3.8.12 beta changes from trunk.

FossilOrigin-Name: 35b1b8d4b97715030700e37b292bb4f1bb3f44d6
This commit is contained in:
drh
2015-10-08 14:55:30 +00:00
33 changed files with 1680 additions and 612 deletions

View File

@@ -122,6 +122,8 @@ proc balanced_andor_tree {nEntry} {
return $tree
}
if 1 {
# Test that queries like "1 AND 2 AND 3 AND 4..." are transformed to
# balanced trees by FTS.
#
@@ -202,5 +204,35 @@ do_faultsim_test fts3expr3-fault-1 -faults oom-* -body {
faultsim_test_result [list 0 $::result]
}
}
#-------------------------------------------------------------------
foreach {tn expr res} {
1 {1 OR 2 OR 3 OR 4} {OR {OR {P 1} {P 2}} {OR {P 3} {P 4}}}
2 {1 OR (2 AND 3 AND 4 AND 5)}
{OR {P 1} {AND {AND {P 2} {P 3}} {AND {P 4} {P 5}}}}
3 {(2 AND 3 AND 4 AND 5) OR 1}
{OR {AND {AND {P 2} {P 3}} {AND {P 4} {P 5}}} {P 1}}
4 {1 AND (2 OR 3 OR 4 OR 5)}
{AND {P 1} {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}}}
5 {(2 OR 3 OR 4 OR 5) AND 1}
{AND {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}} {P 1}}
6 {(2 OR 3 OR 4 OR 5) NOT 1}
{NOT {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}} {P 1}}
7 {1 NOT (2 OR 3 OR 4 OR 5)}
{NOT {P 1} {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}}}
8 {(1 OR 2 OR 3 OR 4) NOT (5 AND 6 AND 7 AND 8)}
{NOT {OR {OR {P 1} {P 2}} {OR {P 3} {P 4}}} {AND {AND {P 5} {P 6}} {AND {P 7} {P 8}}}}
} {
do_test 5.1.$tn {
test_fts3expr2 $expr
} $res
}
set sqlite_fts3_enable_parentheses 0
finish_test

161
test/offset1.test Normal file
View File

@@ -0,0 +1,161 @@
# 2015-10-06
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
# This file implements test cases for the [b65cb2c8d91f6685841d7d1e13b6]
# bug: Correct handling of LIMIT and OFFSET on a UNION ALL query where
# the right-hand SELECT contains an ORDER BY in a subquery.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
ifcapable !compound {
finish_test
return
}
do_execsql_test offset1-1.1 {
CREATE TABLE t1(a,b);
INSERT INTO t1 VALUES(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e');
CREATE TABLE t2(x,y);
INSERT INTO t2 VALUES(8,'y'),(9,'z'),(6,'w'),(7,'x');
SELECT count(*) FROM t1, t2;
} {20}
do_execsql_test offset1-1.2.0 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 0;
} {1 a 2 b 3 c}
do_execsql_test offset1-1.2.1 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 1;
} {2 b 3 c 4 d}
do_execsql_test offset1-1.2.2 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 2;
} {3 c 4 d 5 e}
do_execsql_test offset1-1.2.3 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 3;
} {4 d 5 e 6 w}
do_execsql_test offset1-1.2.4 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 4;
} {5 e 6 w 7 x}
do_execsql_test offset1-1.2.5 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 5;
} {6 w 7 x 8 y}
do_execsql_test offset1-1.2.6 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 6;
} {7 x 8 y 9 z}
do_execsql_test offset1-1.2.7 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 7;
} {8 y 9 z}
do_execsql_test offset1-1.2.8 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 8;
} {9 z}
do_execsql_test offset1-1.2.9 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 9;
} {}
do_execsql_test offset1-1.3.0 {
SELECT * FROM t1 LIMIT 0;
} {}
do_execsql_test offset1-1.4.0 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 0 OFFSET 1;
} {}
do_execsql_test offset1-1.4.1 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 1 OFFSET 1;
} {2 b}
do_execsql_test offset1-1.4.2 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 2 OFFSET 1;
} {2 b 3 c}
do_execsql_test offset1-1.4.3 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 3 OFFSET 1;
} {2 b 3 c 4 d}
do_execsql_test offset1-1.4.4 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 4 OFFSET 1;
} {2 b 3 c 4 d 5 e}
do_execsql_test offset1-1.4.5 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 5 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w}
do_execsql_test offset1-1.4.6 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 6 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x}
do_execsql_test offset1-1.4.7 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 7 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x 8 y}
do_execsql_test offset1-1.4.8 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 8 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x 8 y 9 z}
do_execsql_test offset1-1.4.9 {
SELECT a, b FROM t1
UNION ALL
SELECT * FROM (SELECT x, y FROM t2 ORDER BY y)
LIMIT 9 OFFSET 1;
} {2 b 3 c 4 d 5 e 6 w 7 x 8 y 9 z}
finish_test

View File

@@ -76,40 +76,42 @@ do_execsql_test 1.5 {
do_execsql_test 1.6 {
SELECT word, distance, matchlen FROM demo
WHERE word MATCH 'amstedam*' AND distance <= 100;
WHERE word MATCH 'amstedam*' AND distance <= 100
ORDER BY distance, word;
} {
amsterdam 100 9 amsterdamh 100 9
amsterdamm 100 9 amsterdamn 100 9
amsterdama 100 9 amsterdame 100 9
amsterdami 100 9 amsterdamo 100 9
amsterdamu 100 9 amsterdamy 100 9
amsterdammetje 100 9 amsterdamania 100 9
amsterdamb 100 9 amsterdamf 100 9
amsterdamp 100 9 amsterdamv 100 9
amsterdamw 100 9 amsterdamweg 100 9
amsterdamc 100 9 amsterdamg 100 9
amsterdamj 100 9 amsterdamk 100 9
amsterdamq 100 9 amsterdams 100 9
amsterdamx 100 9 amsterdamz 100 9
amsterdamsestraat 100 9 amsterdamd 100 9
amsterdamt 100 9 amsterdaml 100 9
amsterdamlaan 100 9 amsterdamr 100 9
amsterdam 100 9 amsterdama 100 9
amsterdamania 100 9 amsterdamb 100 9
amsterdamc 100 9 amsterdamd 100 9
amsterdame 100 9 amsterdamf 100 9
amsterdamg 100 9 amsterdamh 100 9
amsterdami 100 9 amsterdamj 100 9
amsterdamk 100 9 amsterdaml 100 9
amsterdamlaan 100 9 amsterdamm 100 9
amsterdammetje 100 9 amsterdamn 100 9
amsterdamo 100 9 amsterdamp 100 9
amsterdamq 100 9 amsterdamr 100 9
amsterdams 100 9 amsterdamsestraat 100 9
amsterdamt 100 9 amsterdamu 100 9
amsterdamv 100 9 amsterdamw 100 9
amsterdamweg 100 9 amsterdamx 100 9
amsterdamy 100 9 amsterdamz 100 9
}
do_execsql_test 1.7 {
SELECT word, distance, matchlen FROM demo
WHERE word MATCH 'amstedam*' AND distance <= 100 AND top=20;
WHERE word MATCH 'amstedam*' AND distance <= 100 AND top=20
ORDER BY distance, word;
} {
amsterdam 100 9 amsterdamh 100 9
amsterdamm 100 9 amsterdamn 100 9
amsterdama 100 9 amsterdame 100 9
amsterdami 100 9 amsterdamo 100 9
amsterdamu 100 9 amsterdamy 100 9
amsterdammetje 100 9 amsterdamania 100 9
amsterdamb 100 9 amsterdamf 100 9
amsterdamp 100 9 amsterdamv 100 9
amsterdamw 100 9 amsterdamweg 100 9
amsterdamc 100 9 amsterdamg 100 9
amsterdam 100 9 amsterdama 100 9
amsterdamania 100 9 amsterdamb 100 9
amsterdamc 100 9 amsterdame 100 9
amsterdamf 100 9 amsterdamg 100 9
amsterdamh 100 9 amsterdami 100 9
amsterdamm 100 9 amsterdammetje 100 9
amsterdamn 100 9 amsterdamo 100 9
amsterdamp 100 9 amsterdamu 100 9
amsterdamv 100 9 amsterdamw 100 9
amsterdamweg 100 9 amsterdamy 100 9
}

View File

@@ -63,6 +63,14 @@ foreach {tn uri file} {
#
if {$tn>14} break
#
# NOTE: When running on Tcl 8.6 (or higher?) on Windows, a colon within
# the file name no longer tries to access an alternate data stream
# (ADS) named "test.db" for the "http" file, causing some spurious
# failures of this test.
#
if {$tn==12 && $::tcl_version>=8.6} continue
#
# NOTE: On Windows, we need to account for the fact that the current
# directory does not start with a forward slash.