Files
sqlite/test/selectB.test
T
danielk1977 eca7e01a71 Fix a memory leak to do with the recent UNION ALL sub-select optimization. (CVS 5333)
FossilOrigin-Name: 6ee71f4ddb4fa934f58c87dad2d30560af2e55d7
2008-07-01 16:05:25 +00:00

200 lines
4.8 KiB
Plaintext

# 2008 June 24
#
# 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 regression tests for SQLite library.
#
# $Id: selectB.test,v 1.3 2008/07/01 16:05:26 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
proc test_transform {testname sql1 sql2 results} {
set ::vdbe1 [list]
set ::vdbe2 [list]
db eval "explain $sql1" { lappend ::vdbe1 $opcode }
db eval "explain $sql2" { lappend ::vdbe2 $opcode }
do_test $testname.transform {
set ::vdbe1
} $::vdbe2
set ::sql1 $sql1
do_test $testname.sql1 {
execsql $::sql1
} $results
set ::sql2 $sql2
do_test $testname.sql2 {
execsql $::sql2
} $results
}
do_test selectB-1.1 {
execsql {
CREATE TABLE t1(a, b, c);
CREATE TABLE t2(d, e, f);
INSERT INTO t1 VALUES( 2, 4, 6);
INSERT INTO t1 VALUES( 8, 10, 12);
INSERT INTO t1 VALUES(14, 16, 18);
INSERT INTO t2 VALUES(3, 6, 9);
INSERT INTO t2 VALUES(12, 15, 18);
INSERT INTO t2 VALUES(21, 24, 27);
}
} {}
for {set ii 1} {$ii <= 2} {incr ii} {
if {$ii == 2} {
do_test selectB-2.1 {
execsql {
CREATE INDEX i1 ON t1(a);
CREATE INDEX i2 ON t2(d);
}
} {}
}
test_transform selectB-$ii.2 {
SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
} {
SELECT a FROM t1 UNION ALL SELECT d FROM t2
} {2 8 14 3 12 21}
test_transform selectB-$ii.3 {
SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
} {
SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1
} {2 3 8 12 14 21}
test_transform selectB-$ii.4 {
SELECT * FROM
(SELECT a FROM t1 UNION ALL SELECT d FROM t2)
WHERE a>10 ORDER BY 1
} {
SELECT a FROM t1 WHERE a>10 UNION ALL SELECT d FROM t2 WHERE d>10 ORDER BY 1
} {12 14 21}
test_transform selectB-$ii.5 {
SELECT * FROM
(SELECT a FROM t1 UNION ALL SELECT d FROM t2)
WHERE a>10 ORDER BY a
} {
SELECT a FROM t1 WHERE a>10
UNION ALL
SELECT d FROM t2 WHERE d>10
ORDER BY a
} {12 14 21}
test_transform selectB-$ii.6 {
SELECT * FROM
(SELECT a FROM t1 UNION ALL SELECT d FROM t2 WHERE d > 12)
WHERE a>10 ORDER BY a
} {
SELECT a FROM t1 WHERE a>10
UNION ALL
SELECT d FROM t2 WHERE d>12 AND d>10
ORDER BY a
} {14 21}
test_transform selectB-$ii.7 {
SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
LIMIT 2
} {
SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2
} {2 3}
test_transform selectB-$ii.8 {
SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
LIMIT 2 OFFSET 3
} {
SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 OFFSET 3
} {12 14}
test_transform selectB-$ii.9 {
SELECT * FROM (
SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
)
} {
SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
} {2 8 14 3 12 21 6 12 18}
test_transform selectB-$ii.10 {
SELECT * FROM (
SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
) ORDER BY 1
} {
SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
ORDER BY 1
} {2 3 6 8 12 12 14 18 21}
test_transform selectB-$ii.11 {
SELECT * FROM (
SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
) WHERE a>=10 ORDER BY 1 LIMIT 3
} {
SELECT a FROM t1 WHERE a>=10 UNION ALL SELECT d FROM t2 WHERE d>=10
UNION ALL SELECT c FROM t1 WHERE c>=10
ORDER BY 1 LIMIT 3
} {12 12 14}
}
do_test selectB-2.1 {
execsql {
SELECT DISTINCT * FROM
(SELECT c FROM t1 UNION ALL SELECT e FROM t2)
ORDER BY 1;
}
} {6 12 15 18 24}
do_test selectB-2.2 {
execsql {
SELECT c, count(*) FROM
(SELECT c FROM t1 UNION ALL SELECT e FROM t2)
GROUP BY c ORDER BY 1;
}
} {6 2 12 1 15 1 18 1 24 1}
do_test selectB-2.3 {
execsql {
SELECT c, count(*) FROM
(SELECT c FROM t1 UNION ALL SELECT e FROM t2)
GROUP BY c HAVING count(*)>1;
}
} {6 2}
do_test selectB-2.4 {
execsql {
SELECT t4.c, t3.a FROM
(SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3
WHERE t3.a=14
ORDER BY 1
}
} {6 14 6 14 12 14 15 14 18 14 24 14}
do_test selectB-2.5 {
execsql {
SELECT d FROM t2
EXCEPT
SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
}
} {}
do_test selectB-2.6 {
execsql {
SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
EXCEPT
SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
}
} {}
finish_test