xref: /sqlite-3.40.0/test/alterdropcol.test (revision 0a746cc5)
16e6d9833Sdan# 2021 February 16
26e6d9833Sdan#
36e6d9833Sdan# The author disclaims copyright to this source code.  In place of
46e6d9833Sdan# a legal notice, here is a blessing:
56e6d9833Sdan#
66e6d9833Sdan#    May you do good and not evil.
76e6d9833Sdan#    May you find forgiveness for yourself and forgive others.
86e6d9833Sdan#    May you share freely, never taking more than you give.
96e6d9833Sdan#
106e6d9833Sdan#*************************************************************************
116e6d9833Sdan#
126e6d9833Sdan
136e6d9833Sdanset testdir [file dirname $argv0]
146e6d9833Sdansource $testdir/tester.tcl
156e6d9833Sdanset testprefix alterdropcol
166e6d9833Sdan
176e6d9833Sdan# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
186e6d9833Sdanifcapable !altertable {
196e6d9833Sdan  finish_test
206e6d9833Sdan  return
216e6d9833Sdan}
226e6d9833Sdan
236e6d9833Sdando_execsql_test 1.0 {
246e6d9833Sdan  CREATE TABLE t1(a, b, c);
256e6d9833Sdan  CREATE VIEW v1 AS SELECT * FROM t1;
266e6d9833Sdan
276e6d9833Sdan  CREATE TABLE t2(x INTEGER PRIMARY KEY, y, z UNIQUE);
286e6d9833Sdan  CREATE INDEX t2y ON t2(y);
296a5a13dfSdan
306a5a13dfSdan  CREATE TABLE t3(q, r, s);
316a5a13dfSdan  CREATE INDEX t3rs ON t3(r+s);
326e6d9833Sdan}
336e6d9833Sdan
346e6d9833Sdando_catchsql_test 1.1 {
356e6d9833Sdan  ALTER TABLE nosuch DROP COLUMN z;
366e6d9833Sdan} {1 {no such table: nosuch}}
376e6d9833Sdan
386e6d9833Sdando_catchsql_test 1.2 {
396e6d9833Sdan  ALTER TABLE v1 DROP COLUMN c;
406a5a13dfSdan} {1 {cannot drop column from view "v1"}}
416e6d9833Sdan
426e6d9833Sdanifcapable fts5 {
436e6d9833Sdan  do_execsql_test 1.3.1 {
446e6d9833Sdan    CREATE VIRTUAL TABLE ft1 USING fts5(one, two);
456e6d9833Sdan  }
466e6d9833Sdan  do_catchsql_test 1.3.2 {
476e6d9833Sdan    ALTER TABLE ft1 DROP COLUMN two;
486a5a13dfSdan  } {1 {cannot drop column from virtual table "ft1"}}
496e6d9833Sdan}
506e6d9833Sdan
516e6d9833Sdando_catchsql_test 1.4 {
526e6d9833Sdan  ALTER TABLE sqlite_schema DROP COLUMN sql;
536e6d9833Sdan} {1 {table sqlite_master may not be altered}}
546e6d9833Sdan
556e6d9833Sdando_catchsql_test 1.5 {
566e6d9833Sdan  ALTER TABLE t1 DROP COLUMN d;
576e6d9833Sdan} {1 {no such column: "d"}}
586e6d9833Sdan
596e6d9833Sdando_execsql_test 1.6.1 {
606e6d9833Sdan  ALTER TABLE t1 DROP COLUMN b;
616e6d9833Sdan}
626e6d9833Sdando_execsql_test 1.6.2 {
636e6d9833Sdan  SELECT sql FROM sqlite_schema WHERE name = 't1'
646e6d9833Sdan} {{CREATE TABLE t1(a, c)}}
656e6d9833Sdan
666e6d9833Sdando_execsql_test 1.7.1 {
676e6d9833Sdan  ALTER TABLE t1 DROP COLUMN c;
686e6d9833Sdan}
696e6d9833Sdando_execsql_test 1.7.2 {
706e6d9833Sdan  SELECT sql FROM sqlite_schema WHERE name = 't1'
716e6d9833Sdan} {{CREATE TABLE t1(a)}}
726e6d9833Sdan
736a5a13dfSdando_catchsql_test 1.7.3 {
746a5a13dfSdan  ALTER TABLE t1 DROP COLUMN a;
75239c84fcSdrh} {1 {cannot drop column "a": no other columns exist}}
766a5a13dfSdan
776e6d9833Sdan
786e6d9833Sdando_catchsql_test 1.8 {
796e6d9833Sdan  ALTER TABLE t2 DROP COLUMN z
806e6d9833Sdan} {1 {cannot drop UNIQUE column: "z"}}
816e6d9833Sdan
826e6d9833Sdando_catchsql_test 1.9 {
836e6d9833Sdan  ALTER TABLE t2 DROP COLUMN x
846e6d9833Sdan} {1 {cannot drop PRIMARY KEY column: "x"}}
856e6d9833Sdan
866e6d9833Sdando_catchsql_test 1.10 {
876e6d9833Sdan  ALTER TABLE t2 DROP COLUMN y
886a5a13dfSdan} {1 {error in index t2y after drop column: no such column: y}}
896a5a13dfSdan
906a5a13dfSdando_catchsql_test 1.11 {
916a5a13dfSdan  ALTER TABLE t3 DROP COLUMN s
926a5a13dfSdan} {1 {error in index t3rs after drop column: no such column: s}}
936e6d9833Sdan
946e6d9833Sdan#-------------------------------------------------------------------------
956e6d9833Sdan
966e6d9833Sdanforeach {tn wo} {
976e6d9833Sdan  1 {}
986e6d9833Sdan  2 {WITHOUT ROWID}
996e6d9833Sdan} { eval [string map [list %TN% $tn %WO% $wo] {
1006e6d9833Sdan
1016e6d9833Sdan  reset_db
1026e6d9833Sdan  do_execsql_test 2.%TN%.0 {
1036e6d9833Sdan    CREATE TABLE t1(x, y INTEGER PRIMARY KEY, z) %WO% ;
1046e6d9833Sdan    INSERT INTO t1 VALUES(1, 2, 3);
1056e6d9833Sdan    INSERT INTO t1 VALUES(4, 5, 6);
1066e6d9833Sdan    INSERT INTO t1 VALUES(7, 8, 9);
1076e6d9833Sdan  }
1086e6d9833Sdan
1096e6d9833Sdan  do_execsql_test 2.%TN%.1 {
1106e6d9833Sdan    ALTER TABLE t1 DROP COLUMN x;
1116e6d9833Sdan    SELECT * FROM t1;
1126e6d9833Sdan  } {
1136e6d9833Sdan    2 3  5 6  8 9
1146e6d9833Sdan  }
1156e6d9833Sdan  do_execsql_test 2.%TN%.2 {
1166e6d9833Sdan    ALTER TABLE t1 DROP COLUMN z;
1176e6d9833Sdan    SELECT * FROM t1;
1186e6d9833Sdan  } {
1196e6d9833Sdan    2 5 8
1206e6d9833Sdan  }
1216e6d9833Sdan}]}
1226e6d9833Sdan
1236a5a13dfSdan#-------------------------------------------------------------------------
1246a5a13dfSdanreset_db
1256a5a13dfSdan
1266a5a13dfSdando_execsql_test 3.0 {
1276a5a13dfSdan  CREATE TABLE t12(a, b, c, CHECK(c>10));
1286a5a13dfSdan  CREATE TABLE t13(a, b, c CHECK(c>10));
1296a5a13dfSdan}
1306a5a13dfSdando_catchsql_test 3.1 {
1316a5a13dfSdan  ALTER TABLE t12 DROP COLUMN c;
1326a5a13dfSdan} {1 {error in table t12 after drop column: no such column: c}}
1336a5a13dfSdan
1346a5a13dfSdando_catchsql_test 3.2 {
1356a5a13dfSdan  ALTER TABLE t13 DROP COLUMN c;
1366a5a13dfSdan} {0 {}}
1376a5a13dfSdan
1386a5a13dfSdan#-------------------------------------------------------------------------
1396a5a13dfSdan# Test that generated columns can be dropped. And that other columns from
1406a5a13dfSdan# tables that contain generated columns can be dropped.
1416a5a13dfSdan#
1426a5a13dfSdanforeach {tn wo vs} {
1436a5a13dfSdan  1 ""              ""
1446a5a13dfSdan  2 ""              VIRTUAL
1456a5a13dfSdan  3 ""              STORED
1466a5a13dfSdan  4 "WITHOUT ROWID" STORED
1476a5a13dfSdan  5 "WITHOUT ROWID" VIRTUAL
1486a5a13dfSdan} {
1496a5a13dfSdan  reset_db
1506a5a13dfSdan
1516a5a13dfSdan  do_execsql_test 4.$tn.0 "
1526a5a13dfSdan    CREATE TABLE 'my table'(a, b PRIMARY KEY, c AS (a+b) $vs, d) $wo
1536a5a13dfSdan  "
1546a5a13dfSdan  do_execsql_test 4.$tn.1 {
1556a5a13dfSdan    INSERT INTO "my table"(a, b, d) VALUES(1, 2, 'hello');
1566a5a13dfSdan    INSERT INTO "my table"(a, b, d) VALUES(3, 4, 'world');
1576a5a13dfSdan
1586a5a13dfSdan    SELECT * FROM "my table"
1596a5a13dfSdan  } {
1606a5a13dfSdan    1 2 3 hello
1616a5a13dfSdan    3 4 7 world
1626a5a13dfSdan  }
1636a5a13dfSdan
1646a5a13dfSdan  do_execsql_test 4.$tn.2 {
1656a5a13dfSdan    ALTER TABLE "my table" DROP COLUMN c;
1666a5a13dfSdan  }
1676a5a13dfSdan  do_execsql_test 4.$tn.3 {
1686a5a13dfSdan    SELECT * FROM "my table"
1696a5a13dfSdan  } {
1706a5a13dfSdan    1 2 hello
1716a5a13dfSdan    3 4 world
1726a5a13dfSdan  }
1736a5a13dfSdan
1746a5a13dfSdan  do_execsql_test 4.$tn.4 "
1756a5a13dfSdan    CREATE TABLE x1(a, b, c PRIMARY KEY, d AS (b+c) $vs, e) $wo
1766a5a13dfSdan  "
1776a5a13dfSdan  do_execsql_test 4.$tn.5 {
1786a5a13dfSdan    INSERT INTO x1(a, b, c, e) VALUES(1, 2, 3, 4);
1796a5a13dfSdan    INSERT INTO x1(a, b, c, e) VALUES(5, 6, 7, 8);
1806a5a13dfSdan    INSERT INTO x1(a, b, c, e) VALUES(9, 10, 11, 12);
1816a5a13dfSdan    SELECT * FROM x1;
1826a5a13dfSdan  } {
1836a5a13dfSdan    1 2 3 5 4
1846a5a13dfSdan    5 6 7 13 8
1856a5a13dfSdan    9 10 11 21 12
1866a5a13dfSdan  }
1876a5a13dfSdan
1886a5a13dfSdan  do_execsql_test 4.$tn.6 {
1896a5a13dfSdan    ALTER TABLE x1 DROP COLUMN a
1906a5a13dfSdan  }
1916a5a13dfSdan  do_execsql_test 4.$tn.7 {
1926a5a13dfSdan    SELECT * FROM x1
1936a5a13dfSdan  } {
1946a5a13dfSdan    2 3 5 4
1956a5a13dfSdan    6 7 13 8
1966a5a13dfSdan    10 11 21 12
1976a5a13dfSdan  }
1986a5a13dfSdan  do_execsql_test 4.$tn.8 {
1996a5a13dfSdan    ALTER TABLE x1 DROP COLUMN e
2006a5a13dfSdan  }
2016a5a13dfSdan  do_execsql_test 4.$tn.9 {
2026a5a13dfSdan    SELECT * FROM x1
2036a5a13dfSdan  } {
2046a5a13dfSdan    2 3 5
2056a5a13dfSdan    6 7 13
2066a5a13dfSdan    10 11 21
2076a5a13dfSdan  }
2086a5a13dfSdan}
2096a5a13dfSdan
21030cdb992Sdan#-------------------------------------------------------------------------
21130cdb992Sdanreset_db
21230cdb992Sdando_execsql_test 5.0 {
21330cdb992Sdan  CREATE TABLE p1(a PRIMARY KEY, b UNIQUE);
21430cdb992Sdan  CREATE TABLE c1(x, y, z REFERENCES p1(c));
21530cdb992Sdan  CREATE TABLE c2(x, y, z, w REFERENCES p1(b));
21630cdb992Sdan}
21730cdb992Sdando_execsql_test 5.1 {
21830cdb992Sdan  ALTER TABLE c1 DROP COLUMN z;
21930cdb992Sdan  ALTER TABLE c2 DROP COLUMN z;
22030cdb992Sdan  SELECT sql FROM sqlite_schema WHERE name IN ('c1', 'c2');
22130cdb992Sdan} {
22230cdb992Sdan  {CREATE TABLE c1(x, y)}
22330cdb992Sdan  {CREATE TABLE c2(x, y, w REFERENCES p1(b))}
22430cdb992Sdan}
2256a5a13dfSdan
22616953469Sdando_execsql_test 5.2.1 {
22716953469Sdan  CREATE VIEW v1 AS SELECT d, e FROM p1
22816953469Sdan}
22916953469Sdando_catchsql_test 5.2.2 {
23016953469Sdan  ALTER TABLE c1 DROP COLUMN x
23116953469Sdan} {1 {error in view v1: no such column: d}}
23216953469Sdando_execsql_test 5.3.1 {
23316953469Sdan  DROP VIEW v1;
23416953469Sdan  CREATE VIEW v1 AS SELECT x, y FROM c1;
23516953469Sdan}
23616953469Sdando_catchsql_test 5.3.2 {
23716953469Sdan  ALTER TABLE c1 DROP COLUMN x
23816953469Sdan} {1 {error in view v1 after drop column: no such column: x}}
23916953469Sdan
24016953469Sdando_execsql_test 5.4.1 {
24116953469Sdan  CREATE TRIGGER tr AFTER INSERT ON c1 BEGIN
24216953469Sdan    INSERT INTO p1 VALUES(new.y, new.xyz);
24316953469Sdan  END;
24416953469Sdan}
24516953469Sdando_catchsql_test 5.4.2 {
24616953469Sdan  ALTER TABLE c1 DROP COLUMN y
24716953469Sdan} {1 {error in trigger tr: no such column: new.xyz}}
24816953469Sdando_execsql_test 5.5.1 {
24916953469Sdan  DROP TRIGGER tr;
25016953469Sdan  CREATE TRIGGER tr AFTER INSERT ON c1 BEGIN
25116953469Sdan    INSERT INTO p1 VALUES(new.y, new.z);
25216953469Sdan  END;
25316953469Sdan}
25416953469Sdando_catchsql_test 5.5.2 {
25516953469Sdan  ALTER TABLE c1 DROP COLUMN y
25616953469Sdan} {1 {error in trigger tr: no such column: new.z}}
2576a5a13dfSdan
258747cc942Sdrh# 2021-03-06 dbsqlfuzz crash-419aa525df93db6e463772c686ac6da27b46da9e
259747cc942Sdrhreset_db
260747cc942Sdrhdo_catchsql_test 6.0 {
261747cc942Sdrh  CREATE TABLE t1(a,b,c);
262747cc942Sdrh  CREATE TABLE t2(x,y,z);
263747cc942Sdrh  PRAGMA writable_schema=ON;
264747cc942Sdrh  UPDATE sqlite_schema SET sql='CREATE INDEX t1b ON t1(b)' WHERE name='t2';
265747cc942Sdrh  PRAGMA writable_schema=OFF;
266747cc942Sdrh  ALTER TABLE t2 DROP COLUMN z;
267747cc942Sdrh} {1 {database disk image is malformed}}
268747cc942Sdrhreset_db
269747cc942Sdrhdo_catchsql_test 6.1 {
270747cc942Sdrh  CREATE TABLE t1(a,b,c);
271747cc942Sdrh  CREATE TABLE t2(x,y,z);
272747cc942Sdrh  PRAGMA writable_schema=ON;
273747cc942Sdrh  UPDATE sqlite_schema SET sql='CREATE VIEW t2(x,y,z) AS SELECT b,a,c FROM t1'
274747cc942Sdrh   WHERE name='t2';
275747cc942Sdrh  PRAGMA writable_schema=OFF;
276747cc942Sdrh  ALTER TABLE t2 DROP COLUMN z;
277747cc942Sdrh} {1 {database disk image is malformed}}
278747cc942Sdrh
279cc26301eSdan# 2021-04-06 dbsqlfuzz crash-331c5c29bb76257b198f1318eef3288f9624c8ce
280cc26301eSdanreset_db
281cc26301eSdando_execsql_test 7.0 {
282cc26301eSdan  CREATE TABLE t1(a, b, c, PRIMARY KEY(a COLLATE nocase, a)) WITHOUT ROWID;
283cc26301eSdan  INSERT INTO t1 VALUES(1, 2, 3);
284cc26301eSdan  INSERT INTO t1 VALUES(4, 5, 6);
285cc26301eSdan}
286cc26301eSdando_execsql_test 7.1 {
287cc26301eSdan  ALTER TABLE t1 DROP COLUMN c;
288cc26301eSdan}
289cc26301eSdando_execsql_test 7.2 {
290cc26301eSdan  SELECT sql FROM sqlite_schema;
291cc26301eSdan} {{CREATE TABLE t1(a, b, PRIMARY KEY(a COLLATE nocase, a)) WITHOUT ROWID}}
292cc26301eSdando_execsql_test 7.3 {
293cc26301eSdan  SELECT * FROM t1;
294cc26301eSdan} {1 2 4 5}
295cc26301eSdan
296755ed41fSdanreset_db
297755ed41fSdando_execsql_test 8.0 {
298755ed41fSdan  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
299755ed41fSdan  PRAGMA writable_schema = 1;
300755ed41fSdan  UPDATE sqlite_schema
301755ed41fSdan  SET sql = 'CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT, b)'
302755ed41fSdan}
303755ed41fSdandb close
304755ed41fSdansqlite3 db test.db
305755ed41fSdando_execsql_test 8.1 {
306755ed41fSdan  ALTER TABLE t1 DROP COLUMN b;
307755ed41fSdan}
308755ed41fSdando_execsql_test 8.2 {
309755ed41fSdan  SELECT sql FROM sqlite_schema;
310755ed41fSdan} {{CREATE TABLE t1(a INTEGER PRIMARY KEY AUTOINCREMENT)}}
311755ed41fSdan
312*0a746cc5Sdan#-------------------------------------------------------------------------
313*0a746cc5Sdan
314*0a746cc5Sdanforeach {tn wo} {
315*0a746cc5Sdan  1 {}
316*0a746cc5Sdan  2 {WITHOUT ROWID}
317*0a746cc5Sdan} {
318*0a746cc5Sdan  reset_db
319*0a746cc5Sdan  do_execsql_test 9.$tn.0 "
320*0a746cc5Sdan    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c) $wo;
321*0a746cc5Sdan  "
322*0a746cc5Sdan  do_execsql_test 9.$tn.1 {
323*0a746cc5Sdan    WITH s(i) AS (
324*0a746cc5Sdan        SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<50000
325*0a746cc5Sdan    )
326*0a746cc5Sdan    INSERT INTO t1(a, b, c) SELECT i, 123, 456 FROM s;
327*0a746cc5Sdan  }
328*0a746cc5Sdan  do_execsql_test 9.$tn.2 {
329*0a746cc5Sdan    ALTER TABLE t1 DROP COLUMN b;
330*0a746cc5Sdan  }
331*0a746cc5Sdan
332*0a746cc5Sdan  do_execsql_test 9.$tn.3 {
333*0a746cc5Sdan    SELECT count(*), c FROM t1 GROUP BY c;
334*0a746cc5Sdan  } {50000 456}
335*0a746cc5Sdan}
336*0a746cc5Sdan
337755ed41fSdan
338755ed41fSdan
3396e6d9833Sdanfinish_test
340