1cf8f2895Sdan# 2009 February 2 2cf8f2895Sdan# 3cf8f2895Sdan# The author disclaims copyright to this source code. In place of 4cf8f2895Sdan# a legal notice, here is a blessing: 5cf8f2895Sdan# 6cf8f2895Sdan# May you do good and not evil. 7cf8f2895Sdan# May you find forgiveness for yourself and forgive others. 8cf8f2895Sdan# May you share freely, never taking more than you give. 9cf8f2895Sdan# 10cf8f2895Sdan#************************************************************************* 11cf8f2895Sdan# This file implements regression tests for SQLite library. The 12cf8f2895Sdan# focus of this script is testing that SQLite can handle a subtle 13cf8f2895Sdan# file format change that may be used in the future to implement 14cf8f2895Sdan# "ALTER TABLE ... RENAME COLUMN ... TO". 15cf8f2895Sdan# 16cf8f2895Sdan 17cf8f2895Sdanset testdir [file dirname $argv0] 18cf8f2895Sdansource $testdir/tester.tcl 19cf8f2895Sdanset testprefix altercol 20cf8f2895Sdan 21cf8f2895Sdan# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. 22cf8f2895Sdanifcapable !altertable { 23cf8f2895Sdan finish_test 24cf8f2895Sdan return 25cf8f2895Sdan} 26cf8f2895Sdan 2724fedb94Sdan# Drop all the tables and views in the 'main' database of database connect 2824fedb94Sdan# [db]. Sort the objects by name before dropping them. 2924fedb94Sdan# 3024fedb94Sdanproc drop_all_tables_and_views {db} { 3124fedb94Sdan set SQL { 3224fedb94Sdan SELECT name, type FROM sqlite_master 3324fedb94Sdan WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' 3424fedb94Sdan ORDER BY 1 3524fedb94Sdan } 3624fedb94Sdan foreach {z t} [db eval $SQL] { 3724fedb94Sdan db eval "DROP $t $z" 3824fedb94Sdan } 3924fedb94Sdan} 4024fedb94Sdan 41cf8f2895Sdanforeach {tn before after} { 42cf8f2895Sdan 1 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB)} 43cf8f2895Sdan {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB)} 44cf8f2895Sdan 45cf8f2895Sdan 2 {CREATE TABLE t1(a INTEGER, x TEXT, "b" BLOB)} 46cf8f2895Sdan {CREATE TABLE t1(a INTEGER, x TEXT, "d" BLOB)} 47cf8f2895Sdan 48cf8f2895Sdan 3 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, CHECK(b!=''))} 49cf8f2895Sdan {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, CHECK(d!=''))} 50cf8f2895Sdan 51cf8f2895Sdan 4 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, CHECK(t1.b!=''))} 52cf8f2895Sdan {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, CHECK(t1.d!=''))} 53cf8f2895Sdan 54cf8f2895Sdan 5 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, CHECK( coalesce(b,c) ))} 55cf8f2895Sdan {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, CHECK( coalesce(d,c) ))} 56cf8f2895Sdan 57cf8f2895Sdan 6 {CREATE TABLE t1(a INTEGER, "b"TEXT, c BLOB, CHECK( coalesce(b,c) ))} 58cf8f2895Sdan {CREATE TABLE t1(a INTEGER, "d"TEXT, c BLOB, CHECK( coalesce(d,c) ))} 59cf8f2895Sdan 60cf8f2895Sdan 7 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, PRIMARY KEY(b, c))} 61cf8f2895Sdan {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, PRIMARY KEY(d, c))} 62cf8f2895Sdan 63cf8f2895Sdan 8 {CREATE TABLE t1(a INTEGER, b TEXT PRIMARY KEY, c BLOB)} 64cf8f2895Sdan {CREATE TABLE t1(a INTEGER, d TEXT PRIMARY KEY, c BLOB)} 65cf8f2895Sdan 66cf8f2895Sdan 9 {CREATE TABLE t1(a, b TEXT, c, PRIMARY KEY(a, b), UNIQUE("B"))} 67cf8f2895Sdan {CREATE TABLE t1(a, d TEXT, c, PRIMARY KEY(a, d), UNIQUE("d"))} 68cf8f2895Sdan 69cf8f2895Sdan 10 {CREATE TABLE t1(a, b, c); CREATE INDEX t1i ON t1(a, c)} 70cf8f2895Sdan {{CREATE TABLE t1(a, d, c)} {CREATE INDEX t1i ON t1(a, c)}} 71cf8f2895Sdan 72cf8f2895Sdan 11 {CREATE TABLE t1(a, b, c); CREATE INDEX t1i ON t1(b, c)} 73cf8f2895Sdan {{CREATE TABLE t1(a, d, c)} {CREATE INDEX t1i ON t1(d, c)}} 74cf8f2895Sdan 75cf8f2895Sdan 12 {CREATE TABLE t1(a, b, c); CREATE INDEX t1i ON t1(b+b+b+b, c) WHERE b>0} 76cf8f2895Sdan {{CREATE TABLE t1(a, d, c)} {CREATE INDEX t1i ON t1(d+d+d+d, c) WHERE d>0}} 77cf8f2895Sdan 78cf8f2895Sdan 13 {CREATE TABLE t1(a, b, c, FOREIGN KEY (b) REFERENCES t2)} 79cf8f2895Sdan {CREATE TABLE t1(a, d, c, FOREIGN KEY (d) REFERENCES t2)} 80cf8f2895Sdan 81987db767Sdan 14 {CREATE TABLE t1(a INTEGER, b TEXT, c BLOB, PRIMARY KEY(b))} 82987db767Sdan {CREATE TABLE t1(a INTEGER, d TEXT, c BLOB, PRIMARY KEY(d))} 83987db767Sdan 84987db767Sdan 15 {CREATE TABLE t1(a INTEGER, b INTEGER, c BLOB, PRIMARY KEY(b))} 85987db767Sdan {CREATE TABLE t1(a INTEGER, d INTEGER, c BLOB, PRIMARY KEY(d))} 86987db767Sdan 87987db767Sdan 16 {CREATE TABLE t1(a INTEGER, b INTEGER PRIMARY KEY, c BLOB)} 88987db767Sdan {CREATE TABLE t1(a INTEGER, d INTEGER PRIMARY KEY, c BLOB)} 89987db767Sdan 90f62e8937Sdan 17 {CREATE TABLE t1(a INTEGER, b INTEGER PRIMARY KEY, c BLOB, FOREIGN KEY (b) REFERENCES t2)} 91f62e8937Sdan {CREATE TABLE t1(a INTEGER, d INTEGER PRIMARY KEY, c BLOB, FOREIGN KEY (d) REFERENCES t2)} 92f62e8937Sdan 93cf8f2895Sdan} { 94cf8f2895Sdan reset_db 95cf8f2895Sdan do_execsql_test 1.$tn.0 $before 96cf8f2895Sdan 97cf8f2895Sdan do_execsql_test 1.$tn.1 { 98cf8f2895Sdan INSERT INTO t1 VALUES(1, 2, 3); 99cf8f2895Sdan } 100cf8f2895Sdan 101cf8f2895Sdan do_execsql_test 1.$tn.2 { 102cf8f2895Sdan ALTER TABLE t1 RENAME COLUMN b TO d; 103cf8f2895Sdan } 104cf8f2895Sdan 105cf8f2895Sdan do_execsql_test 1.$tn.3 { 106cf8f2895Sdan SELECT * FROM t1; 107cf8f2895Sdan } {1 2 3} 108cf8f2895Sdan 109cf8f2895Sdan if {[string first INDEX $before]>0} { 110cf8f2895Sdan set res $after 111cf8f2895Sdan } else { 112cf8f2895Sdan set res [list $after] 113cf8f2895Sdan } 114cf8f2895Sdan do_execsql_test 1.$tn.4 { 115cf8f2895Sdan SELECT sql FROM sqlite_master WHERE tbl_name='t1' AND sql!='' 116cf8f2895Sdan } $res 117cf8f2895Sdan} 118cf8f2895Sdan 119e9a2fa31Sdan#------------------------------------------------------------------------- 1206fe7f23fSdan# 121e9a2fa31Sdando_execsql_test 2.0 { 122e9a2fa31Sdan CREATE TABLE t3(a, b, c, d, e, f, g, h, i, j, k, l, m, FOREIGN KEY (b, c, d, e, f, g, h, i, j, k, l, m) REFERENCES t4); 123e9a2fa31Sdan} 124e9a2fa31Sdan 1255da06d3dSdansqlite3 db2 test.db 1265da06d3dSdando_execsql_test -db db2 2.1 { SELECT b FROM t3 } 1275da06d3dSdan 1285da06d3dSdando_execsql_test 2.2 { 129e9a2fa31Sdan ALTER TABLE t3 RENAME b TO biglongname; 130e9a2fa31Sdan SELECT sql FROM sqlite_master WHERE name='t3'; 131e9a2fa31Sdan} {{CREATE TABLE t3(a, biglongname, c, d, e, f, g, h, i, j, k, l, m, FOREIGN KEY (biglongname, c, d, e, f, g, h, i, j, k, l, m) REFERENCES t4)}} 132e9a2fa31Sdan 1335da06d3dSdando_execsql_test -db db2 2.3 { SELECT biglongname FROM t3 } 134cf8f2895Sdan 1356fe7f23fSdan#------------------------------------------------------------------------- 1366fe7f23fSdan# 1376fe7f23fSdando_execsql_test 3.0 { 1386fe7f23fSdan CREATE TABLE t4(x, y, z); 1396fe7f23fSdan CREATE TRIGGER ttt AFTER INSERT ON t4 WHEN new.y<0 BEGIN 1405be60c55Sdan SELECT x, y, z FROM t4; 1415be60c55Sdan DELETE FROM t4 WHERE y=32; 1425be60c55Sdan UPDATE t4 SET x=y+1, y=0 WHERE y=32; 1435be60c55Sdan INSERT INTO t4(x, y, z) SELECT 4, 5, 6 WHERE 0; 1446fe7f23fSdan END; 1456fe7f23fSdan INSERT INTO t4 VALUES(3, 2, 1); 1466fe7f23fSdan} 1476fe7f23fSdan 1486fe7f23fSdando_execsql_test 3.1 { 1496fe7f23fSdan ALTER TABLE t4 RENAME y TO abc; 1506fe7f23fSdan SELECT sql FROM sqlite_master WHERE name='t4'; 1516fe7f23fSdan} {{CREATE TABLE t4(x, abc, z)}} 1526fe7f23fSdan 1536fe7f23fSdando_execsql_test 3.2 { 1546fe7f23fSdan SELECT * FROM t4; 1556fe7f23fSdan} {3 2 1} 1566fe7f23fSdan 1575496d6a2Sdando_execsql_test 3.3 { INSERT INTO t4 VALUES(6, 5, 4); } {} 1586fe7f23fSdan 1595be60c55Sdando_execsql_test 3.4 { SELECT sql FROM sqlite_master WHERE type='trigger' } { 1605be60c55Sdan{CREATE TRIGGER ttt AFTER INSERT ON t4 WHEN new.abc<0 BEGIN 1615be60c55Sdan SELECT x, abc, z FROM t4; 1625be60c55Sdan DELETE FROM t4 WHERE abc=32; 1635be60c55Sdan UPDATE t4 SET x=abc+1, abc=0 WHERE abc=32; 1645be60c55Sdan INSERT INTO t4(x, abc, z) SELECT 4, 5, 6 WHERE 0; 1655be60c55Sdan END} 1665be60c55Sdan} 1675be60c55Sdan 1686fe7f23fSdan#------------------------------------------------------------------------- 1696fe7f23fSdan# 1706fe7f23fSdando_execsql_test 4.0 { 1716fe7f23fSdan CREATE TABLE c1(a, b, FOREIGN KEY (a, b) REFERENCES p1(c, d)); 1726fe7f23fSdan CREATE TABLE p1(c, d, PRIMARY KEY(c, d)); 1736fe7f23fSdan PRAGMA foreign_keys = 1; 1746fe7f23fSdan INSERT INTO p1 VALUES(1, 2); 1756fe7f23fSdan INSERT INTO p1 VALUES(3, 4); 1766fe7f23fSdan} 1776fe7f23fSdan 1786fe7f23fSdando_execsql_test 4.1 { 1796fe7f23fSdan ALTER TABLE p1 RENAME d TO "silly name"; 1806fe7f23fSdan SELECT sql FROM sqlite_master WHERE name IN ('c1', 'p1'); 1816fe7f23fSdan} { 1826fe7f23fSdan {CREATE TABLE c1(a, b, FOREIGN KEY (a, b) REFERENCES p1(c, "silly name"))} 1836fe7f23fSdan {CREATE TABLE p1(c, "silly name", PRIMARY KEY(c, "silly name"))} 1846fe7f23fSdan} 1856fe7f23fSdan 186e325ffedSdando_execsql_test 4.2 { INSERT INTO c1 VALUES(1, 2); } 1875da06d3dSdan 1885da06d3dSdando_execsql_test 4.3 { 1896fe7f23fSdan CREATE TABLE c2(a, b, FOREIGN KEY (a, b) REFERENCES p1); 1906fe7f23fSdan} 1916fe7f23fSdan 1925da06d3dSdando_execsql_test 4.4 { 1936fe7f23fSdan ALTER TABLE p1 RENAME "silly name" TO reasonable; 1946fe7f23fSdan SELECT sql FROM sqlite_master WHERE name IN ('c1', 'c2', 'p1'); 1956fe7f23fSdan} { 1966fe7f23fSdan {CREATE TABLE c1(a, b, FOREIGN KEY (a, b) REFERENCES p1(c, "reasonable"))} 1976fe7f23fSdan {CREATE TABLE p1(c, "reasonable", PRIMARY KEY(c, "reasonable"))} 1986fe7f23fSdan {CREATE TABLE c2(a, b, FOREIGN KEY (a, b) REFERENCES p1)} 1996fe7f23fSdan} 2006fe7f23fSdan 201872165f2Sdan#------------------------------------------------------------------------- 202872165f2Sdan 203872165f2Sdando_execsql_test 5.0 { 204872165f2Sdan CREATE TABLE t5(a, b, c); 205872165f2Sdan CREATE INDEX t5a ON t5(a); 206872165f2Sdan INSERT INTO t5 VALUES(1, 2, 3), (4, 5, 6); 207872165f2Sdan ANALYZE; 208872165f2Sdan} 209872165f2Sdan 210872165f2Sdando_execsql_test 5.1 { 211872165f2Sdan ALTER TABLE t5 RENAME b TO big; 212872165f2Sdan SELECT big FROM t5; 213872165f2Sdan} {2 5} 214872165f2Sdan 215872165f2Sdando_catchsql_test 6.1 { 216872165f2Sdan ALTER TABLE sqlite_stat1 RENAME tbl TO thetable; 217872165f2Sdan} {1 {table sqlite_stat1 may not be altered}} 218872165f2Sdan 219a8762ae2Sdan#------------------------------------------------------------------------- 220b0c7920dSdan# 221a8762ae2Sdando_execsql_test 6.0 { 222a8762ae2Sdan CREATE TABLE blob( 223a8762ae2Sdan rid INTEGER PRIMARY KEY, 224a8762ae2Sdan rcvid INTEGER, 225a8762ae2Sdan size INTEGER, 226a8762ae2Sdan uuid TEXT UNIQUE NOT NULL, 227a8762ae2Sdan content BLOB, 228a8762ae2Sdan CHECK( length(uuid)>=40 AND rid>0 ) 229a8762ae2Sdan ); 230a8762ae2Sdan} 231a8762ae2Sdan 232a8762ae2Sdando_execsql_test 6.1 { 233a8762ae2Sdan ALTER TABLE "blob" RENAME COLUMN "rid" TO "a1"; 234a8762ae2Sdan} 235a8762ae2Sdan 236404c3ba0Sdando_catchsql_test 6.2 { 237404c3ba0Sdan ALTER TABLE "blob" RENAME COLUMN "a1" TO [where]; 238404c3ba0Sdan} {0 {}} 239404c3ba0Sdan 240404c3ba0Sdando_execsql_test 6.3 { 241404c3ba0Sdan SELECT "where" FROM blob; 242404c3ba0Sdan} {} 243404c3ba0Sdan 2445496d6a2Sdan#------------------------------------------------------------------------- 245987db767Sdan# Triggers. 2465496d6a2Sdan# 247050398bdSdrhdb close 248050398bdSdrhdb2 close 2495496d6a2Sdanreset_db 2505496d6a2Sdando_execsql_test 7.0 { 2515496d6a2Sdan CREATE TABLE c(x); 2525496d6a2Sdan INSERT INTO c VALUES(0); 2535496d6a2Sdan CREATE TABLE t6("col a", "col b", "col c"); 2545496d6a2Sdan CREATE TRIGGER zzz AFTER UPDATE OF "col a", "col c" ON t6 BEGIN 2555496d6a2Sdan UPDATE c SET x=x+1; 2565496d6a2Sdan END; 2575496d6a2Sdan} 2585496d6a2Sdan 2595be60c55Sdando_execsql_test 7.1.1 { 2605496d6a2Sdan INSERT INTO t6 VALUES(0, 0, 0); 2615496d6a2Sdan UPDATE t6 SET "col c" = 1; 2625496d6a2Sdan SELECT * FROM c; 2635496d6a2Sdan} {1} 2645496d6a2Sdan 2655be60c55Sdando_execsql_test 7.1.2 { 2665496d6a2Sdan ALTER TABLE t6 RENAME "col c" TO "col 3"; 2675496d6a2Sdan} 2685496d6a2Sdan 2695be60c55Sdando_execsql_test 7.1.3 { 2705496d6a2Sdan UPDATE t6 SET "col 3" = 0; 2715496d6a2Sdan SELECT * FROM c; 2725496d6a2Sdan} {2} 2735496d6a2Sdan 274987db767Sdan#------------------------------------------------------------------------- 275987db767Sdan# Views. 276987db767Sdan# 277987db767Sdanreset_db 278987db767Sdando_execsql_test 8.0 { 279987db767Sdan CREATE TABLE a1(x INTEGER, y TEXT, z BLOB, PRIMARY KEY(x)); 280987db767Sdan CREATE TABLE a2(a, b, c); 281987db767Sdan CREATE VIEW v1 AS SELECT x, y, z FROM a1; 282987db767Sdan} 283cf8f2895Sdan 284987db767Sdando_execsql_test 8.1 { 285987db767Sdan ALTER TABLE a1 RENAME y TO yyy; 286987db767Sdan SELECT sql FROM sqlite_master WHERE type='view'; 287987db767Sdan} {{CREATE VIEW v1 AS SELECT x, yyy, z FROM a1}} 288987db767Sdan 289987db767Sdando_execsql_test 8.2.1 { 290987db767Sdan DROP VIEW v1; 291987db767Sdan CREATE VIEW v2 AS SELECT x, x+x, a, a+a FROM a1, a2; 292987db767Sdan} {} 293987db767Sdando_execsql_test 8.2.2 { 294987db767Sdan ALTER TABLE a1 RENAME x TO xxx; 295987db767Sdan} 296987db767Sdando_execsql_test 8.2.3 { 297987db767Sdan SELECT sql FROM sqlite_master WHERE type='view'; 298987db767Sdan} {{CREATE VIEW v2 AS SELECT xxx, xxx+xxx, a, a+a FROM a1, a2}} 299987db767Sdan 300987db767Sdando_execsql_test 8.3.1 { 301987db767Sdan DROP TABLE a2; 302987db767Sdan DROP VIEW v2; 303987db767Sdan CREATE TABLE a2(a INTEGER PRIMARY KEY, b, c); 304987db767Sdan CREATE VIEW v2 AS SELECT xxx, xxx+xxx, a, a+a FROM a1, a2; 305987db767Sdan} {} 306987db767Sdando_execsql_test 8.3.2 { 307987db767Sdan ALTER TABLE a1 RENAME xxx TO x; 308987db767Sdan} 309987db767Sdando_execsql_test 8.3.3 { 310987db767Sdan SELECT sql FROM sqlite_master WHERE type='view'; 311987db767Sdan} {{CREATE VIEW v2 AS SELECT x, x+x, a, a+a FROM a1, a2}} 312987db767Sdan 313987db767Sdando_execsql_test 8.4.0 { 314987db767Sdan CREATE TABLE b1(a, b, c); 315987db767Sdan CREATE TABLE b2(x, y, z); 316987db767Sdan} 317987db767Sdan 318987db767Sdando_execsql_test 8.4.1 { 319987db767Sdan CREATE VIEW vvv AS SELECT c+c || coalesce(c, c) FROM b1, b2 WHERE x=c GROUP BY c HAVING c>0; 320987db767Sdan ALTER TABLE b1 RENAME c TO "a;b"; 321987db767Sdan SELECT sql FROM sqlite_master WHERE name='vvv'; 322987db767Sdan} {{CREATE VIEW vvv AS SELECT "a;b"+"a;b" || coalesce("a;b", "a;b") FROM b1, b2 WHERE x="a;b" GROUP BY "a;b" HAVING "a;b">0}} 323987db767Sdan 324987db767Sdando_execsql_test 8.4.2 { 325987db767Sdan CREATE VIEW www AS SELECT b FROM b1 UNION ALL SELECT y FROM b2; 326987db767Sdan ALTER TABLE b1 RENAME b TO bbb; 327987db767Sdan SELECT sql FROM sqlite_master WHERE name='www'; 328987db767Sdan} {{CREATE VIEW www AS SELECT bbb FROM b1 UNION ALL SELECT y FROM b2}} 329987db767Sdan 330987db767Sdandb collate nocase {string compare} 331987db767Sdan 332987db767Sdando_execsql_test 8.4.3 { 333987db767Sdan CREATE VIEW xxx AS SELECT a FROM b1 UNION SELECT x FROM b2 ORDER BY 1 COLLATE nocase; 334987db767Sdan} 335987db767Sdan 336987db767Sdando_execsql_test 8.4.4 { 337987db767Sdan ALTER TABLE b2 RENAME x TO hello; 338987db767Sdan SELECT sql FROM sqlite_master WHERE name='xxx'; 339987db767Sdan} {{CREATE VIEW xxx AS SELECT a FROM b1 UNION SELECT hello FROM b2 ORDER BY 1 COLLATE nocase}} 340987db767Sdan 34124fedb94Sdando_catchsql_test 8.4.5 { 342987db767Sdan CREATE VIEW zzz AS SELECT george, ringo FROM b1; 343987db767Sdan ALTER TABLE b1 RENAME a TO aaa; 3440d5fa6b9Sdan} {1 {error in view zzz: no such column: george}} 345987db767Sdan 3460cbb0b11Sdan#------------------------------------------------------------------------- 3470cbb0b11Sdan# More triggers. 3480cbb0b11Sdan# 349dabc268fSdanproc do_rename_column_test {tn old new lSchema} { 350499b8254Sdan for {set i 0} {$i < 2} {incr i} { 35124fedb94Sdan drop_all_tables_and_views db 352499b8254Sdan 353dabc268fSdan set lSorted [list] 354dabc268fSdan foreach sql $lSchema { 355dabc268fSdan execsql $sql 356dabc268fSdan lappend lSorted [string trim $sql] 357dabc268fSdan } 358dabc268fSdan set lSorted [lsort $lSorted] 359dabc268fSdan 360499b8254Sdan do_execsql_test $tn.$i.1 { 361dabc268fSdan SELECT sql FROM sqlite_master WHERE sql!='' ORDER BY 1 362dabc268fSdan } $lSorted 363dabc268fSdan 36424fedb94Sdan if {$i==1} { 365499b8254Sdan db close 366499b8254Sdan sqlite3 db test.db 367499b8254Sdan } 368dabc268fSdan 369499b8254Sdan do_execsql_test $tn.$i.2 "ALTER TABLE t1 RENAME $old TO $new" 370499b8254Sdan 371499b8254Sdan do_execsql_test $tn.$i.3 { 372dabc268fSdan SELECT sql FROM sqlite_master ORDER BY 1 373dabc268fSdan } [string map [list $old $new] $lSorted] 374dabc268fSdan } 375499b8254Sdan} 376dabc268fSdan 3770cbb0b11Sdanforeach {tn old new lSchema} { 3780cbb0b11Sdan 1 _x_ _xxx_ { 3790cbb0b11Sdan { CREATE TABLE t1(a, b, _x_) } 3800cbb0b11Sdan { CREATE TRIGGER AFTER INSERT ON t1 BEGIN 3810cbb0b11Sdan SELECT _x_ FROM t1; 3820cbb0b11Sdan END } 3830cbb0b11Sdan } 3840cbb0b11Sdan 3850cbb0b11Sdan 2 _x_ _xxx_ { 3860cbb0b11Sdan { CREATE TABLE t1(a, b, _x_) } 3870cbb0b11Sdan { CREATE TABLE t2(c, d, e) } 3880cbb0b11Sdan { CREATE TRIGGER ttt AFTER INSERT ON t2 BEGIN 3890cbb0b11Sdan SELECT _x_ FROM t1; 3900cbb0b11Sdan END } 3910cbb0b11Sdan } 3920cbb0b11Sdan 3930cbb0b11Sdan 3 _x_ _xxx_ { 3940cbb0b11Sdan { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } 3950cbb0b11Sdan { CREATE TABLE t2(c, d, e) } 3960cbb0b11Sdan { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN 3970cbb0b11Sdan INSERT INTO t2 VALUES(new.a, new.b, new._x_); 3980cbb0b11Sdan END } 3990cbb0b11Sdan } 4000cbb0b11Sdan 4010cbb0b11Sdan 4 _x_ _xxx_ { 4020cbb0b11Sdan { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } 4030cbb0b11Sdan { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN 4040cbb0b11Sdan INSERT INTO t1 VALUES(new.a, new.b, new._x_) 4050cbb0b11Sdan ON CONFLICT (_x_) WHERE _x_>10 DO UPDATE SET _x_ = _x_+1; 4060cbb0b11Sdan END } 4070cbb0b11Sdan } 408b013738bSdan 409b013738bSdan 4 _x_ _xxx_ { 410b013738bSdan { CREATE TABLE t1(a, b, _x_ INTEGER, PRIMARY KEY(_x_), CHECK(_x_>0)) } 411b013738bSdan { CREATE TRIGGER ttt AFTER UPDATE ON t1 BEGIN 412b013738bSdan INSERT INTO t1 VALUES(new.a, new.b, new._x_) 413b013738bSdan ON CONFLICT (_x_) WHERE _x_>10 DO NOTHING; 414b013738bSdan END } 415b013738bSdan } 4160cbb0b11Sdan} { 417dabc268fSdan do_rename_column_test 9.$tn $old $new $lSchema 4180cbb0b11Sdan} 4190cbb0b11Sdan 420dabc268fSdan#------------------------------------------------------------------------- 421dabc268fSdan# Test that views can be edited even if there are missing collation 422dabc268fSdan# sequences or user defined functions. 423dabc268fSdan# 4240cbb0b11Sdanreset_db 425987db767Sdan 4267ea1edb7Sdanifcapable vtab { 427dabc268fSdan foreach {tn old new lSchema} { 428dabc268fSdan 1 _x_ _xxx_ { 429dabc268fSdan { CREATE TABLE t1(a, b, _x_) } 430499b8254Sdan { CREATE VIEW s1 AS SELECT a, b, _x_ FROM t1 WHERE _x_='abc' COLLATE xyz } 431dabc268fSdan } 432dabc268fSdan 433dabc268fSdan 2 _x_ _xxx_ { 434dabc268fSdan { CREATE TABLE t1(a, b, _x_) } 435dabc268fSdan { CREATE VIEW v1 AS SELECT a, b, _x_ FROM t1 WHERE scalar(_x_) } 436dabc268fSdan } 437dabc268fSdan 438dabc268fSdan 3 _x_ _xxx_ { 439dabc268fSdan { CREATE TABLE t1(a, b, _x_) } 440dabc268fSdan { CREATE VIEW v1 AS SELECT a, b, _x_ FROM t1 WHERE _x_ = unicode(1, 2, 3) } 441dabc268fSdan } 442499b8254Sdan 443499b8254Sdan 4 _x_ _xxx_ { 444499b8254Sdan { CREATE TABLE t1(a, b, _x_) } 445499b8254Sdan { CREATE VIRTUAL TABLE e1 USING echo(t1) } 446499b8254Sdan } 447dabc268fSdan } { 448499b8254Sdan register_echo_module db 449dabc268fSdan do_rename_column_test 10.$tn $old $new $lSchema 450dabc268fSdan } 451dabc268fSdan 45224fedb94Sdan #-------------------------------------------------------------------------- 45324fedb94Sdan # Test that if a view or trigger refers to a virtual table for which the 45424fedb94Sdan # module is not available, RENAME COLUMN cannot proceed. 45524fedb94Sdan # 45624fedb94Sdan reset_db 45724fedb94Sdan register_echo_module db 45824fedb94Sdan do_execsql_test 11.0 { 45924fedb94Sdan CREATE TABLE x1(a, b, c); 46024fedb94Sdan CREATE VIRTUAL TABLE e1 USING echo(x1); 46124fedb94Sdan } 46224fedb94Sdan db close 46324fedb94Sdan sqlite3 db test.db 46424fedb94Sdan 46524fedb94Sdan do_execsql_test 11.1 { 46624fedb94Sdan ALTER TABLE x1 RENAME b TO bbb; 46724fedb94Sdan SELECT sql FROM sqlite_master; 46824fedb94Sdan } { {CREATE TABLE x1(a, bbb, c)} {CREATE VIRTUAL TABLE e1 USING echo(x1)} } 46924fedb94Sdan 47024fedb94Sdan do_execsql_test 11.2 { 47124fedb94Sdan CREATE VIEW v1 AS SELECT e1.*, x1.c FROM e1, x1; 47224fedb94Sdan } 47324fedb94Sdan 47424fedb94Sdan do_catchsql_test 11.3 { 47524fedb94Sdan ALTER TABLE x1 RENAME c TO ccc; 4760d5fa6b9Sdan } {1 {error in view v1: no such module: echo}} 4777ea1edb7Sdan} 478dabc268fSdan 4799d70557eSdan#------------------------------------------------------------------------- 4809d70557eSdan# Test some error conditions: 4819d70557eSdan# 4829d70557eSdan# 1. Renaming a column of a system table, 4839d70557eSdan# 2. Renaming a column of a VIEW, 4849d70557eSdan# 3. Renaming a column of a virtual table. 485b013738bSdan# 4. Renaming a column that does not exist. 486b013738bSdan# 5. Renaming a column of a table that does not exist. 4879d70557eSdan# 4889d70557eSdanreset_db 4899d70557eSdando_execsql_test 12.1.1 { 4909d70557eSdan CREATE TABLE t1(a, b); 4919d70557eSdan CREATE INDEX t1a ON t1(a); 4929d70557eSdan INSERT INTO t1 VALUES(1, 1), (2, 2), (3, 4); 4939d70557eSdan ANALYZE; 4949d70557eSdan} 4959d70557eSdando_catchsql_test 12.1.2 { 4969d70557eSdan ALTER TABLE sqlite_stat1 RENAME idx TO theindex; 4979d70557eSdan} {1 {table sqlite_stat1 may not be altered}} 4989d70557eSdando_execsql_test 12.1.3 { 4999d70557eSdan SELECT sql FROM sqlite_master WHERE tbl_name = 'sqlite_stat1' 5009d70557eSdan} {{CREATE TABLE sqlite_stat1(tbl,idx,stat)}} 5019d70557eSdan 5029d70557eSdando_execsql_test 12.2.1 { 5039d70557eSdan CREATE VIEW v1 AS SELECT * FROM t1; 5049d70557eSdan CREATE VIEW v2(c, d) AS SELECT * FROM t1; 5059d70557eSdan} 5069d70557eSdando_catchsql_test 12.2.2 { 5079d70557eSdan ALTER TABLE v1 RENAME a TO z; 50879a5ee93Sdrh} {1 {cannot rename columns of view "v1"}} 5099d70557eSdando_catchsql_test 12.2.3 { 5109d70557eSdan ALTER TABLE v2 RENAME c TO y; 51179a5ee93Sdrh} {1 {cannot rename columns of view "v2"}} 5129d70557eSdan 5139d70557eSdanifcapable fts5 { 5149d70557eSdan do_execsql_test 12.3.1 { 5159d70557eSdan CREATE VIRTUAL TABLE ft USING fts5(a, b, c); 5169d70557eSdan } 517b013738bSdan do_catchsql_test 12.3.2 { 5189d70557eSdan ALTER TABLE ft RENAME a TO z; 519b87a9a8aSdan } {1 {cannot rename columns of virtual table "ft"}} 5209d70557eSdan} 5219d70557eSdan 522b013738bSdando_execsql_test 12.4.1 { 523b013738bSdan CREATE TABLE t2(x, y, z); 524b013738bSdan} 525b013738bSdando_catchsql_test 12.4.2 { 526b013738bSdan ALTER TABLE t2 RENAME COLUMN a TO b; 527b013738bSdan} {1 {no such column: "a"}} 528b013738bSdan 529b013738bSdando_catchsql_test 12.5.1 { 530b013738bSdan ALTER TABLE t3 RENAME COLUMN a TO b; 531b013738bSdan} {1 {no such table: t3}} 532b013738bSdan 533b013738bSdan#------------------------------------------------------------------------- 534b013738bSdan# Test the effect of some parse/resolve errors. 535b013738bSdan# 536b013738bSdanreset_db 537b013738bSdando_execsql_test 13.1.1 { 538b013738bSdan CREATE TABLE x1(i INTEGER, t TEXT UNIQUE); 539b013738bSdan CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 540b013738bSdan SELECT * FROM nosuchtable; 541b013738bSdan END; 542b013738bSdan} 543b013738bSdan 544b013738bSdando_catchsql_test 13.1.2 { 545b013738bSdan ALTER TABLE x1 RENAME COLUMN t TO ttt; 5460d5fa6b9Sdan} {1 {error in trigger tr1: no such table: main.nosuchtable}} 547b013738bSdan 548b013738bSdando_execsql_test 13.1.3 { 549b013738bSdan DROP TRIGGER tr1; 550b013738bSdan CREATE INDEX x1i ON x1(i); 551b013738bSdan SELECT sql FROM sqlite_master WHERE name='x1i'; 552b013738bSdan} {{CREATE INDEX x1i ON x1(i)}} 553b013738bSdan 5546ab91a7aSdrhsqlite3_db_config db DEFENSIVE 0 555b013738bSdando_execsql_test 13.1.4 { 5565a80050dSdrh PRAGMA writable_schema = ON; 557b013738bSdan UPDATE sqlite_master SET sql = 'CREATE INDEX x1i ON x1(j)' WHERE name='x1i'; 5585a80050dSdrh PRAGMA writable_schema = OFF; 559b013738bSdan} {} 560b013738bSdan 561b013738bSdando_catchsql_test 13.1.5 { 562b013738bSdan ALTER TABLE x1 RENAME COLUMN t TO ttt; 5630d5fa6b9Sdan} {1 {error in index x1i: no such column: j}} 564b013738bSdan 565b013738bSdando_execsql_test 13.1.6 { 5665a80050dSdrh PRAGMA writable_schema = ON; 567b013738bSdan UPDATE sqlite_master SET sql = '' WHERE name='x1i'; 5685a80050dSdrh PRAGMA writable_schema = OFF; 569b013738bSdan} {} 570b013738bSdan 571b013738bSdando_catchsql_test 13.1.7 { 572b013738bSdan ALTER TABLE x1 RENAME COLUMN t TO ttt; 5732ad080aaSdan} {1 {error in index x1i: }} 574b013738bSdan 575b013738bSdando_execsql_test 13.1.8 { 5765a80050dSdrh PRAGMA writable_schema = ON; 577b013738bSdan DELETE FROM sqlite_master WHERE name = 'x1i'; 5785a80050dSdrh PRAGMA writable_schema = OFF; 579b013738bSdan} 580b013738bSdan 581b013738bSdando_execsql_test 13.2.0 { 582b013738bSdan CREATE TABLE data(x UNIQUE, y, z); 583b013738bSdan} 584b013738bSdanforeach {tn trigger error} { 585b013738bSdan 1 { 586b013738bSdan CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 587b013738bSdan UPDATE data SET x=x+1 WHERE zzz=new.i; 588b013738bSdan END; 589b013738bSdan } {no such column: zzz} 590b013738bSdan 591b013738bSdan 2 { 592b013738bSdan CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 593b013738bSdan INSERT INTO data(x, y) VALUES(new.i, new.t, 1) 594b013738bSdan ON CONFLICT (x) DO UPDATE SET z=zz+1; 595b013738bSdan END; 596b013738bSdan } {no such column: zz} 597b013738bSdan 598b013738bSdan 3 { 599b013738bSdan CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 600b013738bSdan INSERT INTO x1(i, t) VALUES(new.i+1, new.t||'1') 601b013738bSdan ON CONFLICT (tttttt) DO UPDATE SET t=i+1; 602b013738bSdan END; 603b013738bSdan } {no such column: tttttt} 604b013738bSdan 60506249398Sdan 4 { 60606249398Sdan CREATE TRIGGER tr1 AFTER INSERT ON x1 BEGIN 60706249398Sdan INSERT INTO nosuchtable VALUES(new.i, new.t); 60806249398Sdan END; 60906249398Sdan } {no such table: main.nosuchtable} 610b013738bSdan} { 611b013738bSdan do_execsql_test 13.2.$tn.1 " 612b013738bSdan DROP TRIGGER IF EXISTS tr1; 613b013738bSdan $trigger 614b013738bSdan " 615b013738bSdan 616b013738bSdan do_catchsql_test 13.2.$tn.2 { 617b013738bSdan ALTER TABLE x1 RENAME COLUMN t TO ttt; 6180d5fa6b9Sdan } "1 {error in trigger tr1: $error}" 619b013738bSdan} 620b013738bSdan 621b013738bSdan#------------------------------------------------------------------------- 622b013738bSdan# Passing invalid parameters directly to sqlite_rename_column(). 623b013738bSdan# 624171c50ecSdrhsqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db 625b013738bSdando_execsql_test 14.1 { 626b013738bSdan CREATE TABLE ddd(sql, type, object, db, tbl, icol, znew, bquote); 627b013738bSdan INSERT INTO ddd VALUES( 628b013738bSdan 'CREATE TABLE x1(i INTEGER, t TEXT)', 629b013738bSdan 'table', 'x1', 'main', 'x1', -1, 'zzz', 0 630b013738bSdan ), ( 631b013738bSdan 'CREATE TABLE x1(i INTEGER, t TEXT)', 632b013738bSdan 'table', 'x1', 'main', 'x1', 2, 'zzz', 0 633b013738bSdan ), ( 634b013738bSdan 'CREATE TABLE x1(i INTEGER, t TEXT)', 635b013738bSdan 'table', 'x1', 'main', 'notable', 0, 'zzz', 0 636b87a9a8aSdan ), ( 637b87a9a8aSdan 'CREATE TABLE x1(i INTEGER, t TEXT)', 638b87a9a8aSdan 'table', 'x1', 'main', 'ddd', -1, 'zzz', 0 639b013738bSdan ); 640b013738bSdan} {} 641b013738bSdan 642b013738bSdando_execsql_test 14.2 { 643b013738bSdan SELECT 644b87a9a8aSdan sqlite_rename_column(sql, type, object, db, tbl, icol, znew, bquote, 0) 645b013738bSdan FROM ddd; 646b87a9a8aSdan} {{} {} {} {}} 647171c50ecSdrhsqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db 648eea8eb6dSdrh 649eea8eb6dSdrh# If the INTERNAL_FUNCTIONS test-control is disabled (which is the default) 650eea8eb6dSdrh# then the sqlite_rename_table() SQL function is not accessible to 651eea8eb6dSdrh# ordinary SQL. 652eea8eb6dSdrh# 653eea8eb6dSdrhdo_catchsql_test 14.3 { 654eea8eb6dSdrh SELECT sqlite_rename_column(0,0,0,0,0,0,0,0,0); 655eea8eb6dSdrh} {1 {no such function: sqlite_rename_column}} 656b013738bSdan 6571b0c5de4Sdan#------------------------------------------------------------------------- 6581b0c5de4Sdan# 6591b0c5de4Sdanreset_db 6601b0c5de4Sdando_execsql_test 15.0 { 6611b0c5de4Sdan CREATE TABLE xxx(a, b, c); 6621b0c5de4Sdan SELECT a AS d FROM xxx WHERE d=0; 6631b0c5de4Sdan} 6641b0c5de4Sdan 6651b0c5de4Sdando_execsql_test 15.1 { 6661b0c5de4Sdan CREATE VIEW vvv AS SELECT a AS d FROM xxx WHERE d=0; 6671b0c5de4Sdan ALTER TABLE xxx RENAME a TO xyz; 6681b0c5de4Sdan} 6691b0c5de4Sdan 6701b0c5de4Sdando_execsql_test 15.2 { 6711b0c5de4Sdan SELECT sql FROM sqlite_master WHERE type='view'; 6721b0c5de4Sdan} {{CREATE VIEW vvv AS SELECT xyz AS d FROM xxx WHERE d=0}} 673b013738bSdan 6740d5fa6b9Sdan#------------------------------------------------------------------------- 6750d5fa6b9Sdan# 6769d324823Sdando_execsql_test 16.1.0 { 6770d5fa6b9Sdan CREATE TABLE t1(a,b,c); 6780d5fa6b9Sdan CREATE TABLE t2(d,e,f); 6790d5fa6b9Sdan INSERT INTO t1 VALUES(1,2,3); 6800d5fa6b9Sdan INSERT INTO t2 VALUES(4,5,6); 6810d5fa6b9Sdan CREATE VIEW v4 AS SELECT a, d FROM t1, t2; 6820d5fa6b9Sdan SELECT * FROM v4; 6830d5fa6b9Sdan} {1 4} 6840d5fa6b9Sdan 6859d324823Sdando_catchsql_test 16.1.1 { 6860d5fa6b9Sdan ALTER TABLE t2 RENAME d TO a; 6870d5fa6b9Sdan} {1 {error in view v4 after rename: ambiguous column name: a}} 6880d5fa6b9Sdan 6899d324823Sdando_execsql_test 16.1.2 { 6900d5fa6b9Sdan SELECT * FROM v4; 6910d5fa6b9Sdan} {1 4} 6920d5fa6b9Sdan 6939d324823Sdando_execsql_test 16.1.3 { 69485a9d508Sdan CREATE UNIQUE INDEX t2d ON t2(d); 69585a9d508Sdan CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN 69685a9d508Sdan INSERT INTO t2 VALUES(new.a, new.b, new.c) 69785a9d508Sdan ON CONFLICT(d) DO UPDATE SET f = excluded.f; 69885a9d508Sdan END; 69985a9d508Sdan} 70085a9d508Sdan 7019d324823Sdando_execsql_test 16.1.4 { 70285a9d508Sdan INSERT INTO t1 VALUES(4, 8, 456); 70385a9d508Sdan SELECT * FROM t2; 70485a9d508Sdan} {4 5 456} 70585a9d508Sdan 7069d324823Sdando_execsql_test 16.1.5 { 70785a9d508Sdan ALTER TABLE t2 RENAME COLUMN f TO "big f"; 70885a9d508Sdan INSERT INTO t1 VALUES(4, 0, 20456); 70985a9d508Sdan SELECT * FROM t2; 71085a9d508Sdan} {4 5 20456} 7110d5fa6b9Sdan 7129d324823Sdando_execsql_test 16.1.6 { 713aa42e981Sdan ALTER TABLE t1 RENAME COLUMN c TO "big c"; 714aa42e981Sdan INSERT INTO t1 VALUES(4, 0, 0); 715aa42e981Sdan SELECT * FROM t2; 716aa42e981Sdan} {4 5 0} 717aa42e981Sdan 7189d324823Sdando_execsql_test 16.2.1 { 7199d324823Sdan CREATE VIEW temp.v5 AS SELECT "big c" FROM t1; 7209d324823Sdan SELECT * FROM v5; 7219d324823Sdan} {3 456 20456 0} 7229d324823Sdan 7239d324823Sdando_execsql_test 16.2.2 { 7249d324823Sdan ALTER TABLE t1 RENAME COLUMN "big c" TO reallybigc; 7259d324823Sdan} {} 7269d324823Sdan 7279d324823Sdando_execsql_test 16.2.3 { 7289d324823Sdan SELECT * FROM v5; 7299d324823Sdan} {3 456 20456 0} 7309d324823Sdan 731b87a9a8aSdan#------------------------------------------------------------------------- 732b87a9a8aSdan# 733b87a9a8aSdando_execsql_test 17.0 { 734b87a9a8aSdan CREATE TABLE u7(x, y, z); 735b87a9a8aSdan CREATE TRIGGER u7t AFTER INSERT ON u7 BEGIN 736b87a9a8aSdan INSERT INTO u8 VALUES(new.x, new.y, new.z); 737b87a9a8aSdan END; 738b87a9a8aSdan} {} 739b87a9a8aSdando_catchsql_test 17.1 { 740b87a9a8aSdan ALTER TABLE u7 RENAME x TO xxx; 741b87a9a8aSdan} {1 {error in trigger u7t: no such table: main.u8}} 742b87a9a8aSdan 743b87a9a8aSdando_execsql_test 17.2 { 744b87a9a8aSdan CREATE TEMP TABLE uu7(x, y, z); 745b87a9a8aSdan CREATE TRIGGER uu7t AFTER INSERT ON uu7 BEGIN 746b87a9a8aSdan INSERT INTO u8 VALUES(new.x, new.y, new.z); 747b87a9a8aSdan END; 748b87a9a8aSdan} {} 749b87a9a8aSdando_catchsql_test 17.3 { 750b87a9a8aSdan ALTER TABLE uu7 RENAME x TO xxx; 751b87a9a8aSdan} {1 {error in trigger uu7t: no such table: u8}} 752b87a9a8aSdan 753b87a9a8aSdanreset_db 754b87a9a8aSdanforcedelete test.db2 755b87a9a8aSdando_execsql_test 18.0 { 756b87a9a8aSdan ATTACH 'test.db2' AS aux; 757b87a9a8aSdan CREATE TABLE t1(a); 758b87a9a8aSdan CREATE TABLE aux.log(v); 759b87a9a8aSdan CREATE TEMP TRIGGER tr1 AFTER INSERT ON t1 BEGIN 760b87a9a8aSdan INSERT INTO log VALUES(new.a); 761b87a9a8aSdan END; 762b87a9a8aSdan INSERT INTO t1 VALUES(111); 763b87a9a8aSdan SELECT v FROM log; 764b87a9a8aSdan} {111} 765b87a9a8aSdan 766b87a9a8aSdando_execsql_test 18.1 { 767b87a9a8aSdan ALTER TABLE t1 RENAME a TO b; 768b87a9a8aSdan} 769b87a9a8aSdan 770e8ab40d2Sdanreset_db 771e8ab40d2Sdando_execsql_test 19.0 { 772e8ab40d2Sdan CREATE TABLE t1(a, b); 773e8ab40d2Sdan CREATE TABLE t2(c, d); 774e8ab40d2Sdan CREATE VIEW v2(e) AS SELECT coalesce(t2.c,t1.a) FROM t1, t2 WHERE t1.b=t2.d; 775e8ab40d2Sdan} 776e8ab40d2Sdan 777e8ab40d2Sdando_execsql_test 19.1 { 778e8ab40d2Sdan ALTER TABLE t1 RENAME a TO f; 779e8ab40d2Sdan SELECT sql FROM sqlite_master WHERE name = 'v2'; 780e8ab40d2Sdan} { 781e8ab40d2Sdan {CREATE VIEW v2(e) AS SELECT coalesce(t2.c,t1.f) FROM t1, t2 WHERE t1.b=t2.d} 782e8ab40d2Sdan} 783e8ab40d2Sdan 784885eeb67Sdrh# 2019-01-08: https://www.sqlite.org/src/tktview/bc8d94f0fbd633fd9a051e3 785885eeb67Sdrh# 786885eeb67Sdrh# ALTER TABLE RENAME COLUMN does not work for tables that have redundant 787885eeb67Sdrh# UNIQUE constraints. 788885eeb67Sdrh# 789885eeb67Sdrhsqlite3 db :memory: 790885eeb67Sdrhdo_execsql_test 20.100 { 791885eeb67Sdrh CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA)); 792885eeb67Sdrh ALTER TABLE t1 RENAME aaa TO bbb; 793885eeb67Sdrh SELECT sql FROM sqlite_master WHERE name='t1'; 794885eeb67Sdrh} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))}} 795885eeb67Sdrhdo_execsql_test 20.105 { 796885eeb67Sdrh DROP TABLE t1; 797885eeb67Sdrh CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA))WITHOUT ROWID; 798885eeb67Sdrh ALTER TABLE t1 RENAME aaa TO bbb; 799885eeb67Sdrh SELECT sql FROM sqlite_master WHERE name='t1'; 800885eeb67Sdrh} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))WITHOUT ROWID}} 801885eeb67Sdrhdo_execsql_test 20.110 { 802885eeb67Sdrh DROP TABLE t1; 803885eeb67Sdrh CREATE TABLE t1(aa UNIQUE,bb UNIQUE,cc UNIQUE,UNIQUE(aA),PRIMARY KEY(bB),UNIQUE(cC)); 804885eeb67Sdrh ALTER TABLE t1 RENAME aa TO xx; 805885eeb67Sdrh ALTER TABLE t1 RENAME bb TO yy; 806885eeb67Sdrh ALTER TABLE t1 RENAME cc TO zz; 807885eeb67Sdrh SELECT sql FROM sqlite_master WHERE name='t1'; 808885eeb67Sdrh} {{CREATE TABLE t1(xx UNIQUE,yy UNIQUE,zz UNIQUE,UNIQUE(xx),PRIMARY KEY(yy),UNIQUE(zz))}} 809885eeb67Sdrh 8103083d5f5Sdan#------------------------------------------------------------------------- 8113083d5f5Sdanreset_db 8123083d5f5Sdando_execsql_test 21.0 { 8133083d5f5Sdan CREATE TABLE t1(a, b, c NOT NULL); 8143083d5f5Sdan CREATE TRIGGER tr1 AFTER INSERT ON t1 WHEN new.c IS NOT NULL BEGIN 8153083d5f5Sdan SELECT c NOT NULL FROM t1; 8163083d5f5Sdan END; 8173083d5f5Sdan} 8183083d5f5Sdan 8193083d5f5Sdando_execsql_test 21.1 { 8203083d5f5Sdan ALTER TABLE t1 RENAME c TO d; 8213083d5f5Sdan} 8223083d5f5Sdan 8233083d5f5Sdando_execsql_test 21.2 { 8243083d5f5Sdan SELECT sql FROM sqlite_schema WHERE name IS 'tr1' 8253083d5f5Sdan} {{CREATE TRIGGER tr1 AFTER INSERT ON t1 WHEN new.d IS NOT NULL BEGIN 8263083d5f5Sdan SELECT d NOT NULL FROM t1; 8273083d5f5Sdan END} 8283083d5f5Sdan} 829e8ab40d2Sdan 830776a578cSdan#------------------------------------------------------------------------- 831776a578cSdan# 832776a578cSdanreset_db 833776a578cSdando_execsql_test 22.0 { 834776a578cSdan CREATE TABLE t1(a, b); 835776a578cSdan CREATE TABLE t2(c, othername, extra AS (c + 1)); 836776a578cSdan ALTER TABLE t1 RENAME a to othername; 837776a578cSdan SELECT sql FROM sqlite_schema; 838776a578cSdan} { 839776a578cSdan {CREATE TABLE t1(othername, b)} 840776a578cSdan {CREATE TABLE t2(c, othername, extra AS (c + 1))} 841776a578cSdan} 842776a578cSdan 8432ad080aaSdan#------------------------------------------------------------------------- 8442ad080aaSdan# 8452ad080aaSdanreset_db 8467d44b22dSdrhsqlite3_db_config db SQLITE_DBCONFIG_DQS_DDL 1 8477d44b22dSdrhsqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1 8482ad080aaSdando_execsql_test 22.0 { 8492ad080aaSdan CREATE TABLE t1(a, b); 8502ad080aaSdan CREATE INDEX x1 on t1("c"=b); 8512ad080aaSdan INSERT INTO t1 VALUES('a', 'a'); 8522ad080aaSdan INSERT INTO t1 VALUES('b', 'b'); 8532ad080aaSdan INSERT INTO t1 VALUES('c', 'c'); 8542ad080aaSdan ALTER TABLE t1 RENAME COLUMN a TO "c"; 8552ad080aaSdan PRAGMA integrity_check; 8562ad080aaSdan} {ok} 8572ad080aaSdan 8581d14ffe6Sdanreset_db 8591d14ffe6Sdando_execsql_test 23.0 { 8601d14ffe6Sdan CREATE TABLE t1('a'"b",c); 8611d14ffe6Sdan CREATE INDEX i1 ON t1('a'); 8621d14ffe6Sdan INSERT INTO t1 VALUES(1,2), (3,4); 8631d14ffe6Sdan ALTER TABLE t1 RENAME COLUMN a TO x; 8641d14ffe6Sdan PRAGMA integrity_check; 8651d14ffe6Sdan SELECT sql FROM sqlite_schema WHERE name='t1'; 8661d14ffe6Sdan 8671d14ffe6Sdan} {ok {CREATE TABLE t1("x" "b",c)}} 8681d14ffe6Sdan 8695a80050dSdrh# 2022-02-04 8705a80050dSdrh# Do not complain about syntax errors in the schema if 8715a80050dSdrh# in PRAGMA writable_schema=ON mode. 8725a80050dSdrh# 8735a80050dSdrhreset_db 8745a80050dSdrhdo_execsql_test 23.0 { 8755a80050dSdrh CREATE TABLE t1(a INT, b REAL, c TEXT, d BLOB, e ANY); 8765a80050dSdrh CREATE INDEX t1abx ON t1(a, b, a+b) WHERE c IS NOT NULL; 8775a80050dSdrh CREATE VIEW t2 AS SELECT a+10, b*5.0, xyz FROM t1; -- unknown column "xyz" 8785a80050dSdrh CREATE TABLE schema_copy(name TEXT, sql TEXT); 8795a80050dSdrh INSERT INTO schema_copy(name,sql) SELECT name, sql FROM sqlite_schema WHERE sql IS NOT NULL; 8805a80050dSdrh} {} 8815a80050dSdrhdo_catchsql_test 23.1 { 8825a80050dSdrh ALTER TABLE t1 RENAME COLUMN e TO eeee; 8835a80050dSdrh} {1 {error in view t2: no such column: xyz}} 8845a80050dSdrhdo_execsql_test 23.2 { 8855a80050dSdrh SELECT name, sql FROM sqlite_master 8865a80050dSdrh EXCEPT SELECT name, sql FROM schema_copy; 8875a80050dSdrh} {} 8885a80050dSdrhdo_execsql_test 23.3 { 8895a80050dSdrh BEGIN; 8905a80050dSdrh PRAGMA writable_schema=ON; 8915a80050dSdrh ALTER TABLE t1 RENAME COLUMN e TO eeee; 8925a80050dSdrh PRAGMA writable_schema=OFF; 8935a80050dSdrh SELECT name FROM sqlite_master 8945a80050dSdrh WHERE (name, sql) NOT IN (SELECT name, sql FROM schema_copy); 8955a80050dSdrh ROLLBACK; 8965a80050dSdrh} {t1} 8975a80050dSdrhdo_execsql_test 23.10 { 8985a80050dSdrh DROP VIEW t2; 8995a80050dSdrh CREATE TRIGGER r3 AFTER INSERT ON t1 BEGIN 9005a80050dSdrh INSERT INTO t3(x,y) VALUES(new.a, new.b); 9015a80050dSdrh INSERT INTO t4(p) VALUES(new.c); -- no such table "t4" 9025a80050dSdrh END; 9035a80050dSdrh DELETE FROM schema_copy; 9045a80050dSdrh INSERT INTO schema_copy(name,sql) SELECT name, sql FROM sqlite_schema WHERE sql IS NOT NULL; 9055a80050dSdrh} {} 9065a80050dSdrhdo_catchsql_test 23.11 { 9075a80050dSdrh ALTER TABLE t1 RENAME COLUMN e TO eeee; 9085a80050dSdrh} {1 {error in trigger r3: no such table: main.t3}} 9095a80050dSdrhdo_execsql_test 23.12 { 9105a80050dSdrh SELECT name, sql FROM sqlite_master 9115a80050dSdrh EXCEPT SELECT name, sql FROM schema_copy; 9125a80050dSdrh} {} 9135a80050dSdrhdo_execsql_test 23.13 { 9145a80050dSdrh BEGIN; 9155a80050dSdrh PRAGMA writable_schema=ON; 9165a80050dSdrh ALTER TABLE t1 RENAME COLUMN e TO eeee; 9175a80050dSdrh PRAGMA writable_schema=OFF; 9185a80050dSdrh SELECT name FROM sqlite_master 9195a80050dSdrh WHERE (name, sql) NOT IN (SELECT name, sql FROM schema_copy); 9205a80050dSdrh ROLLBACK; 9215a80050dSdrh} {t1} 922*bcd60d20Sdrhdo_execsql_test 23.20 { 923*bcd60d20Sdrh CREATE TABLE t4(id INTEGER PRIMARY KEY, c1 INT, c2 INT); 924*bcd60d20Sdrh CREATE VIEW t4v1 AS SELECT id, c1, c99 FROM t4; 925*bcd60d20Sdrh DELETE FROM schema_copy; 926*bcd60d20Sdrh INSERT INTO schema_copy SELECT name, sql FROM sqlite_schema; 927*bcd60d20Sdrh BEGIN; 928*bcd60d20Sdrh PRAGMA writable_schema=ON; 929*bcd60d20Sdrh ALTER TABLE t4 RENAME to t4new; 930*bcd60d20Sdrh SELECT name FROM sqlite_schema WHERE (name,sql) NOT IN (SELECT * FROM schema_copy); 931*bcd60d20Sdrh ROLLBACK; 932*bcd60d20Sdrh} {t4new} 933b87a9a8aSdan 934987db767Sdanfinish_test 935