xref: /sqlite-3.40.0/test/altercol.test (revision bcd60d20)
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