]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add tests for ALTER TABLE DROP COLUMN commands.
authordan <Dan Kennedy>
Fri, 19 Feb 2021 15:34:16 +0000 (15:34 +0000)
committerdan <Dan Kennedy>
Fri, 19 Feb 2021 15:34:16 +0000 (15:34 +0000)
FossilOrigin-Name: 05dbea9b26bdcb096194dc531816333f3784eca50b133fe3efede6ab0d233472

manifest
manifest.uuid
test/alterdropcol2.test [new file with mode: 0644]

index 7d02d42122adf543bd938f16111720deb9396a25..87b1469a9c0e3dcc6b02bc6ed31b5eec2ba56c34 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\ssupport\sfor\s"ALTER\sTABLE\s...\sDROP\sCOLUMN\s..."\scommands.
-D 2021-02-19T14:32:58.535
+C Add\stests\sfor\sALTER\sTABLE\sDROP\sCOLUMN\scommands.
+D 2021-02-19T15:34:16.257
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -649,6 +649,7 @@ F test/alterauth2.test 794ac5cef251819fe364b4fe20f12f86e9c5d68070513c7fd26c17cb2
 F test/altercol.test 1d6a6fe698b81e626baea4881f5717f9bc53d7d07f1cd23ee7ad1b931f117ddf
 F test/altercorrupt.test cb17a81f655a0d71bc1e48e44741a5e0905a3b3efbbe485b0b6c7648f2af3eed
 F test/alterdropcol.test baad37ff9b07078ea02dcc33dbfb82bde655f3eee5c453e218f69501c36f02ba
+F test/alterdropcol2.test 3948c805ca52f4621051b35968c18c09d107eb117e2b656c78cee3b2870650c0
 F test/alterlegacy.test f38c6d06cda39e1f7b955bbce57f2e3ef5b7cb566d3d1234502093e228c15811
 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
@@ -1903,8 +1904,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 3c25cb4ab8885a50e2a485fe76f5ffd5dd8ebe1306aca8c0989e0b7fd7dd18d2 126ee1ec4f3565c0cccca98885fa3665a641ea3df251511de16eed2a1c396124
-R a9f6b9c36a39e6908ea00fd7298f0619
-T +closed 126ee1ec4f3565c0cccca98885fa3665a641ea3df251511de16eed2a1c396124
+P c844a331e78949850fde8ed95058cb34f863566944bc9e92e3ae042768f130e1
+R bd5254ae46e1e31d2902be2dbd124020
 U dan
