xref: /sqlite-3.40.0/test/altertab.test (revision ddfec00d)
1c9461eccSdan# 2018 August 24
2c9461eccSdan#
3c9461eccSdan# The author disclaims copyright to this source code.  In place of
4c9461eccSdan# a legal notice, here is a blessing:
5c9461eccSdan#
6c9461eccSdan#    May you do good and not evil.
7c9461eccSdan#    May you find forgiveness for yourself and forgive others.
8c9461eccSdan#    May you share freely, never taking more than you give.
9c9461eccSdan#
10c9461eccSdan#*************************************************************************
11c9461eccSdan#
12c9461eccSdan
13c9461eccSdanset testdir [file dirname $argv0]
14c9461eccSdansource $testdir/tester.tcl
15c9461eccSdanset testprefix altertab
16c9461eccSdan
17c9461eccSdan# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
18c9461eccSdanifcapable !altertable {
19c9461eccSdan  finish_test
20c9461eccSdan  return
21c9461eccSdan}
22c9461eccSdan
23c9461eccSdando_execsql_test 1.0 {
24c9461eccSdan  CREATE TABLE t1(a, b, CHECK(t1.a != t1.b));
25c9461eccSdan
26c9461eccSdan  CREATE TABLE t2(a, b);
27c9461eccSdan  CREATE INDEX t2expr ON t2(a) WHERE t2.b>0;
28c9461eccSdan}
29c9461eccSdan
30c9461eccSdando_execsql_test 1.1 {
31c9461eccSdan  SELECT sql FROM sqlite_master
32c9461eccSdan} {
33c9461eccSdan  {CREATE TABLE t1(a, b, CHECK(t1.a != t1.b))}
34c9461eccSdan  {CREATE TABLE t2(a, b)}
35c9461eccSdan  {CREATE INDEX t2expr ON t2(a) WHERE t2.b>0}
36c9461eccSdan}
37c9461eccSdan
38c9461eccSdando_execsql_test 1.2 {
39c9461eccSdan  ALTER TABLE t1 RENAME TO t1new;
40c9461eccSdan}
41c9461eccSdan
42c9461eccSdando_execsql_test 1.3 {
43c9461eccSdan  CREATE TABLE t3(c, d);
44c9461eccSdan  ALTER TABLE t3 RENAME TO t3new;
45c9461eccSdan  DROP TABLE t3new;
46c9461eccSdan}
47c9461eccSdan
48c9461eccSdando_execsql_test 1.4 {
49c9461eccSdan  SELECT sql FROM sqlite_master
50c9461eccSdan} {
51c9461eccSdan  {CREATE TABLE "t1new"(a, b, CHECK("t1new".a != "t1new".b))}
52c9461eccSdan  {CREATE TABLE t2(a, b)}
53c9461eccSdan  {CREATE INDEX t2expr ON t2(a) WHERE t2.b>0}
54c9461eccSdan}
55c9461eccSdan
56c9461eccSdan
57c9461eccSdando_execsql_test 1.3 {
58c9461eccSdan  ALTER TABLE t2 RENAME TO t2new;
59c9461eccSdan}
60c9461eccSdando_execsql_test 1.4 {
61c9461eccSdan  SELECT sql FROM sqlite_master
62c9461eccSdan} {
63c9461eccSdan  {CREATE TABLE "t1new"(a, b, CHECK("t1new".a != "t1new".b))}
64c9461eccSdan  {CREATE TABLE "t2new"(a, b)}
65c9461eccSdan  {CREATE INDEX t2expr ON "t2new"(a) WHERE "t2new".b>0}
66c9461eccSdan}
67c9461eccSdan
68c9461eccSdan
69c9461eccSdan#-------------------------------------------------------------------------
70c9461eccSdanreset_db
717ea1edb7Sdanifcapable vtab {
72c9461eccSdan  register_echo_module db
73c9461eccSdan
74c9461eccSdan  do_execsql_test 2.0 {
75c9461eccSdan    CREATE TABLE abc(a, b, c);
76c9461eccSdan    INSERT INTO abc VALUES(1, 2, 3);
77c9461eccSdan    CREATE VIRTUAL TABLE eee USING echo('abc');
78c9461eccSdan    SELECT * FROM eee;
79c9461eccSdan  } {1 2 3}
80c9461eccSdan
81c9461eccSdan  do_execsql_test 2.1 {
82c9461eccSdan    ALTER TABLE eee RENAME TO fff;
83c9461eccSdan    SELECT * FROM fff;
84c9461eccSdan  } {1 2 3}
85c9461eccSdan
86c9461eccSdan  db close
87c9461eccSdan  sqlite3 db test.db
88c9461eccSdan
89c9461eccSdan  do_catchsql_test 2.2 {
90c9461eccSdan    ALTER TABLE fff RENAME TO ggg;
91c9461eccSdan  } {1 {no such module: echo}}
927ea1edb7Sdan}
93c9461eccSdan
94c9461eccSdan#-------------------------------------------------------------------------
95c9461eccSdanreset_db
96c9461eccSdan
97c9461eccSdando_execsql_test 3.0 {
98c9461eccSdan  CREATE TABLE txx(a, b, c);
99c9461eccSdan  INSERT INTO txx VALUES(1, 2, 3);
100c9461eccSdan  CREATE VIEW vvv AS SELECT main.txx.a, txx.b, c FROM txx;
101c9461eccSdan  CREATE VIEW uuu AS SELECT main.one.a, one.b, c FROM txx AS one;
102c9461eccSdan  CREATE VIEW temp.ttt AS SELECT main.txx.a, txx.b, one.b, main.one.a FROM txx AS one, txx;
103c9461eccSdan}
104c9461eccSdan
105c9461eccSdando_execsql_test 3.1.1 {
106c9461eccSdan  SELECT * FROM vvv;
107c9461eccSdan} {1 2 3}
108c9461eccSdando_execsql_test 3.1.2 {
109c9461eccSdan  ALTER TABLE txx RENAME TO "t xx";
110c9461eccSdan  SELECT * FROM vvv;
111c9461eccSdan} {1 2 3}
112c9461eccSdando_execsql_test 3.1.3 {
113c9461eccSdan  SELECT sql FROM sqlite_master WHERE name='vvv';
114c9461eccSdan} {{CREATE VIEW vvv AS SELECT main."t xx".a, "t xx".b, c FROM "t xx"}}
115c9461eccSdan
116c9461eccSdan
117c9461eccSdando_execsql_test 3.2.1 {
118c9461eccSdan  SELECT * FROM uuu;
119c9461eccSdan} {1 2 3}
120c9461eccSdando_execsql_test 3.2.2 {
121c9461eccSdan  SELECT sql FROM sqlite_master WHERE name='uuu';;
122c9461eccSdan} {{CREATE VIEW uuu AS SELECT main.one.a, one.b, c FROM "t xx" AS one}}
123c9461eccSdan
124c9461eccSdando_execsql_test 3.3.1 {
125c9461eccSdan  SELECT * FROM ttt;
126c9461eccSdan} {1 2 2 1}
127c9461eccSdando_execsql_test 3.3.2 {
128c9461eccSdan  SELECT sql FROM sqlite_temp_master WHERE name='ttt';
129c9461eccSdan} {{CREATE VIEW ttt AS SELECT main."t xx".a, "t xx".b, one.b, main.one.a FROM "t xx" AS one, "t xx"}}
130c9461eccSdan
131c9461eccSdan#-------------------------------------------------------------------------
132c9461eccSdanreset_db
133c9461eccSdando_execsql_test 4.0 {
134c9461eccSdan  CREATE table t1(x, y);
135c9461eccSdan  CREATE table t2(a, b);
136c9461eccSdan
137c9461eccSdan  CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
138c9461eccSdan    SELECT t1.x, * FROM t1, t2;
139c9461eccSdan    INSERT INTO t2 VALUES(new.x, new.y);
140c9461eccSdan  END;
141c9461eccSdan}
142c9461eccSdan
143c9461eccSdando_execsql_test 4.1 {
144c9461eccSdan  INSERT INTO t1 VALUES(1, 1);
145c9461eccSdan  ALTER TABLE t1 RENAME TO t11;
146c9461eccSdan  INSERT INTO t11 VALUES(2, 2);
147c9461eccSdan  ALTER TABLE t2 RENAME TO t22;
148c9461eccSdan  INSERT INTO t11 VALUES(3, 3);
149c9461eccSdan}
150c9461eccSdan
151c9461eccSdanproc squish {a} {
152c9461eccSdan  string trim [regsub -all {[[:space:]][[:space:]]*} $a { }]
153c9461eccSdan}
154c9461eccSdandb func squish squish
155c9461eccSdando_test 4.2 {
156c9461eccSdan  execsql { SELECT squish(sql) FROM sqlite_master WHERE name = 'tr1' }
157c9461eccSdan} [list [squish {
158c9461eccSdan  CREATE TRIGGER tr1 AFTER INSERT ON "t11" BEGIN
159c9461eccSdan    SELECT "t11".x, * FROM "t11", "t22";
160c9461eccSdan    INSERT INTO "t22" VALUES(new.x, new.y);
161c9461eccSdan  END
162c9461eccSdan}]]
163c9461eccSdan
1640ccda968Sdan#-------------------------------------------------------------------------
1650ccda968Sdanreset_db
1660ccda968Sdando_execsql_test 5.0 {
1670ccda968Sdan  CREATE TABLE t9(a, b, c);
1680ccda968Sdan  CREATE TABLE t10(a, b, c);
1690ccda968Sdan  CREATE TEMP TABLE t9(a, b, c);
1700ccda968Sdan
1710ccda968Sdan  CREATE TRIGGER temp.t9t AFTER INSERT ON temp.t9 BEGIN
1720ccda968Sdan    INSERT INTO t10 VALUES(new.a, new.b, new.c);
1730ccda968Sdan  END;
1740ccda968Sdan
1750ccda968Sdan  INSERT INTO temp.t9 VALUES(1, 2, 3);
1760ccda968Sdan  SELECT * FROM t10;
1770ccda968Sdan} {1 2 3}
1780ccda968Sdan
1790ccda968Sdando_execsql_test 5.1 {
1800ccda968Sdan  ALTER TABLE temp.t9 RENAME TO 't1234567890'
1810ccda968Sdan}
182c9461eccSdan
1839d324823Sdando_execsql_test 5.2 {
1849d324823Sdan  CREATE TABLE t1(a, b);
1859d324823Sdan  CREATE TABLE t2(a, b);
1869d324823Sdan  INSERT INTO t1 VALUES(1, 2);
1879d324823Sdan  INSERT INTO t2 VALUES(3, 4);
1889d324823Sdan  CREATE VIEW v AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2;
1899d324823Sdan  SELECT * FROM v;
1909d324823Sdan} {1 2 3 4}
1919d324823Sdan
1929d324823Sdando_catchsql_test 5.3 {
1939d324823Sdan  ALTER TABLE t2 RENAME TO one;
1949d324823Sdan} {1 {error in view v after rename: ambiguous column name: one.a}}
1959d324823Sdan
1969d324823Sdando_execsql_test 5.4 {
1979d324823Sdan  SELECT  *  FROM v
1989d324823Sdan} {1 2 3 4}
1999d324823Sdan
2009d324823Sdando_execsql_test 5.5 {
2019d324823Sdan  DROP VIEW v;
2029d324823Sdan  CREATE VIEW temp.vv AS SELECT one.a, one.b, t2.a, t2.b FROM t1 AS one, t2;
2039d324823Sdan  SELECT * FROM vv;
2049d324823Sdan} {1 2 3 4}
2059d324823Sdan
2069d324823Sdando_catchsql_test 5.6 {
2079d324823Sdan  ALTER TABLE t2 RENAME TO one;
2089d324823Sdan} {1 {error in view vv after rename: ambiguous column name: one.a}}
2099d324823Sdan
210b87a9a8aSdan#-------------------------------------------------------------------------
211b87a9a8aSdan
2121041a6a8Sdanifcapable vtab {
213b87a9a8aSdan  register_tcl_module db
214b87a9a8aSdan  proc tcl_command {method args} {
215b87a9a8aSdan    switch -- $method {
216b87a9a8aSdan      xConnect {
217b87a9a8aSdan        return "CREATE TABLE t1(a, b, c)"
218b87a9a8aSdan      }
219b87a9a8aSdan    }
220b87a9a8aSdan    return {}
221b87a9a8aSdan  }
222b87a9a8aSdan
223b87a9a8aSdan  do_execsql_test 6.0 {
224b87a9a8aSdan    CREATE VIRTUAL TABLE x1 USING tcl(tcl_command);
225b87a9a8aSdan  }
226b87a9a8aSdan
227b87a9a8aSdan  do_execsql_test 6.1 {
228b87a9a8aSdan    ALTER TABLE x1 RENAME TO x2;
229b87a9a8aSdan    SELECT sql FROM sqlite_master WHERE name = 'x2'
230b87a9a8aSdan  } {{CREATE VIRTUAL TABLE "x2" USING tcl(tcl_command)}}
231b87a9a8aSdan
232b87a9a8aSdan  do_execsql_test 7.1 {
233b87a9a8aSdan    CREATE TABLE ddd(db, sql, zOld, zNew, bTemp);
234b87a9a8aSdan    INSERT INTO ddd VALUES(
235b87a9a8aSdan        'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', 'ddd', NULL, 0
236b87a9a8aSdan    ), (
237b87a9a8aSdan        'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', NULL, 'eee', 0
238b87a9a8aSdan    ), (
239b87a9a8aSdan        'main', NULL, 'ddd', 'eee', 0
240b87a9a8aSdan    );
241b87a9a8aSdan  } {}
242b87a9a8aSdan
243171c50ecSdrh  sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db
244b87a9a8aSdan  do_execsql_test 7.2 {
245b87a9a8aSdan    SELECT
24665372fa9Sdan    sqlite_rename_table(db, 0, 0, sql, zOld, zNew, bTemp)
247b87a9a8aSdan    FROM ddd;
248b87a9a8aSdan  } {{} {} {}}
249171c50ecSdrh  sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db
2501041a6a8Sdan}
251b87a9a8aSdan
252143df55dSdan#-------------------------------------------------------------------------
253143df55dSdan#
254143df55dSdanreset_db
255143df55dSdanforcedelete test.db2
256143df55dSdando_execsql_test 8.1 {
257143df55dSdan  ATTACH 'test.db2' AS aux;
258143df55dSdan  PRAGMA foreign_keys = on;
259143df55dSdan  CREATE TABLE aux.p1(a INTEGER PRIMARY KEY, b);
260143df55dSdan  CREATE TABLE aux.c1(x INTEGER PRIMARY KEY, y REFERENCES p1(a));
261143df55dSdan  INSERT INTO aux.p1 VALUES(1, 1);
262143df55dSdan  INSERT INTO aux.p1 VALUES(2, 2);
263143df55dSdan  INSERT INTO aux.c1 VALUES(NULL, 2);
264143df55dSdan  CREATE TABLE aux.c2(x INTEGER PRIMARY KEY, y REFERENCES c1(a));
265143df55dSdan}
266143df55dSdan
267143df55dSdando_execsql_test 8.2 {
268143df55dSdan  ALTER TABLE aux.p1 RENAME TO ppp;
269143df55dSdan}
270143df55dSdan
271143df55dSdando_execsql_test 8.2 {
272143df55dSdan  INSERT INTO aux.c1 VALUES(NULL, 1);
273143df55dSdan  SELECT sql FROM aux.sqlite_master WHERE name = 'c1';
274143df55dSdan} {{CREATE TABLE c1(x INTEGER PRIMARY KEY, y REFERENCES "ppp"(a))}}
275143df55dSdan
27665372fa9Sdanreset_db
27765372fa9Sdando_execsql_test 9.0 {
27865372fa9Sdan  CREATE TABLE t1(a, b, c);
27965372fa9Sdan  CREATE VIEW v1 AS SELECT * FROM t2;
28065372fa9Sdan}
28165372fa9Sdando_catchsql_test 9.1 {
28265372fa9Sdan  ALTER TABLE t1 RENAME TO t3;
28365372fa9Sdan} {1 {error in view v1: no such table: main.t2}}
28465372fa9Sdando_execsql_test 9.2 {
28565372fa9Sdan  DROP VIEW v1;
28665372fa9Sdan  CREATE TRIGGER tr AFTER INSERT ON t1 BEGIN
28765372fa9Sdan    INSERT INTO t2 VALUES(new.a);
28865372fa9Sdan  END;
28965372fa9Sdan}
29065372fa9Sdando_catchsql_test 9.3 {
29165372fa9Sdan  ALTER TABLE t1 RENAME TO t3;
29265372fa9Sdan} {1 {error in trigger tr: no such table: main.t2}}
29365372fa9Sdan
29465372fa9Sdanforcedelete test.db2
29565372fa9Sdando_execsql_test 9.4 {
29665372fa9Sdan  DROP TRIGGER tr;
29765372fa9Sdan
29865372fa9Sdan  ATTACH 'test.db2' AS aux;
299c50f75dfSdan  CREATE TRIGGER tr AFTER INSERT ON t1 WHEN new.a IS NULL BEGIN SELECT 1, 2, 3; END;
30065372fa9Sdan
30165372fa9Sdan  CREATE TABLE aux.t1(x);
30265372fa9Sdan  CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN SELECT 1, 2, 3; END;
30365372fa9Sdan}
30465372fa9Sdando_execsql_test 9.5 {
30565372fa9Sdan  ALTER TABLE main.t1 RENAME TO t3;
30665372fa9Sdan}
30765372fa9Sdando_execsql_test 9.6 {
30865372fa9Sdan  SELECT sql FROM sqlite_temp_master;
30965372fa9Sdan  SELECT sql FROM sqlite_master WHERE type='trigger';
31065372fa9Sdan} {
31165372fa9Sdan  {CREATE TRIGGER tr AFTER INSERT ON aux.t1 BEGIN SELECT 1, 2, 3; END}
312c50f75dfSdan  {CREATE TRIGGER tr AFTER INSERT ON "t3" WHEN new.a IS NULL BEGIN SELECT 1, 2, 3; END}
31365372fa9Sdan}
31465372fa9Sdan
3155921f2b9Sdan#-------------------------------------------------------------------------
3165921f2b9Sdanreset_db
3175921f2b9Sdanifcapable fts5 {
3185921f2b9Sdan  do_execsql_test 10.0 {
3195921f2b9Sdan    CREATE VIRTUAL TABLE fff USING fts5(x, y, z);
3205921f2b9Sdan  }
3215921f2b9Sdan
3225921f2b9Sdan  do_execsql_test 10.1 {
3235921f2b9Sdan    BEGIN;
3245921f2b9Sdan      INSERT INTO fff VALUES('a', 'b', 'c');
3255921f2b9Sdan      ALTER TABLE fff RENAME TO ggg;
3265921f2b9Sdan    COMMIT;
3275921f2b9Sdan  }
3285921f2b9Sdan
3295921f2b9Sdan  do_execsql_test 10.2 {
3305921f2b9Sdan    SELECT * FROM ggg;
3315921f2b9Sdan  } {a b c}
3325921f2b9Sdan}
3335921f2b9Sdan
3341d85c6bfSdan#-------------------------------------------------------------------------
3351d85c6bfSdanreset_db
3361d85c6bfSdanforcedelete test.db2
3371d85c6bfSdandb func trigger trigger
3381d85c6bfSdanset ::trigger [list]
3391d85c6bfSdanproc trigger {args} {
3401d85c6bfSdan  lappend ::trigger $args
3411d85c6bfSdan}
3421d85c6bfSdando_execsql_test 11.0 {
3431d85c6bfSdan  ATTACH 'test.db2' AS aux;
3441d85c6bfSdan  CREATE TABLE aux.t1(a, b, c);
3451d85c6bfSdan  CREATE TABLE main.t1(a, b, c);
3461d85c6bfSdan  CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN
3471d85c6bfSdan    SELECT trigger(new.a, new.b, new.c);
3481d85c6bfSdan  END;
3491d85c6bfSdan}
350c9461eccSdan
3511d85c6bfSdando_execsql_test 11.1 {
3521d85c6bfSdan  INSERT INTO main.t1 VALUES(1, 2, 3);
3531d85c6bfSdan  INSERT INTO aux.t1 VALUES(4, 5, 6);
3541d85c6bfSdan}
3551d85c6bfSdando_test 11.2 { set ::trigger } {{4 5 6}}
3561d85c6bfSdan
3571d85c6bfSdando_execsql_test 11.3 {
3581d85c6bfSdan  SELECT name, tbl_name FROM sqlite_temp_master;
3591d85c6bfSdan} {tr t1}
3601d85c6bfSdan
3611d85c6bfSdando_execsql_test 11.4 {
3621d85c6bfSdan  ALTER TABLE main.t1 RENAME TO t2;
3631d85c6bfSdan  SELECT name, tbl_name FROM sqlite_temp_master;
3641d85c6bfSdan} {tr t1}
3651d85c6bfSdan
3661d85c6bfSdando_execsql_test 11.5 {
3671d85c6bfSdan  ALTER TABLE aux.t1 RENAME TO t2;
3681d85c6bfSdan  SELECT name, tbl_name FROM sqlite_temp_master;
3691d85c6bfSdan} {tr t2}
3701d85c6bfSdan
3711d85c6bfSdando_execsql_test 11.6 {
3721d85c6bfSdan  INSERT INTO aux.t2 VALUES(7, 8, 9);
3731d85c6bfSdan}
3741d85c6bfSdando_test 11.7 { set ::trigger } {{4 5 6} {7 8 9}}
3751d85c6bfSdan
376d5e6fef2Sdan#-------------------------------------------------------------------------
377d5e6fef2Sdanreset_db
378d5e6fef2Sdando_execsql_test 12.0 {
379d5e6fef2Sdan  CREATE TABLE t1(a);
380d5e6fef2Sdan  CREATE TABLE t2(w);
381d5e6fef2Sdan  CREATE TRIGGER temp.r1 AFTER INSERT ON main.t2 BEGIN
382d5e6fef2Sdan    INSERT INTO t1(a) VALUES(new.w);
383d5e6fef2Sdan  END;
384d5e6fef2Sdan  CREATE TEMP TABLE t2(x);
385d5e6fef2Sdan}
386d5e6fef2Sdan
387d5e6fef2Sdando_execsql_test 12.1 {
388d5e6fef2Sdan  ALTER TABLE main.t2 RENAME TO t3;
389d5e6fef2Sdan}
390d5e6fef2Sdan
391d5e6fef2Sdando_execsql_test 12.2 {
392d5e6fef2Sdan  INSERT INTO t3 VALUES('WWW');
393d5e6fef2Sdan  SELECT * FROM t1;
394d5e6fef2Sdan} {WWW}
395d5e6fef2Sdan
396b2802128Sdan
397b2802128Sdan#-------------------------------------------------------------------------
398b2802128Sdanreset_db
399b2802128Sdando_execsql_test 13.0 {
400b2802128Sdan  CREATE TABLE t1(x, y);
401b2802128Sdan  CREATE TABLE t2(a, b);
402b2802128Sdan  CREATE TABLE log(c);
403b2802128Sdan  CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
404b2802128Sdan    INSERT INTO log SELECT y FROM t1, t2;
405b2802128Sdan  END;
406b2802128Sdan}
407b2802128Sdan
408b2802128Sdando_execsql_test 13.1 {
409b2802128Sdan  INSERT INTO t1 VALUES(1, 2);
410b2802128Sdan}
411b2802128Sdan
412b2802128Sdando_catchsql_test 13.2 {
413b2802128Sdan  ALTER TABLE t2 RENAME b TO y;
414b2802128Sdan} {1 {error in trigger tr1 after rename: ambiguous column name: y}}
415b2802128Sdan
4160208337cSdan#-------------------------------------------------------------------------
4170208337cSdanreset_db
4180208337cSdan
4190208337cSdanifcapable rtree {
4200208337cSdan  do_execsql_test 14.0 {
4210208337cSdan    CREATE VIRTUAL TABLE rt USING rtree(id, minx, maxx, miny, maxy);
4220208337cSdan
4230208337cSdan    CREATE TABLE "mytable" ( "fid" INTEGER PRIMARY KEY, "geom" BLOB);
4240208337cSdan
4250208337cSdan    CREATE TRIGGER tr1 AFTER UPDATE OF "geom" ON "mytable"
4260208337cSdan          WHEN OLD."fid" = NEW."fid" AND NEW."geom" IS NULL BEGIN
4270208337cSdan      DELETE FROM rt WHERE id = OLD."fid";
4280208337cSdan    END;
4290208337cSdan
4300208337cSdan    INSERT INTO mytable VALUES(1, X'abcd');
4310208337cSdan  }
4320208337cSdan
4330208337cSdan  do_execsql_test 14.1 {
4340208337cSdan    UPDATE mytable SET geom = X'1234'
4350208337cSdan  }
4360208337cSdan
4370208337cSdan  do_execsql_test 14.2 {
4380208337cSdan    ALTER TABLE mytable RENAME TO mytable_renamed;
4390208337cSdan  }
4400208337cSdan
4410208337cSdan  do_execsql_test 14.3 {
4420208337cSdan    CREATE TRIGGER tr2 AFTER INSERT ON mytable_renamed BEGIN
4430208337cSdan      DELETE FROM rt WHERE id=(SELECT min(id) FROM rt);
4440208337cSdan    END;
4450208337cSdan  }
4460208337cSdan
4470208337cSdan  do_execsql_test 14.4 {
4480208337cSdan    ALTER TABLE mytable_renamed RENAME TO mytable2;
4490208337cSdan  }
4500208337cSdan}
4510208337cSdan
4520208337cSdanreset_db
4530208337cSdando_execsql_test 14.5 {
4540208337cSdan  CREATE TABLE t1(a, b, c);
4550208337cSdan  CREATE VIEW v1 AS SELECT * FROM t1;
4560208337cSdan  CREATE TRIGGER xyz AFTER INSERT ON t1 BEGIN
4570208337cSdan    SELECT a, b FROM v1;
4580208337cSdan  END;
4590208337cSdan}
4600208337cSdando_execsql_test 14.6 {
4610208337cSdan  ALTER TABLE t1 RENAME TO tt1;
4620208337cSdan}
4630208337cSdan
4645351e884Sdan#-------------------------------------------------------------------------
4655351e884Sdanreset_db
4665351e884Sdando_execsql_test 15.0 {
4675351e884Sdan  CREATE TABLE t1(a integer NOT NULL PRIMARY KEY);
4685351e884Sdan  CREATE VIEW v1 AS SELECT a FROM t1;
4695351e884Sdan  CREATE TRIGGER tr1 INSTEAD OF INSERT ON v1 BEGIN
4705351e884Sdan    UPDATE t1 SET a = NEW.a;
4715351e884Sdan  END;
4725351e884Sdan  CREATE TRIGGER tr2 INSTEAD OF INSERT ON v1 BEGIN
4735351e884Sdan    SELECT new.a;
4745351e884Sdan  END;
4755351e884Sdan  CREATE TABLE t2 (b);
4765351e884Sdan}
4775351e884Sdan
4785351e884Sdando_execsql_test 15.1 {
4795351e884Sdan  INSERT INTO v1 VALUES(1);
4805351e884Sdan  ALTER TABLE t2 RENAME TO t3;
4815351e884Sdan}
4825351e884Sdan
4835351e884Sdando_execsql_test 15.2 {
4845351e884Sdan  CREATE TABLE x(f1 integer NOT NULL);
4855351e884Sdan  CREATE VIEW y AS SELECT f1 AS f1 FROM x;
4865351e884Sdan  CREATE TRIGGER t INSTEAD OF UPDATE OF f1 ON y BEGIN
4875351e884Sdan    UPDATE x SET f1 = NEW.f1;
4885351e884Sdan  END;
4895351e884Sdan  CREATE TABLE z (f1 integer NOT NULL PRIMARY KEY);
4905351e884Sdan  ALTER TABLE z RENAME TO z2;
4915351e884Sdan}
4925351e884Sdan
4935351e884Sdando_execsql_test 15.3 {
4945351e884Sdan  INSERT INTO x VALUES(1), (2), (3);
4955351e884Sdan  ALTER TABLE x RENAME f1 TO f2;
4965351e884Sdan  SELECT * FROM x;
4975351e884Sdan} {1 2 3}
4985351e884Sdan
4995351e884Sdando_execsql_test 15.4 {
5005351e884Sdan  UPDATE y SET f1 = 'x' WHERE f1 = 1;
5015351e884Sdan  SELECT * FROM x;
5025351e884Sdan} {x x x}
5035351e884Sdan
5045351e884Sdando_execsql_test 15.5 {
5055351e884Sdan  SELECT sql FROM sqlite_master WHERE name = 'y';
5065351e884Sdan} {{CREATE VIEW y AS SELECT f2 AS f1 FROM x}}
5070208337cSdan
508397a78d4Sdan#-------------------------------------------------------------------------
509397a78d4Sdan# Test that it is not possible to rename a shadow table in DEFENSIVE mode.
510397a78d4Sdan#
511397a78d4Sdanifcapable fts3 {
512397a78d4Sdan  proc vtab_command {method args} {
513397a78d4Sdan    switch -- $method {
514397a78d4Sdan      xConnect {
515397a78d4Sdan        if {[info exists ::vtab_connect_sql]} {
516397a78d4Sdan          execsql $::vtab_connect_sql
517397a78d4Sdan        }
518397a78d4Sdan        return "CREATE TABLE t1(a, b, c)"
519397a78d4Sdan      }
520397a78d4Sdan
521397a78d4Sdan      xBestIndex {
522397a78d4Sdan        set clist [lindex $args 0]
523397a78d4Sdan        if {[llength $clist]!=1} { error "unexpected constraint list" }
524397a78d4Sdan        catch { array unset C }
525397a78d4Sdan        array set C [lindex $clist 0]
526397a78d4Sdan        if {$C(usable)} {
527397a78d4Sdan          return "omit 0 cost 0 rows 1 idxnum 555 idxstr eq!"
528397a78d4Sdan        } else {
529397a78d4Sdan          return "cost 1000000 rows 0 idxnum 0 idxstr scan..."
530397a78d4Sdan        }
531397a78d4Sdan      }
532397a78d4Sdan    }
533397a78d4Sdan
534397a78d4Sdan    return {}
535397a78d4Sdan  }
536397a78d4Sdan
537397a78d4Sdan  register_tcl_module db
538397a78d4Sdan
539397a78d4Sdan  sqlite3_db_config db DEFENSIVE 1
540397a78d4Sdan
541397a78d4Sdan  do_execsql_test 16.0 {
542397a78d4Sdan    CREATE VIRTUAL TABLE y1 USING fts3;
543*ddfec00dSdrh    VACUUM;
544397a78d4Sdan  }
545397a78d4Sdan
546d0c51d1aSdrh  do_catchsql_test 16.10 {
547397a78d4Sdan    INSERT INTO y1_segments VALUES(1, X'1234567890');
548397a78d4Sdan  } {1 {table y1_segments may not be modified}}
549397a78d4Sdan
550d0c51d1aSdrh  do_catchsql_test 16.20 {
551d0c51d1aSdrh    DROP TABLE y1_segments;
552d0c51d1aSdrh  } {1 {table y1_segments may not be dropped}}
553d0c51d1aSdrh
554527cbd4aSdrh  do_catchsql_test 16.20 {
555527cbd4aSdrh    ALTER TABLE y1_segments RENAME TO abc;
556527cbd4aSdrh  } {1 {table y1_segments may not be altered}}
557527cbd4aSdrh  sqlite3_db_config db DEFENSIVE 0
558527cbd4aSdrh  do_catchsql_test 16.22 {
559527cbd4aSdrh    ALTER TABLE y1_segments RENAME TO abc;
560527cbd4aSdrh  } {0 {}}
561527cbd4aSdrh  sqlite3_db_config db DEFENSIVE 1
562527cbd4aSdrh  do_catchsql_test 16.23 {
563527cbd4aSdrh    CREATE TABLE y1_segments AS SELECT * FROM abc;
564527cbd4aSdrh  } {1 {object name reserved for internal use: y1_segments}}
565527cbd4aSdrh  do_catchsql_test 16.24 {
566527cbd4aSdrh    CREATE VIEW y1_segments AS SELECT * FROM abc;
567527cbd4aSdrh  } {1 {object name reserved for internal use: y1_segments}}
568527cbd4aSdrh  sqlite3_db_config db DEFENSIVE 0
569527cbd4aSdrh  do_catchsql_test 16.25 {
570527cbd4aSdrh    ALTER TABLE abc RENAME TO y1_segments;
571527cbd4aSdrh  } {0 {}}
572527cbd4aSdrh  sqlite3_db_config db DEFENSIVE 1
573527cbd4aSdrh
574d0c51d1aSdrh  do_execsql_test 16.30 {
575397a78d4Sdan    ALTER TABLE y1 RENAME TO z1;
576397a78d4Sdan  }
577397a78d4Sdan
578d0c51d1aSdrh  do_execsql_test 16.40 {
579397a78d4Sdan    SELECT * FROM z1_segments;
580397a78d4Sdan  }
581397a78d4Sdan}
5820208337cSdan
58365455fc6Sdan#-------------------------------------------------------------------------
58465455fc6Sdanreset_db
58565455fc6Sdando_execsql_test 17.0 {
58665455fc6Sdan  CREATE TABLE sqlite1234 (id integer);
58765455fc6Sdan  ALTER TABLE sqlite1234 RENAME TO User;
58865455fc6Sdan  SELECT name, sql FROM sqlite_master WHERE sql IS NOT NULL;
58965455fc6Sdan} {
59065455fc6Sdan  User {CREATE TABLE "User" (id integer)}
59165455fc6Sdan}
59265455fc6Sdan
593f9b0c451Sdan#-------------------------------------------------------------------------
594f9b0c451Sdanreset_db
595f9b0c451Sdando_execsql_test 18.1.0 {
596f9b0c451Sdan  CREATE TABLE t0 (c0 INTEGER, PRIMARY KEY(c0)) WITHOUT ROWID;
597f9b0c451Sdan}
598f9b0c451Sdando_execsql_test 18.1.1 {
599f9b0c451Sdan  ALTER TABLE t0 RENAME COLUMN c0 TO c1;
600f9b0c451Sdan}
601f9b0c451Sdando_execsql_test 18.1.2 {
602f9b0c451Sdan  SELECT sql FROM sqlite_master;
603f9b0c451Sdan} {{CREATE TABLE t0 (c1 INTEGER, PRIMARY KEY(c1)) WITHOUT ROWID}}
604f9b0c451Sdan
605f9b0c451Sdanreset_db
606f9b0c451Sdando_execsql_test 18.2.0 {
607f9b0c451Sdan  CREATE TABLE t0 (c0 INTEGER, PRIMARY KEY(c0));
608f9b0c451Sdan}
609f9b0c451Sdando_execsql_test 18.2.1 {
610f9b0c451Sdan  ALTER TABLE t0 RENAME COLUMN c0 TO c1;
611f9b0c451Sdan}
612f9b0c451Sdando_execsql_test 18.2.2 {
613f9b0c451Sdan  SELECT sql FROM sqlite_master;
614f9b0c451Sdan} {{CREATE TABLE t0 (c1 INTEGER, PRIMARY KEY(c1))}}
615f9b0c451Sdan
6160990c415Sdrh# 2020-02-23 ticket f50af3e8a565776b
6170990c415Sdrhreset_db
6180990c415Sdrhdo_execsql_test 19.100 {
6190990c415Sdrh  CREATE TABLE t1(x);
6200990c415Sdrh  CREATE VIEW t2 AS SELECT 1 FROM t1, (t1 AS a0, t1);
6210990c415Sdrh  ALTER TABLE t1 RENAME TO t3;
6220990c415Sdrh  SELECT sql FROM sqlite_master;
6230990c415Sdrh} {{CREATE TABLE "t3"(x)} {CREATE VIEW t2 AS SELECT 1 FROM "t3", ("t3" AS a0, "t3")}}
6240990c415Sdrhdo_execsql_test 19.110 {
6250990c415Sdrh  INSERT INTO t3(x) VALUES(123);
6260990c415Sdrh  SELECT * FROM t2;
6270990c415Sdrh} {1}
6280990c415Sdrhdo_execsql_test 19.120 {
6290990c415Sdrh  INSERT INTO t3(x) VALUES('xyz');
6300990c415Sdrh  SELECT * FROM t2;
6310990c415Sdrh} {1 1 1 1 1 1 1 1}
6320990c415Sdrh
633fb99e388Sdan# Ticket 4722bdab08cb14
634fb99e388Sdanreset_db
635fb99e388Sdando_execsql_test 20.0 {
636fb99e388Sdan  CREATE TABLE a(a);
637fb99e388Sdan  CREATE VIEW b AS SELECT(SELECT *FROM c JOIN a USING(d, a, a, a) JOIN a) IN();
638fb99e388Sdan}
639fb99e388Sdando_execsql_test 20.1 {
640fb99e388Sdan  ALTER TABLE a RENAME a TO e;
641fb99e388Sdan} {}
642fb99e388Sdan
6434db7ab53Sdanreset_db
6444db7ab53Sdando_execsql_test 21.0 {
6454db7ab53Sdan  CREATE TABLE a(b);
6464db7ab53Sdan  CREATE VIEW c AS
6474db7ab53Sdan      SELECT NULL INTERSECT
6484db7ab53Sdan      SELECT NULL ORDER BY
6494db7ab53Sdan      likelihood(NULL, (d, (SELECT c)));
6504db7ab53Sdan} {}
6514db7ab53Sdando_catchsql_test 21.1 {
6524db7ab53Sdan  SELECT likelihood(NULL, (d, (SELECT c)));
6534db7ab53Sdan} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
6544db7ab53Sdando_catchsql_test 21.2 {
6554db7ab53Sdan  SELECT * FROM c;
6564db7ab53Sdan} {1 {1st ORDER BY term does not match any column in the result set}}
6574db7ab53Sdan
6584db7ab53Sdando_catchsql_test 21.3 {
6594db7ab53Sdan  ALTER TABLE a RENAME TO e;
6604db7ab53Sdan} {1 {error in view c: 1st ORDER BY term does not match any column in the result set}}
6614db7ab53Sdan
662e3863b51Sdrh# After forum thread https://sqlite.org/forum/forumpost/ddbe1c7efa
663e3863b51Sdrh# Ensure that PRAGMA schema_version=N causes a full schema reload.
664e3863b51Sdrh#
665e3863b51Sdrhreset_db
666e3863b51Sdrhdo_execsql_test 22.0 {
667e3863b51Sdrh  CREATE TABLE t1(a INT, b TEXT NOT NULL);
668e3863b51Sdrh  INSERT INTO t1 VALUES(1,2),('a','b');
669e3863b51Sdrh  BEGIN;
670e3863b51Sdrh  PRAGMA writable_schema=ON;
671e3863b51Sdrh  UPDATE sqlite_schema SET sql='CREATE TABLE t1(a INT, b TEXT)' WHERE name LIKE 't1';
672e3863b51Sdrh  PRAGMA schema_version=1234;
673e3863b51Sdrh  COMMIT;
674e3863b51Sdrh  PRAGMA integrity_check;
675e3863b51Sdrh} {ok}
676e3863b51Sdrhdo_execsql_test 22.1 {
677e3863b51Sdrh  ALTER TABLE t1 ADD COLUMN c INT DEFAULT 78;
678e3863b51Sdrh  SELECT * FROM t1;
679e3863b51Sdrh} {1 2 78 a b 78}
6804db7ab53Sdan
681936a3059Sdan#-------------------------------------------------------------------------
682936a3059Sdanreset_db
683936a3059Sdandb collate compare64 compare64
684936a3059Sdan
685936a3059Sdando_execsql_test 23.1 {
686936a3059Sdan  CREATE TABLE gigo(a text);
687936a3059Sdan  CREATE TABLE idx(x text COLLATE compare64);
688936a3059Sdan  CREATE VIEW v1 AS SELECT * FROM idx WHERE x='abc';
689936a3059Sdan}
690936a3059Sdandb close
691936a3059Sdansqlite3 db test.db
692936a3059Sdan
693936a3059Sdando_execsql_test 23.2 {
694936a3059Sdan  alter table gigo rename to ggiiggoo;
695936a3059Sdan  alter table idx rename to idx2;
696936a3059Sdan}
697936a3059Sdan
698936a3059Sdando_execsql_test 23.3 {
699936a3059Sdan  SELECT sql FROM sqlite_master;
700936a3059Sdan} {
701936a3059Sdan  {CREATE TABLE "ggiiggoo"(a text)}
702936a3059Sdan  {CREATE TABLE "idx2"(x text COLLATE compare64)}
703936a3059Sdan  {CREATE VIEW v1 AS SELECT * FROM "idx2" WHERE x='abc'}
704936a3059Sdan}
705936a3059Sdan
706936a3059Sdando_execsql_test 23.4 {
707936a3059Sdan  ALTER TABLE idx2 RENAME x TO y;
708936a3059Sdan  SELECT sql FROM sqlite_master;
709936a3059Sdan} {
710936a3059Sdan  {CREATE TABLE "ggiiggoo"(a text)}
711936a3059Sdan  {CREATE TABLE "idx2"(y text COLLATE compare64)}
712936a3059Sdan  {CREATE VIEW v1 AS SELECT * FROM "idx2" WHERE y='abc'}
713936a3059Sdan}
714936a3059Sdan
71552a07531Sdan#-------------------------------------------------------------------------
71652a07531Sdan#
71752a07531Sdanreset_db
71852a07531Sdando_execsql_test 24.1.0 {
71952a07531Sdan  CREATE TABLE t1(a, b);
72052a07531Sdan  CREATE TRIGGER AFTER INSERT ON t1 BEGIN
72152a07531Sdan    INSERT INTO nosuchtable VALUES(new.a) ON CONFLICT(a) DO NOTHING;
72252a07531Sdan  END;
72352a07531Sdan}
72452a07531Sdando_catchsql_test 24.1.1 {
72552a07531Sdan  ALTER TABLE t1 RENAME TO t2;
72652a07531Sdan} {1 {error in trigger AFTER: no such table: main.nosuchtable}}
72752a07531Sdan
72852a07531Sdanreset_db
72952a07531Sdando_execsql_test 24.2.0 {
73052a07531Sdan  CREATE TABLE t1(a, b);
73152a07531Sdan  CREATE TRIGGER AFTER INSERT ON t1 BEGIN
73252a07531Sdan    INSERT INTO v1 VALUES(new.a) ON CONFLICT(a) DO NOTHING;
73352a07531Sdan  END;
73452a07531Sdan  CREATE VIEW v1 AS SELECT * FROM nosuchtable;
73552a07531Sdan}
73652a07531Sdando_catchsql_test 24.2.1 {
73752a07531Sdan  ALTER TABLE t1 RENAME TO t2;
73852a07531Sdan} {1 {error in trigger AFTER: no such table: main.nosuchtable}}
73952a07531Sdan
740f3d5a684Sdan#--------------------------------------------------------------------------
741f3d5a684Sdan#
742f3d5a684Sdanreset_db
743f3d5a684Sdando_execsql_test 25.1 {
744f3d5a684Sdan  CREATE TABLE xx(x);
745f3d5a684Sdan  CREATE VIEW v3(b) AS WITH b AS (SELECT b FROM (SELECT * FROM t2)) VALUES(1);
746f3d5a684Sdan}
747f3d5a684Sdan
748ada2323dSlarrybrifcapable json1&&vtab {
749f3d5a684Sdan  do_catchsql_test 25.2 {
750f3d5a684Sdan    ALTER TABLE json_each RENAME TO t4;
751971ae9f6Sdrh  } {1 {table json_each may not be altered}}
7523ff6a5edSlarrybr}
75352a07531Sdan
754736d11edSdrh# 2021-05-01 dbsqlfuzz bc17a306a09329bba0ecc61547077f6178bcf321
755736d11edSdrh# Remove a NEVER() inserted on 2019-12-09 that is reachable after all.
756736d11edSdrh#
757736d11edSdrhreset_db
758736d11edSdrhdo_execsql_test 26.1 {
759736d11edSdrh  CREATE TABLE t1(k,v);
760736d11edSdrh  CREATE TABLE t2_a(k,v);
761736d11edSdrh  CREATE VIEW t2 AS SELECT * FROM t2_a;
762736d11edSdrh  CREATE TRIGGER r2 AFTER INSERT ON t1 BEGIN
763736d11edSdrh    UPDATE t1
764736d11edSdrh       SET (k,v)=((WITH cte1(a) AS (SELECT 1 FROM t2) SELECT t2.k FROM t2, cte1),1);
765736d11edSdrh  END;
766736d11edSdrh  ALTER TABLE t1 RENAME TO t1x;
767736d11edSdrh  INSERT INTO t2_a VALUES(2,3);
768736d11edSdrh  INSERT INTO t1x VALUES(98,99);
769736d11edSdrh  SELECT * FROM t1x;
770736d11edSdrh} {2 1}
771736d11edSdrh
772be12083bSdan#-------------------------------------------------------------------------
773be12083bSdanreset_db
774be12083bSdan
775be12083bSdando_execsql_test 27.1 {
776be12083bSdan
777be12083bSdan create table t_sa (
778be12083bSdan c_muyat INTEGER NOT NULL,
779be12083bSdan c_d4u TEXT
780be12083bSdan );
781be12083bSdan
782be12083bSdan create table t2 ( abc );
783be12083bSdan
784be12083bSdan CREATE TRIGGER trig AFTER DELETE ON t_sa
785be12083bSdan   BEGIN
786be12083bSdan   DELETE FROM t_sa WHERE (
787be12083bSdan       SELECT 123 FROM t2
788be12083bSdan       WINDOW oamat7fzf AS ( PARTITION BY t_sa.c_d4u )
789be12083bSdan   );
790be12083bSdan   END;
791be12083bSdan}
792be12083bSdan
793be12083bSdando_execsql_test 27.2 {
794be12083bSdan  alter table t_sa rename column c_muyat to c_dg;
795be12083bSdan}
796be12083bSdan
797b56a0907Sdan#-------------------------------------------------------------------------
798b56a0907Sdanreset_db
79926d61e5aSdando_execsql_test 29.1 {
80026d61e5aSdan  CREATE TABLE t1(a, b, c);
80126d61e5aSdan  INSERT INTO t1 VALUES('a', 'b', 'c');
80226d61e5aSdan
80326d61e5aSdan  CREATE VIEW v0 AS
80426d61e5aSdan    WITH p AS ( SELECT 1 FROM t1 ),
80526d61e5aSdan         g AS ( SELECT 1 FROM p, t1 )
80626d61e5aSdan    SELECT 1 FROM g;
80726d61e5aSdan}
80826d61e5aSdan
80926d61e5aSdando_execsql_test 29.2 {
81026d61e5aSdan  SELECT * FROM v0
81126d61e5aSdan} 1
81226d61e5aSdan
81326d61e5aSdando_execsql_test 29.2 {
81426d61e5aSdan  ALTER TABLE t1 RENAME TO t2
81526d61e5aSdan}
81626d61e5aSdan
81726d61e5aSdando_execsql_test 29.3 {
81826d61e5aSdan  SELECT sql FROM sqlite_schema WHERE name='v0'
81926d61e5aSdan} {{CREATE VIEW v0 AS
82026d61e5aSdan    WITH p AS ( SELECT 1 FROM "t2" ),
82126d61e5aSdan         g AS ( SELECT 1 FROM p, "t2" )
82226d61e5aSdan    SELECT 1 FROM g}}
82326d61e5aSdan
82426d61e5aSdando_execsql_test 29.4 {
82526d61e5aSdan  CREATE VIEW v2 AS
82626d61e5aSdan    WITH p AS ( SELECT 1 FROM t2 ),
82726d61e5aSdan         g AS ( SELECT 1 FROM (
82826d61e5aSdan           WITH i AS (SELECT 1 FROM p, t2)
82926d61e5aSdan           SELECT * FROM i
83026d61e5aSdan         )
83126d61e5aSdan    )
83226d61e5aSdan    SELECT 1 FROM g;
83326d61e5aSdan}
83426d61e5aSdan
83526d61e5aSdando_execsql_test 29.4 {
83626d61e5aSdan    SELECT * FROM v2;
83726d61e5aSdan} 1
83826d61e5aSdan
83926d61e5aSdando_execsql_test 29.5 {
84026d61e5aSdan  ALTER TABLE t2 RENAME TO t3;
84126d61e5aSdan}
84226d61e5aSdan
84326d61e5aSdando_execsql_test 29.5 {
84426d61e5aSdan  SELECT sql FROM sqlite_schema WHERE name='v2'
84526d61e5aSdan} {{CREATE VIEW v2 AS
84626d61e5aSdan    WITH p AS ( SELECT 1 FROM "t3" ),
84726d61e5aSdan         g AS ( SELECT 1 FROM (
84826d61e5aSdan           WITH i AS (SELECT 1 FROM p, "t3")
84926d61e5aSdan           SELECT * FROM i
85026d61e5aSdan         )
85126d61e5aSdan    )
85226d61e5aSdan    SELECT 1 FROM g}}
85326d61e5aSdan
85426d61e5aSdan
85526d61e5aSdan#-------------------------------------------------------------------------
85626d61e5aSdanreset_db
857b56a0907Sdando_execsql_test 28.1 {
858b56a0907Sdan  CREATE TABLE t1(a);
859b56a0907Sdan  CREATE TABLE t2(b,c);
86026d61e5aSdan  CREATE TABLE t4(b,c);
861b56a0907Sdan  INSERT INTO t2 VALUES(1,2),(1,3),(2,5);
86226d61e5aSdan  INSERT INTO t4 VALUES(1,2),(1,3),(2,5);
86326d61e5aSdan
864b56a0907Sdan  CREATE VIEW v3 AS
865b56a0907Sdan    WITH RECURSIVE t3(x,y,z) AS (
86626d61e5aSdan        SELECT b,c,NULL FROM t4
867b56a0907Sdan        UNION
86826d61e5aSdan        SELECT x,y,NULL FROM t3, t2
869b56a0907Sdan    )
87026d61e5aSdan  SELECT * FROM t3 AS xyz;
871b56a0907Sdan}
872be12083bSdan
873b56a0907Sdando_execsql_test 28.2 {
874b56a0907Sdan  SELECT * FROM v3
875b56a0907Sdan} {
876b56a0907Sdan  1 2 {} 1 3 {} 2 5 {}
877b56a0907Sdan}
878be12083bSdan
879b56a0907Sdando_execsql_test 28.3 {
880b56a0907Sdan  ALTER TABLE t1 RENAME a TO a2; -- fails in v3
881b56a0907Sdan}
882be12083bSdan
88326d61e5aSdando_execsql_test 28.4 {
88426d61e5aSdan  ALTER TABLE t2 RENAME TO t5;
88526d61e5aSdan}
88626d61e5aSdan
88726d61e5aSdando_execsql_test 28.5 {
88826d61e5aSdan  SELECT sql FROM sqlite_schema WHERE name='v3'
88926d61e5aSdan} {{CREATE VIEW v3 AS
89026d61e5aSdan    WITH RECURSIVE t3(x,y,z) AS (
89126d61e5aSdan        SELECT b,c,NULL FROM t4
89226d61e5aSdan        UNION
89326d61e5aSdan        SELECT x,y,NULL FROM t3, "t5"
89426d61e5aSdan    )
89526d61e5aSdan  SELECT * FROM t3 AS xyz}}
89626d61e5aSdan
89726d61e5aSdan#-------------------------------------------------------------------------
89826d61e5aSdanreset_db
89926d61e5aSdando_execsql_test 30.0 {
90026d61e5aSdan  CREATE TABLE t1(a,b,c,d,e,f);
90126d61e5aSdan  CREATE TABLE t2(a,b,c);
90226d61e5aSdan  CREATE INDEX t1abc ON t1(a,b,c+d+e);
90326d61e5aSdan  CREATE VIEW v1(x,y) AS
90426d61e5aSdan    SELECT t1.b,t2.b FROM t1,t2 WHERE t1.a=t2.a
90526d61e5aSdan      GROUP BY 1 HAVING t2.c NOT NULL LIMIT 10;
90626d61e5aSdan  CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN 'no' NOT NULL BEGIN
90726d61e5aSdan    INSERT INTO t2(a,a,b,c) VALUES(new.b,new.a,new.c-7);
90826d61e5aSdan    WITH c1(x) AS (
90926d61e5aSdan      VALUES(0)
91026d61e5aSdan        UNION ALL
91126d61e5aSdan      SELECT current_time+x FROM c1 WHERE x
91226d61e5aSdan        UNION ALL
91326d61e5aSdan      SELECT 1+x FROM c1 WHERE x<1
91426d61e5aSdan    ), c2(x) AS (VALUES(0),(1))
91526d61e5aSdan    SELECT * FROM c1 AS x1, c2 AS x2, (
91626d61e5aSdan      SELECT x+1 FROM c1 WHERE x IS NOT TRUE
91726d61e5aSdan        UNION ALL
91826d61e5aSdan      SELECT 1+x FROM c1 WHERE 1<x
91926d61e5aSdan    ) AS x3, c2 x5;
92026d61e5aSdan  END;
92126d61e5aSdan}
92226d61e5aSdan
92326d61e5aSdando_execsql_test 30.1 {
92426d61e5aSdan  ALTER TABLE t1 RENAME TO t1x;
92526d61e5aSdan}
92626d61e5aSdan
92726d61e5aSdando_execsql_test 30.2 {
92826d61e5aSdan  SELECT sql FROM sqlite_schema ORDER BY rowid
92926d61e5aSdan} {
93026d61e5aSdan  {CREATE TABLE "t1x"(a,b,c,d,e,f)}
93126d61e5aSdan  {CREATE TABLE t2(a,b,c)}
93226d61e5aSdan  {CREATE INDEX t1abc ON "t1x"(a,b,c+d+e)}
93326d61e5aSdan  {CREATE VIEW v1(x,y) AS
93426d61e5aSdan    SELECT "t1x".b,t2.b FROM "t1x",t2 WHERE "t1x".a=t2.a
93526d61e5aSdan      GROUP BY 1 HAVING t2.c NOT NULL LIMIT 10}
93626d61e5aSdan  {CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN 'no' NOT NULL BEGIN
93726d61e5aSdan    INSERT INTO t2(a,a,b,c) VALUES(new.b,new.a,new.c-7);
93826d61e5aSdan    WITH c1(x) AS (
93926d61e5aSdan      VALUES(0)
94026d61e5aSdan        UNION ALL
94126d61e5aSdan      SELECT current_time+x FROM c1 WHERE x
94226d61e5aSdan        UNION ALL
94326d61e5aSdan      SELECT 1+x FROM c1 WHERE x<1
94426d61e5aSdan    ), c2(x) AS (VALUES(0),(1))
94526d61e5aSdan    SELECT * FROM c1 AS x1, c2 AS x2, (
94626d61e5aSdan      SELECT x+1 FROM c1 WHERE x IS NOT TRUE
94726d61e5aSdan        UNION ALL
94826d61e5aSdan      SELECT 1+x FROM c1 WHERE 1<x
94926d61e5aSdan    ) AS x3, c2 x5;
95026d61e5aSdan  END}
95126d61e5aSdan}
95226d61e5aSdan
953ac67f567Sdan#-------------------------------------------------------------------------
954ac67f567Sdanreset_db
955ac67f567Sdando_execsql_test 31.0 {
956ac67f567Sdan  CREATE TABLE t1(q);
957ac67f567Sdan  CREATE VIEW vvv AS WITH x AS (WITH y AS (SELECT * FROM x) SELECT 1) SELECT 1;
958ac67f567Sdan}
959ac67f567Sdan
960ac67f567Sdando_execsql_test 31.1 {
961ac67f567Sdan  SELECT * FROM vvv;
962ac67f567Sdan} {1}
963ac67f567Sdan
964ac67f567Sdando_execsql_test 31.2 {
965ac67f567Sdan  ALTER TABLE t1 RENAME TO t1x;
966ac67f567Sdan}
967ac67f567Sdan
968ac67f567Sdando_execsql_test 31.3 {
969ac67f567Sdan  ALTER TABLE t1x RENAME q TO x;
970ac67f567Sdan}
971ac67f567Sdan
9724d466698Sdrh# 2021-07-02 OSSFuzz https://oss-fuzz.com/testcase-detail/5517690440646656
9734d466698Sdrh# Bad assert() statement
9744d466698Sdrh#
9754d466698Sdrhreset_db
9764d466698Sdrhdo_catchsql_test 32.0 {
9774d466698Sdrh  CREATE TABLE t1(x);
9784d466698Sdrh  CREATE TRIGGER r1 BEFORE INSERT ON t1 BEGIN
9794d466698Sdrh    UPDATE t1 SET x=x FROM (SELECT*);
9804d466698Sdrh  END;
9814d466698Sdrh  ALTER TABLE t1 RENAME TO x;
9824d466698Sdrh} {1 {error in trigger r1: no tables specified}}
9834d466698Sdrh
9841d85c6bfSdanfinish_test
985