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