223 lines
5.9 KiB
Plaintext
223 lines
5.9 KiB
Plaintext
# 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-52436-31752 The column is a PRIMARY KEY or part of one.
|
|
#
|
|
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"
|
|
}
|
|
do_atdc_error_test 2.1.2 {
|
|
CREATE TABLE x1(a,b,c,d,e, PRIMARY KEY(b,c,d));
|
|
} {
|
|
ALTER TABLE x1 DROP COLUMN c
|
|
} {
|
|
cannot drop PRIMARY KEY column: "c"
|
|
}
|
|
|
|
# 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-47838-03249 The column is named in a table or column
|
|
# CHECK constraint not associated with the column being dropped.
|
|
#
|
|
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.
|
|
#
|
|
|
|
# STALE-EVIDENCE: 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
|