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:
@@ -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
161
test/offset1.test
Normal 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
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user