xref: /sqlite-3.40.0/test/with3.test (revision e99cb2da)
1# 2015-11-07
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.  The
12# focus of this file is testing the WITH clause.
13#
14
15set testdir [file dirname $argv0]
16source $testdir/tester.tcl
17set ::testprefix with3
18
19ifcapable {!cte} {
20  finish_test
21  return
22}
23
24# Test problems found by Kostya Serebryany using
25# LibFuzzer.  (http://llvm.org/docs/LibFuzzer.html)
26#
27do_catchsql_test 1.0 {
28  WITH i(x) AS (
29    WITH j AS (SELECT 10)
30    SELECT 5 FROM t0 UNION SELECT 8 FROM m
31  )
32  SELECT * FROM i;
33} {1 {no such table: t0}}
34
35# 2019-11-09 dbfuzzcheck find
36do_catchsql_test 1.1 {
37  CREATE VIEW v1(x,y) AS
38    WITH t1(a,b) AS (VALUES(1,2))
39    SELECT * FROM nosuchtable JOIN t1;
40  SELECT * FROM v1;
41} {1 {no such table: main.nosuchtable}}
42
43# Additional test cases that came out of the work to
44# fix for Kostya's problem.
45#
46do_execsql_test 2.0 {
47 WITH
48  x1 AS (SELECT 10),
49  x2 AS (SELECT 11),
50  x3 AS (
51    SELECT * FROM x1 UNION ALL SELECT * FROM x2
52  ),
53  x4 AS (
54    WITH
55    x1 AS (SELECT 12),
56    x2 AS (SELECT 13)
57    SELECT * FROM x3
58  )
59  SELECT * FROM x4;
60
61} {10 11}
62
63do_execsql_test 2.1 {
64  CREATE TABLE t1(x);
65  WITH
66    x1(a) AS (values(100))
67  INSERT INTO t1(x)
68    SELECT * FROM (WITH x2(y) AS (SELECT * FROM x1) SELECT y+a FROM x1, x2);
69  SELECT * FROM t1;
70} {200}
71
72#-------------------------------------------------------------------------
73# Test that the planner notices LIMIT clauses on recursive WITH queries.
74#
75
76ifcapable analyze {
77  do_execsql_test 3.1.1 {
78    CREATE TABLE y1(a, b);
79    CREATE INDEX y1a ON y1(a);
80
81    WITH cnt(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM cnt LIMIT 1000)
82      INSERT INTO y1 SELECT i%10, i FROM cnt;
83    ANALYZE;
84
85  }
86
87  do_eqp_test 3.1.2 {
88    WITH cnt(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM cnt LIMIT 1)
89    SELECT * FROM cnt, y1 WHERE i=a
90  } [string map {"\n  " \n} {
91    QUERY PLAN
92    |--MATERIALIZE xxxxxx
93    |  |--SETUP
94    |  |  `--SCAN CONSTANT ROW
95    |  `--RECURSIVE STEP
96    |     `--SCAN TABLE cnt
97    |--SCAN SUBQUERY xxxxxx
98    `--SEARCH TABLE y1 USING INDEX y1a (a=?)
99  }]
100
101  do_eqp_test 3.1.3 {
102    WITH cnt(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM cnt LIMIT 1000000)
103    SELECT * FROM cnt, y1 WHERE i=a
104  } [string map {"\n  " \n} {
105    QUERY PLAN
106    |--MATERIALIZE xxxxxx
107    |  |--SETUP
108    |  |  `--SCAN CONSTANT ROW
109    |  `--RECURSIVE STEP
110    |     `--SCAN TABLE cnt
111    |--SCAN TABLE y1
112    `--SEARCH SUBQUERY xxxxxx USING AUTOMATIC COVERING INDEX (i=?)
113  }]
114}
115
116do_execsql_test 3.2.1 {
117  CREATE TABLE w1(pk INTEGER PRIMARY KEY, x INTEGER);
118  CREATE TABLE w2(pk INTEGER PRIMARY KEY);
119}
120
121do_eqp_test 3.2.2 {
122  WITH RECURSIVE c(w,id) AS (SELECT 0, (SELECT pk FROM w2 LIMIT 1)
123     UNION ALL SELECT c.w + 1, x FROM w1, c LIMIT 1)
124     SELECT * FROM c, w2, w1
125     WHERE c.id=w2.pk AND c.id=w1.pk;
126} {
127  QUERY PLAN
128  |--MATERIALIZE xxxxxx
129  |  |--SETUP
130  |  |  |--SCAN CONSTANT ROW
131  |  |  `--SCALAR SUBQUERY xxxxxx
132  |  |     `--SCAN TABLE w2
133  |  `--RECURSIVE STEP
134  |     |--SCAN TABLE w1
135  |     `--SCAN TABLE c
136  |--SCAN SUBQUERY xxxxxx
137  |--SEARCH TABLE w2 USING INTEGER PRIMARY KEY (rowid=?)
138  `--SEARCH TABLE w1 USING INTEGER PRIMARY KEY (rowid=?)
139}
140
141do_execsql_test 4.0 {
142  WITH t5(t5col1) AS (
143    SELECT (
144      WITH t3(t3col1) AS (
145        WITH t2 AS (
146          WITH t1 AS (SELECT 1 AS c1 GROUP BY 1)
147          SELECT a.c1 FROM t1 AS a, t1 AS b
148          WHERE anoncol1 = 1
149        )
150        SELECT (SELECT 1 FROM t2) FROM t2
151      )
152      SELECT t3col1 FROM t3 WHERE t3col1
153    ) FROM (SELECT 1 AS anoncol1)
154  )
155  SELECT t5col1, t5col1 FROM t5
156} {1 1}
157do_execsql_test 4.1 {
158  SELECT EXISTS (
159    WITH RECURSIVE Table0 AS (
160      WITH RECURSIVE Table0(Col0) AS (SELECT ALL 1  )
161      SELECT ALL (
162        WITH RECURSIVE Table0 AS (
163          WITH RECURSIVE Table0 AS (
164            WITH RECURSIVE Table0 AS (SELECT DISTINCT 1  GROUP BY 1  )
165            SELECT DISTINCT * FROM Table0 NATURAL INNER JOIN Table0
166            WHERE Col0 = 1
167          )
168          SELECT ALL (SELECT DISTINCT * FROM Table0) FROM Table0 WHERE Col0 = 1
169        )
170        SELECT ALL * FROM Table0  NATURAL INNER JOIN  Table0
171      ) FROM Table0 )
172      SELECT DISTINCT * FROM Table0  NATURAL INNER JOIN  Table0
173    );
174} {1}
175
176
177finish_test
178