-Z c1e3973235fcf41f620261cabeb4df13
+Z 3710b56eea4906fb9c766789f57cac08
index a03f87c63b55af0be382581ec43330dab0bce827..8d0357d6fbc732356c06e51560ec8c2abebf6b3a 100644 (file)
@@ -1 +1 @@
-c844a331e78949850fde8ed95058cb34f863566944bc9e92e3ae042768f130e1
\ No newline at end of file
+05dbea9b26bdcb096194dc531816333f3784eca50b133fe3efede6ab0d233472
\ No newline at end of file
diff --git a/test/alterdropcol2.test b/test/alterdropcol2.test
new file mode 100644 (file)
index 0000000..8af3677
--- /dev/null
@@ -0,0 +1,214 @@
+# 2021 February 19
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#*************************************************************************
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix alterdropcol2
+
+# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
+ifcapable !altertable {
+  finish_test
+  return
+}
+
+# EVIDENCE-OF: R-58318-35349 The DROP COLUMN syntax is used to remove an
+# existing column from a table.
+do_execsql_test 1.0 {
+  CREATE TABLE t1(c, b, a, PRIMARY KEY(b, a)) WITHOUT ROWID;
+  INSERT INTO t1 VALUES(1, 2, 3), (4, 5, 6);
+}
+do_execsql_test 1.1 {
+  ALTER TABLE t1 DROP c;
+}
+
+# EVIDENCE-OF: The DROP COLUMN command removes the named column from the table,
+# and also rewrites the entire table to purge the data associated with that
+# column.  
+do_execsql_test 1.2.1 {
+  SELECT * FROM t1;
+} {2 3   5 6}
+
+do_execsql_test 1.2.2 {
+  SELECT sql FROM sqlite_schema;
+} {
+  {CREATE TABLE t1(b, a, PRIMARY KEY(b, a)) WITHOUT ROWID}
+}
+
+proc do_atdc_error_test {tn schema atdc error} {
+  reset_db
+  execsql $schema
+  uplevel [list do_catchsql_test $tn $atdc [list 1 [string trim $error]]]
+}
+
+#-------------------------------------------------------------------------
+# Test cases 2.* attempt to verify the following:
+#
+# EVIDENCE-OF: R-24098-10282 The DROP COLUMN command only works if the column
+# is not referenced by any other parts of the schema and is not a PRIMARY KEY
+# and does not have a UNIQUE constraint.
+#
+
+# EVIDENCE-OF: R-05184-13006 The column is a PRIMARY KEY.
+#
+do_atdc_error_test 2.1.1 {
+  CREATE TABLE x1(a PRIMARY KEY, b, c);
+} { 
+  ALTER TABLE x1 DROP COLUMN a 
+} {
+  cannot drop PRIMARY KEY column: "a"
+}
+
+# EVIDENCE-OF: R-43412-16016 The column has a UNIQUE constraint.
+#
+do_atdc_error_test 2.2.1 {
+  CREATE TABLE x1(a PRIMARY KEY, b, c UNIQUE);
+} { 
+  ALTER TABLE x1 DROP COLUMN c 
+} {
+  cannot drop UNIQUE column: "c"
+}
+do_atdc_error_test 2.2.2 {
+  CREATE TABLE x1(a PRIMARY KEY, b, c, UNIQUE(b, c));
+} { 
+  ALTER TABLE x1 DROP COLUMN c 
+} {
+  error in table x1 after drop column: no such column: c
+}
+
+# EVIDENCE-OF: R-46731-08965: The column is indexed.
+#
+do_atdc_error_test 2.3.1 {
+  CREATE TABLE 'one two'('x y', 'z 1', 'a b');
+  CREATE INDEX idx ON 'one two'('z 1');
+} { 
+  ALTER TABLE 'one two' DROP COLUMN 'z 1' 
+} {
+  error in index idx after drop column: no such column: z 1
+}
+do_atdc_error_test 2.3.2 {
+  CREATE TABLE x1(a, b, c);
+  CREATE INDEX idx ON x1(a);
+} { 
+  ALTER TABLE x1 DROP COLUMN a;
+} {
+  error in index idx after drop column: no such column: a
+}
+
+# EVIDENCE-OF: R-46731-08965: The column is indexed.
+#
+do_atdc_error_test 2.4.1 {
+  CREATE TABLE x1234(a, b, c PRIMARY KEY) WITHOUT ROWID;
+  CREATE INDEX i1 ON x1234(b) WHERE ((a+5) % 10)==0;
+} { 
+  ALTER TABLE x1234 DROP a
+} {
+  error in index i1 after drop column: no such column: a
+}
+
+# EVIDENCE-OF: R-18825-17786 The column appears in a table CHECK constraint.
+#
+do_atdc_error_test 2.5.1 {
+  CREATE TABLE x1234(a, b, c PRIMARY KEY, CHECK(((a+5)%10)!=0)) WITHOUT ROWID;
+} { 
+  ALTER TABLE x1234 DROP a
+} {
+  error in table x1234 after drop column: no such column: a
+}
+
+# EVIDENCE-OF: R-55640-01652 The column is used in a foreign key constraint.
+#
+do_atdc_error_test 2.6.1 {
+  CREATE TABLE p1(x, y UNIQUE);
+  CREATE TABLE c1(u, v, FOREIGN KEY (v) REFERENCES p1(y))
+} { 
+  ALTER TABLE c1 DROP v
+} {
+  error in table c1 after drop column: unknown column "v" in foreign key definition
+}
+
+# EVIDENCE-OF: R-20795-39479 The column is used in the expression of a 
+# generated column.
+do_atdc_error_test 2.7.1 {
+  CREATE TABLE c1(u, v, w AS (u+v));
+} { 
+  ALTER TABLE c1 DROP v
+} {
+  error in table c1 after drop column: no such column: v
+}
+do_atdc_error_test 2.7.2 {
+  CREATE TABLE c1(u, v, w AS (u+v) STORED);
+} { 
+  ALTER TABLE c1 DROP u
+} {
+  error in table c1 after drop column: no such column: u
+}
+
+# EVIDENCE-OF: R-01515-49025 The column appears in a trigger or view.
+#
+do_atdc_error_test 2.8.1 {
+  CREATE TABLE log(l);
+  CREATE TABLE c1(u, v, w);
+  CREATE TRIGGER tr1 AFTER INSERT ON c1 BEGIN
+    INSERT INTO log VALUES(new.w);
+  END;
+} { 
+  ALTER TABLE c1 DROP w
+} {
+  error in trigger tr1 after drop column: no such column: new.w
+}
+do_atdc_error_test 2.8.2 {
+  CREATE TABLE c1(u, v, w);
+  CREATE VIEW v1 AS SELECT u, v, w FROM c1;
+} { 
+  ALTER TABLE c1 DROP w
+} {
+  error in view v1 after drop column: no such column: w
+}
+do_atdc_error_test 2.8.3 {
+  CREATE TABLE c1(u, v, w);
+  CREATE VIEW v1 AS SELECT * FROM c1 WHERE w IS NOT NULL;
+} { 
+  ALTER TABLE c1 DROP w
+} {
+  error in view v1 after drop column: no such column: w
+}
+
+#-------------------------------------------------------------------------
+# Verify that a column that is part of a CHECK constraint may be dropped
+# if the CHECK constraint was specified as part of the column definition.
+#
+
+# EVIDENCE-OF: R-60924-11170 However, the column being deleted can be used in a
+# column CHECK constraint because the column CHECK constraint is dropped
+# together with the column itself.
+do_execsql_test 3.0 {
+  CREATE TABLE yyy(q, w, e CHECK (e > 0), r);
+  INSERT INTO yyy VALUES(1,1,1,1), (2,2,2,2);
+
+  CREATE TABLE zzz(q, w, e, r, CHECK (e > 0));
+  INSERT INTO zzz VALUES(1,1,1,1), (2,2,2,2);
+}
+do_catchsql_test 3.1.1 {
+  INSERT INTO yyy VALUES(0,0,0,0);
+} {1 {CHECK constraint failed: e > 0}}
+do_catchsql_test 3.1.2 {
+  INSERT INTO yyy VALUES(0,0,0,0);
+} {1 {CHECK constraint failed: e > 0}}
+
+do_execsql_test 3.2.1 {
+  ALTER TABLE yyy DROP e;
+}
+do_catchsql_test 3.2.2 {
+  ALTER TABLE zzz DROP e;
+} {1 {error in table zzz after drop column: no such column: e}}
+
+finish_test