CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
altertab2.test386 linesDownload Raw Back to test
1# 2018 September 302#3# The author disclaims copyright to this source code.  In place of4# a legal notice, here is a blessing:5#6#    May you do good and not evil.7#    May you find forgiveness for yourself and forgive others.8#    May you share freely, never taking more than you give.9#10#*************************************************************************11#12 13set testdir [file dirname $argv0]14source $testdir/tester.tcl15set testprefix altertab216 17# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.18ifcapable !altertable {19  finish_test20  return21}22 23ifcapable fts5 {24  do_execsql_test 1.0 {25    CREATE TABLE rr(a, b);26    CREATE VIRTUAL TABLE ff USING fts5(a, b);27    CREATE TRIGGER tr1 AFTER INSERT ON rr BEGIN28      INSERT INTO ff VALUES(new.a, new.b);29    END;30    INSERT INTO rr VALUES('hello', 'world');31    SELECT * FROM ff;32  } {hello world}33 34  do_execsql_test 1.1 {35    ALTER TABLE ff RENAME TO ffff;36  }37 38  do_execsql_test 1.2 {39    INSERT INTO rr VALUES('in', 'tcl');40    SELECT * FROM ffff;41  } {hello world in tcl}42}43 44#-------------------------------------------------------------------------45# Check that table names that appear in REFERENCES clauses are updated46# when a table is renamed unless:47#48#   a) "PRAGMA legacy_alter_table" is true, and49#   b) "PRAGMA foreign_keys" is false.50#51do_execsql_test 2.0 {52  CREATE TABLE p1(a PRIMARY KEY, b);53  CREATE TABLE c1(x REFERENCES p1);54  CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES p1);55  CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES p1(a));56}57 58do_execsql_test 2.1 {59  ALTER TABLE p1 RENAME TO p2;60  SELECT sql FROM sqlite_master WHERE name LIKE 'c%';61} {62  {CREATE TABLE c1(x REFERENCES "p2")}63  {CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES "p2")}64  {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p2"(a))}65}66 67do_execsql_test 2.2 {68  PRAGMA legacy_alter_table = 1;69  ALTER TABLE p2 RENAME TO p3;70  SELECT sql FROM sqlite_master WHERE name LIKE 'c%';71} {72  {CREATE TABLE c1(x REFERENCES "p2")}73  {CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES "p2")}74  {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p2"(a))}75}76 77do_execsql_test 2.3 {78  ALTER TABLE p3 RENAME TO p2;79  PRAGMA foreign_keys = 1;80  ALTER TABLE p2 RENAME TO p3;81  SELECT sql FROM sqlite_master WHERE name LIKE 'c%';82} {83  {CREATE TABLE c1(x REFERENCES "p3")}84  {CREATE TABLE c2(x, FOREIGN KEY (x) REFERENCES "p3")}85  {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p3"(a))}86}87 88#-------------------------------------------------------------------------89# Table name in WITH clauses that are part of views or triggers.90#91foreach {tn schema} {92  1 {93    CREATE TABLE log_entry(col1, y);94    CREATE INDEX i1 ON log_entry(col1);95  }96 97  2 {98    CREATE TABLE t1(a, b, c);99    CREATE TABLE t2(x);100    CREATE TABLE log_entry(col1);101    CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN102      INSERT INTO t2 SELECT col1 FROM log_entry;103    END;104  }105 106  3 {107    CREATE TABLE t1(a, b, c);108    CREATE TABLE t2(x);109    CREATE TABLE log_entry(col1);110    CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN111      INSERT INTO t2112        WITH xyz(x) AS (SELECT col1 FROM log_entry)113        SELECT x FROM xyz;114    END;115  }116 117  4 {118    CREATE TABLE log_entry(col1);119    CREATE VIEW ttt AS120        WITH xyz(x) AS (SELECT col1 FROM log_entry)121        SELECT x FROM xyz;122  }123} {124  reset_db125  do_execsql_test 3.$tn.1 $schema126  set expect [db eval "SELECT sql FROM sqlite_master"]127  set expect [string map {log_entry {"newname"}} $expect]128 129  do_execsql_test 3.$tn.2 {130    ALTER TABLE log_entry RENAME TO newname;131    SELECT sql FROM sqlite_master;132  } $expect133 134  reset_db135  do_execsql_test 3.$tn.3 $schema136  set expect [db eval "SELECT sql FROM sqlite_master"]137  set expect [string map {col1 newname} $expect]138 139  do_execsql_test 3.$tn.4 {140    ALTER TABLE log_entry RENAME col1 TO newname;141    SELECT sql FROM sqlite_master;142  } $expect143}144 145#-------------------------------------------------------------------------146reset_db147do_execsql_test 4.0 {148  CREATE TABLE t1(a,b,c,d,e,f);149  CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN150    UPDATE t1 SET (c,d)=(a,b);151  END;152}153 154do_execsql_test 4.1 {155  ALTER TABLE t1 RENAME TO t1x;156  SELECT sql FROM sqlite_master WHERE type = 'trigger';157} {158{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN159    UPDATE "t1x" SET (c,d)=(a,b);160  END}161}162 163do_execsql_test 4.2 {164  ALTER TABLE t1x RENAME a TO aaa;165  SELECT sql FROM sqlite_master WHERE type = 'trigger';166} {167{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN168    UPDATE "t1x" SET (c,d)=(aaa,b);169  END}170}171 172do_execsql_test 4.3 {173  ALTER TABLE t1x RENAME d TO ddd;174  SELECT sql FROM sqlite_master WHERE type = 'trigger';175} {176{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN177    UPDATE "t1x" SET (c,ddd)=(aaa,b);178  END}179}180 181#-------------------------------------------------------------------------182ifcapable windowfunc {183do_execsql_test 5.0 {184  CREATE TABLE t2(a);185  CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN186    SELECT a, sum(a) OVER w1 FROM t2187      WINDOW w1 AS (188        PARTITION BY a ORDER BY a 189        ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING190      ),191      w2 AS (192        PARTITION BY a193        ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING194      );195  END;196} {}197 198do_execsql_test 5.0.1 {199  INSERT INTO t2 VALUES(1);200} {}201 202do_execsql_test 5.1 {203  ALTER TABLE t2 RENAME TO t2x;204  SELECT sql FROM sqlite_master WHERE name = 'r2';205} {206  {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN207    SELECT a, sum(a) OVER w1 FROM "t2x"208      WINDOW w1 AS (209        PARTITION BY a ORDER BY a 210        ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING211      ),212      w2 AS (213        PARTITION BY a214        ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING215      );216  END}217}218 219do_execsql_test 5.2 {220  ALTER TABLE t2x RENAME a TO aaaa;221  SELECT sql FROM sqlite_master WHERE name = 'r2';222} {223  {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN224    SELECT aaaa, sum(aaaa) OVER w1 FROM "t2x"225      WINDOW w1 AS (226        PARTITION BY aaaa ORDER BY aaaa 227        ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING228      ),229      w2 AS (230        PARTITION BY aaaa231        ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING232      );233  END}234}235 236do_execsql_test 5.3 {237  INSERT INTO t2x VALUES(1);238} {}239} ;# windowfunc240 241#-------------------------------------------------------------------------242 243do_execsql_test 6.0 {244  CREATE TABLE t3(a,b,c,d);245  CREATE TRIGGER r3 AFTER INSERT ON t3 WHEN new.a NOT NULL BEGIN246    SELECT a,b,c FROM t3 EXCEPT SELECT a,b,c FROM t3 ORDER BY a;247    SELECT rowid, * FROM t3;248  END;249} {}250 251do_execsql_test 6.1 {252  ALTER TABLE t3 RENAME TO t3x;253  SELECT sql FROM sqlite_master WHERE name = 'r3';254} {255  {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.a NOT NULL BEGIN256    SELECT a,b,c FROM "t3x" EXCEPT SELECT a,b,c FROM "t3x" ORDER BY a;257    SELECT rowid, * FROM "t3x";258  END}259}260 261do_execsql_test 6.2 {262  ALTER TABLE t3x RENAME a TO abcd;263  SELECT sql FROM sqlite_master WHERE name = 'r3';264} {265  {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.abcd NOT NULL BEGIN266    SELECT abcd,b,c FROM "t3x" EXCEPT SELECT abcd,b,c FROM "t3x" ORDER BY abcd;267    SELECT rowid, * FROM "t3x";268  END}269}270 271#-------------------------------------------------------------------------272reset_db273 274do_execsql_test 7.0 {275  CREATE TABLE t1(a,b,c,d,e,f);276  INSERT INTO t1 VALUES(1,2,3,4,5,6);277  CREATE TABLE t2(x,y,z);278}279 280do_execsql_test 7.1 {281  SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c;282} {1 2 3 4 5 6}283 284do_execsql_test 7.2 {285  CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN286    INSERT INTO t2287    SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c;288  END;289  INSERT INTO t1 VALUES(2,3,4,5,6,7);290  SELECT * FROM t2;291} {1 2 3  2 3 4  4 5 6  5 6 7}292 293do_execsql_test 7.3 {294  ALTER TABLE t1 RENAME TO xyzzy;295  SELECT sql FROM sqlite_master WHERE name='r1'296} {297  {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN298    INSERT INTO t2299    SELECT a,b,c FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,c;300  END}301}302 303do_execsql_test 7.3 {304  ALTER TABLE xyzzy RENAME c TO ccc;305  SELECT sql FROM sqlite_master WHERE name='r1'306} {307  {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN308    INSERT INTO t2309    SELECT a,b,ccc FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,ccc;310  END}311}312 313#-------------------------------------------------------------------------314reset_db315do_execsql_test 8.0 {316  CREATE TABLE t1(a, b, c); 317  CREATE TABLE t2(a, b, c); 318  CREATE TABLE t3(d, e, f);319  CREATE VIEW v1 AS SELECT * FROM t1;320  CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN321    UPDATE t2 SET a = new.d;322    SELECT a, b, c FROM v1;323  END;324}325 326do_execsql_test 8.1 {327  INSERT INTO t3 VALUES(1, 2, 3);328}329 330# The following ALTER TABLE fails as if column "t1.a" is renamed the "a"331# in the "SELECT a, b, c FROM v1" within the trigger can no longer be332# resolved. But at one point there was a bug allowing the ALTER TABLE333# succeed. Which meant the subsequent INSERT statement would fail.334do_catchsql_test 8.2 {335  ALTER TABLE t1 RENAME a TO aaa;336} {1 {error in trigger tr after rename: no such column: a}}337do_execsql_test 8.3 {338  INSERT INTO t3 VALUES(4, 5, 6);339}340 341do_execsql_test 8.4 {342  CREATE TABLE t4(a, b);343  CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2;344}345 346# Branches of an expression tree that are optimized out by the AND 347# optimization are renamed.348#349do_execsql_test 8.5 {350  ALTER TABLE t4 RENAME a TO c;351  SELECT sql FROM sqlite_master WHERE name = 'v4'352} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}}353 354# 2019-06-10 https://sqlite.org/src/info/533010b8cacebe82355reset_db356do_catchsql_test 8.6 {357  CREATE TABLE t0(c0);358  CREATE INDEX i0 ON t0(likelihood(1,2) AND 0);359  ALTER TABLE t0 RENAME TO t1;360  SELECT sql FROM sqlite_master WHERE name='i0';361} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}362 363 364reset_db365 366do_execsql_test 9.0 {367  CREATE TABLE t1(a,b,c,d);368  CREATE TABLE t2(a,b,c,d,x);369 370  CREATE TRIGGER AFTER INSERT ON t2 BEGIN371 372    SELECT group_conct(373        123 ORDER BY (374          SELECT 1 FROM ( VALUES(a, 'b'), ('c') )375          )) 376    FROM t1;377 378  END;379}380 381do_catchsql_test 9.1 {382  ALTER TABLE t2 RENAME TO newname;383} {1 {error in trigger AFTER: all VALUES must have the same number of terms}}384 385finish_test386