119a8e7e8Sdanielk1977# 2005 February 19 219a8e7e8Sdanielk1977# 319a8e7e8Sdanielk1977# The author disclaims copyright to this source code. In place of 419a8e7e8Sdanielk1977# a legal notice, here is a blessing: 519a8e7e8Sdanielk1977# 619a8e7e8Sdanielk1977# May you do good and not evil. 719a8e7e8Sdanielk1977# May you find forgiveness for yourself and forgive others. 819a8e7e8Sdanielk1977# May you share freely, never taking more than you give. 919a8e7e8Sdanielk1977# 1019a8e7e8Sdanielk1977#************************************************************************* 1119a8e7e8Sdanielk1977# This file implements regression tests for SQLite library. The 1219a8e7e8Sdanielk1977# focus of this script is testing that SQLite can handle a subtle 1319a8e7e8Sdanielk1977# file format change that may be used in the future to implement 1419a8e7e8Sdanielk1977# "ALTER TABLE ... ADD COLUMN". 1519a8e7e8Sdanielk1977# 1619a8e7e8Sdanielk1977 1719a8e7e8Sdanielk1977set testdir [file dirname $argv0] 1837b69a01Sdanielk1977 19b3a2ccedSdanielk1977source $testdir/tester.tcl 20b3a2ccedSdanielk1977 2137b69a01Sdanielk1977# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. 2237b69a01Sdanielk1977ifcapable !altertable { 2337b69a01Sdanielk1977 finish_test 2437b69a01Sdanielk1977 return 2537b69a01Sdanielk1977} 2637b69a01Sdanielk1977 2792fd9d28Sdrh# Determine if there is a codec available on this test. 2892fd9d28Sdrh# 2986ae38b5Sdrhif {[catch {sqlite3 -has-codec} r] || $r} { 3092fd9d28Sdrh set has_codec 1 3192fd9d28Sdrh} else { 3292fd9d28Sdrh set has_codec 0 3392fd9d28Sdrh} 3492fd9d28Sdrh 3592fd9d28Sdrh 3619a8e7e8Sdanielk1977# Test Organisation: 3719a8e7e8Sdanielk1977# ------------------ 3819a8e7e8Sdanielk1977# 3919a8e7e8Sdanielk1977# alter3-1.*: Test that ALTER TABLE correctly modifies the CREATE TABLE sql. 4019a8e7e8Sdanielk1977# alter3-2.*: Test error messages. 4119a8e7e8Sdanielk1977# alter3-3.*: Test adding columns with default value NULL. 4219a8e7e8Sdanielk1977# alter3-4.*: Test adding columns with default values other than NULL. 4319a8e7e8Sdanielk1977# alter3-5.*: Test adding columns to tables in ATTACHed databases. 4419a8e7e8Sdanielk1977# alter3-6.*: Test that temp triggers are not accidentally dropped. 4519a8e7e8Sdanielk1977# alter3-7.*: Test that VACUUM resets the file-format. 4619a8e7e8Sdanielk1977# 4719a8e7e8Sdanielk1977 4819a8e7e8Sdanielk1977# This procedure returns the value of the file-format in file 'test.db'. 4919a8e7e8Sdanielk1977# 5019a8e7e8Sdanielk1977proc get_file_format {{fname test.db}} { 51bb8a279eSdrh return [hexio_get_int [hexio_read $fname 44 4]] 5219a8e7e8Sdanielk1977} 5319a8e7e8Sdanielk1977 5419a8e7e8Sdanielk1977do_test alter3-1.1 { 5566c48907Sdrh sqlite3_db_config db LEGACY_FILE_FORMAT 1 5619a8e7e8Sdanielk1977 execsql { 5719a8e7e8Sdanielk1977 CREATE TABLE abc(a, b, c); 5819a8e7e8Sdanielk1977 SELECT sql FROM sqlite_master; 5919a8e7e8Sdanielk1977 } 6019a8e7e8Sdanielk1977} {{CREATE TABLE abc(a, b, c)}} 6119a8e7e8Sdanielk1977do_test alter3-1.2 { 6219a8e7e8Sdanielk1977 execsql {ALTER TABLE abc ADD d INTEGER;} 6319a8e7e8Sdanielk1977 execsql { 6419a8e7e8Sdanielk1977 SELECT sql FROM sqlite_master; 6519a8e7e8Sdanielk1977 } 6619a8e7e8Sdanielk1977} {{CREATE TABLE abc(a, b, c, d INTEGER)}} 6719a8e7e8Sdanielk1977do_test alter3-1.3 { 6819a8e7e8Sdanielk1977 execsql {ALTER TABLE abc ADD e} 6919a8e7e8Sdanielk1977 execsql { 7019a8e7e8Sdanielk1977 SELECT sql FROM sqlite_master; 7119a8e7e8Sdanielk1977 } 7219a8e7e8Sdanielk1977} {{CREATE TABLE abc(a, b, c, d INTEGER, e)}} 7319a8e7e8Sdanielk1977do_test alter3-1.4 { 7419a8e7e8Sdanielk1977 execsql { 7519a8e7e8Sdanielk1977 CREATE TABLE main.t1(a, b); 7619a8e7e8Sdanielk1977 ALTER TABLE t1 ADD c; 7719a8e7e8Sdanielk1977 SELECT sql FROM sqlite_master WHERE tbl_name = 't1'; 7819a8e7e8Sdanielk1977 } 7919a8e7e8Sdanielk1977} {{CREATE TABLE t1(a, b, c)}} 8019a8e7e8Sdanielk1977do_test alter3-1.5 { 8119a8e7e8Sdanielk1977 execsql { 8219a8e7e8Sdanielk1977 ALTER TABLE t1 ADD d CHECK (a>d); 8319a8e7e8Sdanielk1977 SELECT sql FROM sqlite_master WHERE tbl_name = 't1'; 8419a8e7e8Sdanielk1977 } 8519a8e7e8Sdanielk1977} {{CREATE TABLE t1(a, b, c, d CHECK (a>d))}} 86ff890793Sdanielk1977ifcapable foreignkey { 8719a8e7e8Sdanielk1977 do_test alter3-1.6 { 8819a8e7e8Sdanielk1977 execsql { 8919a8e7e8Sdanielk1977 CREATE TABLE t2(a, b, UNIQUE(a, b)); 9019a8e7e8Sdanielk1977 ALTER TABLE t2 ADD c REFERENCES t1(c) ; 9119a8e7e8Sdanielk1977 SELECT sql FROM sqlite_master WHERE tbl_name = 't2' AND type = 'table'; 9219a8e7e8Sdanielk1977 } 9319a8e7e8Sdanielk1977 } {{CREATE TABLE t2(a, b, c REFERENCES t1(c), UNIQUE(a, b))}} 94ff890793Sdanielk1977} 9519a8e7e8Sdanielk1977do_test alter3-1.7 { 9619a8e7e8Sdanielk1977 execsql { 9719a8e7e8Sdanielk1977 CREATE TABLE t3(a, b, UNIQUE(a, b)); 9819a8e7e8Sdanielk1977 ALTER TABLE t3 ADD COLUMN c VARCHAR(10, 20); 9919a8e7e8Sdanielk1977 SELECT sql FROM sqlite_master WHERE tbl_name = 't3' AND type = 'table'; 10019a8e7e8Sdanielk1977 } 10119a8e7e8Sdanielk1977} {{CREATE TABLE t3(a, b, c VARCHAR(10, 20), UNIQUE(a, b))}} 10219a8e7e8Sdanielk1977do_test alter3-1.99 { 103ff890793Sdanielk1977 catchsql { 104ff890793Sdanielk1977 # May not exist if foriegn-keys are omitted at compile time. 105ff890793Sdanielk1977 DROP TABLE t2; 106ff890793Sdanielk1977 } 10719a8e7e8Sdanielk1977 execsql { 10819a8e7e8Sdanielk1977 DROP TABLE abc; 10919a8e7e8Sdanielk1977 DROP TABLE t1; 11019a8e7e8Sdanielk1977 DROP TABLE t3; 11119a8e7e8Sdanielk1977 } 11219a8e7e8Sdanielk1977} {} 11319a8e7e8Sdanielk1977 11419a8e7e8Sdanielk1977do_test alter3-2.1 { 11519a8e7e8Sdanielk1977 execsql { 11619a8e7e8Sdanielk1977 CREATE TABLE t1(a, b); 1179e5fdc41Sdrh INSERT INTO t1 VALUES(1,2); 11819a8e7e8Sdanielk1977 } 11919a8e7e8Sdanielk1977 catchsql { 12019a8e7e8Sdanielk1977 ALTER TABLE t1 ADD c PRIMARY KEY; 12119a8e7e8Sdanielk1977 } 12219a8e7e8Sdanielk1977} {1 {Cannot add a PRIMARY KEY column}} 12319a8e7e8Sdanielk1977do_test alter3-2.2 { 12419a8e7e8Sdanielk1977 catchsql { 12519a8e7e8Sdanielk1977 ALTER TABLE t1 ADD c UNIQUE 12619a8e7e8Sdanielk1977 } 12719a8e7e8Sdanielk1977} {1 {Cannot add a UNIQUE column}} 12819a8e7e8Sdanielk1977do_test alter3-2.3 { 12919a8e7e8Sdanielk1977 catchsql { 13019a8e7e8Sdanielk1977 ALTER TABLE t1 ADD b VARCHAR(10) 13119a8e7e8Sdanielk1977 } 13219a8e7e8Sdanielk1977} {1 {duplicate column name: b}} 13319a8e7e8Sdanielk1977do_test alter3-2.3 { 13419a8e7e8Sdanielk1977 catchsql { 13519a8e7e8Sdanielk1977 ALTER TABLE t1 ADD c NOT NULL; 13619a8e7e8Sdanielk1977 } 13719a8e7e8Sdanielk1977} {1 {Cannot add a NOT NULL column with default value NULL}} 13819a8e7e8Sdanielk1977do_test alter3-2.4 { 13919a8e7e8Sdanielk1977 catchsql { 14019a8e7e8Sdanielk1977 ALTER TABLE t1 ADD c NOT NULL DEFAULT 10; 14119a8e7e8Sdanielk1977 } 14219a8e7e8Sdanielk1977} {0 {}} 1433bdca9c9Sdanielk1977ifcapable view { 14419a8e7e8Sdanielk1977 do_test alter3-2.5 { 14519a8e7e8Sdanielk1977 execsql { 14619a8e7e8Sdanielk1977 CREATE VIEW v1 AS SELECT * FROM t1; 14719a8e7e8Sdanielk1977 } 14819a8e7e8Sdanielk1977 catchsql { 14919a8e7e8Sdanielk1977 alter table v1 add column d; 15019a8e7e8Sdanielk1977 } 15119a8e7e8Sdanielk1977 } {1 {Cannot add a column to a view}} 1523bdca9c9Sdanielk1977} 15319a8e7e8Sdanielk1977do_test alter3-2.6 { 15419a8e7e8Sdanielk1977 catchsql { 15519a8e7e8Sdanielk1977 alter table t1 add column d DEFAULT CURRENT_TIME; 15619a8e7e8Sdanielk1977 } 15719a8e7e8Sdanielk1977} {1 {Cannot add a column with non-constant default}} 15819a8e7e8Sdanielk1977do_test alter3-2.99 { 15919a8e7e8Sdanielk1977 execsql { 16019a8e7e8Sdanielk1977 DROP TABLE t1; 16119a8e7e8Sdanielk1977 } 16219a8e7e8Sdanielk1977} {} 16319a8e7e8Sdanielk1977 16419a8e7e8Sdanielk1977do_test alter3-3.1 { 16519a8e7e8Sdanielk1977 execsql { 16619a8e7e8Sdanielk1977 CREATE TABLE t1(a, b); 16719a8e7e8Sdanielk1977 INSERT INTO t1 VALUES(1, 100); 16819a8e7e8Sdanielk1977 INSERT INTO t1 VALUES(2, 300); 16919a8e7e8Sdanielk1977 SELECT * FROM t1; 17019a8e7e8Sdanielk1977 } 17119a8e7e8Sdanielk1977} {1 100 2 300} 17219a8e7e8Sdanielk1977do_test alter3-3.1 { 17319a8e7e8Sdanielk1977 execsql { 17419a8e7e8Sdanielk1977 PRAGMA schema_version = 10; 17519a8e7e8Sdanielk1977 } 17619a8e7e8Sdanielk1977} {} 17719a8e7e8Sdanielk1977do_test alter3-3.2 { 17819a8e7e8Sdanielk1977 execsql { 17919a8e7e8Sdanielk1977 ALTER TABLE t1 ADD c; 18019a8e7e8Sdanielk1977 SELECT * FROM t1; 18119a8e7e8Sdanielk1977 } 18219a8e7e8Sdanielk1977} {1 100 {} 2 300 {}} 18392fd9d28Sdrhif {!$has_codec} { 18419a8e7e8Sdanielk1977 do_test alter3-3.3 { 18519a8e7e8Sdanielk1977 get_file_format 18686396219Sdrh } {3} 18792fd9d28Sdrh} 1883bdca9c9Sdanielk1977ifcapable schema_version { 18919a8e7e8Sdanielk1977 do_test alter3-3.4 { 19019a8e7e8Sdanielk1977 execsql { 19119a8e7e8Sdanielk1977 PRAGMA schema_version; 19219a8e7e8Sdanielk1977 } 19319a8e7e8Sdanielk1977 } {11} 1943bdca9c9Sdanielk1977} 19519a8e7e8Sdanielk1977 19619a8e7e8Sdanielk1977do_test alter3-4.1 { 19719a8e7e8Sdanielk1977 db close 198fda06befSmistachkin forcedelete test.db 19919a8e7e8Sdanielk1977 set ::DB [sqlite3 db test.db] 20066c48907Sdrh sqlite3_db_config db LEGACY_FILE_FORMAT 1 20119a8e7e8Sdanielk1977 execsql { 20219a8e7e8Sdanielk1977 CREATE TABLE t1(a, b); 20319a8e7e8Sdanielk1977 INSERT INTO t1 VALUES(1, 100); 20419a8e7e8Sdanielk1977 INSERT INTO t1 VALUES(2, 300); 20519a8e7e8Sdanielk1977 SELECT * FROM t1; 20619a8e7e8Sdanielk1977 } 20719a8e7e8Sdanielk1977} {1 100 2 300} 20819a8e7e8Sdanielk1977do_test alter3-4.1 { 20919a8e7e8Sdanielk1977 execsql { 21019a8e7e8Sdanielk1977 PRAGMA schema_version = 20; 21119a8e7e8Sdanielk1977 } 21219a8e7e8Sdanielk1977} {} 21319a8e7e8Sdanielk1977do_test alter3-4.2 { 21419a8e7e8Sdanielk1977 execsql { 21519a8e7e8Sdanielk1977 ALTER TABLE t1 ADD c DEFAULT 'hello world'; 21619a8e7e8Sdanielk1977 SELECT * FROM t1; 21719a8e7e8Sdanielk1977 } 21819a8e7e8Sdanielk1977} {1 100 {hello world} 2 300 {hello world}} 21992fd9d28Sdrhif {!$has_codec} { 22019a8e7e8Sdanielk1977 do_test alter3-4.3 { 22119a8e7e8Sdanielk1977 get_file_format 22286396219Sdrh } {3} 22392fd9d28Sdrh} 2243bdca9c9Sdanielk1977ifcapable schema_version { 22519a8e7e8Sdanielk1977 do_test alter3-4.4 { 22619a8e7e8Sdanielk1977 execsql { 22719a8e7e8Sdanielk1977 PRAGMA schema_version; 22819a8e7e8Sdanielk1977 } 22919a8e7e8Sdanielk1977 } {21} 2303bdca9c9Sdanielk1977} 23119a8e7e8Sdanielk1977do_test alter3-4.99 { 23219a8e7e8Sdanielk1977 execsql { 23319a8e7e8Sdanielk1977 DROP TABLE t1; 23419a8e7e8Sdanielk1977 } 23519a8e7e8Sdanielk1977} {} 23619a8e7e8Sdanielk1977 2375a8f9374Sdanielk1977ifcapable attach { 23819a8e7e8Sdanielk1977 do_test alter3-5.1 { 239fda06befSmistachkin forcedelete test2.db 240fda06befSmistachkin forcedelete test2.db-journal 24119a8e7e8Sdanielk1977 execsql { 24219a8e7e8Sdanielk1977 CREATE TABLE t1(a, b); 24319a8e7e8Sdanielk1977 INSERT INTO t1 VALUES(1, 'one'); 24419a8e7e8Sdanielk1977 INSERT INTO t1 VALUES(2, 'two'); 24519a8e7e8Sdanielk1977 ATTACH 'test2.db' AS aux; 24619a8e7e8Sdanielk1977 CREATE TABLE aux.t1 AS SELECT * FROM t1; 24719a8e7e8Sdanielk1977 PRAGMA aux.schema_version = 30; 24819a8e7e8Sdanielk1977 SELECT sql FROM aux.sqlite_master; 24919a8e7e8Sdanielk1977 } 25019a8e7e8Sdanielk1977 } {{CREATE TABLE t1(a,b)}} 25119a8e7e8Sdanielk1977 do_test alter3-5.2 { 25219a8e7e8Sdanielk1977 execsql { 25319a8e7e8Sdanielk1977 ALTER TABLE aux.t1 ADD COLUMN c VARCHAR(128); 25419a8e7e8Sdanielk1977 SELECT sql FROM aux.sqlite_master; 25519a8e7e8Sdanielk1977 } 25619a8e7e8Sdanielk1977 } {{CREATE TABLE t1(a,b, c VARCHAR(128))}} 25719a8e7e8Sdanielk1977 do_test alter3-5.3 { 25819a8e7e8Sdanielk1977 execsql { 25919a8e7e8Sdanielk1977 SELECT * FROM aux.t1; 26019a8e7e8Sdanielk1977 } 26119a8e7e8Sdanielk1977 } {1 one {} 2 two {}} 2623bdca9c9Sdanielk1977 ifcapable schema_version { 26319a8e7e8Sdanielk1977 do_test alter3-5.4 { 26419a8e7e8Sdanielk1977 execsql { 26519a8e7e8Sdanielk1977 PRAGMA aux.schema_version; 26619a8e7e8Sdanielk1977 } 26719a8e7e8Sdanielk1977 } {31} 2683bdca9c9Sdanielk1977 } 26992fd9d28Sdrh if {!$has_codec} { 27019a8e7e8Sdanielk1977 do_test alter3-5.5 { 27119a8e7e8Sdanielk1977 list [get_file_format test2.db] [get_file_format] 27286396219Sdrh } {3 3} 27392fd9d28Sdrh } 27419a8e7e8Sdanielk1977 do_test alter3-5.6 { 27519a8e7e8Sdanielk1977 execsql { 27619a8e7e8Sdanielk1977 ALTER TABLE aux.t1 ADD COLUMN d DEFAULT 1000; 27719a8e7e8Sdanielk1977 SELECT sql FROM aux.sqlite_master; 27819a8e7e8Sdanielk1977 } 27919a8e7e8Sdanielk1977 } {{CREATE TABLE t1(a,b, c VARCHAR(128), d DEFAULT 1000)}} 28019a8e7e8Sdanielk1977 do_test alter3-5.7 { 28119a8e7e8Sdanielk1977 execsql { 28219a8e7e8Sdanielk1977 SELECT * FROM aux.t1; 28319a8e7e8Sdanielk1977 } 28419a8e7e8Sdanielk1977 } {1 one {} 1000 2 two {} 1000} 2853bdca9c9Sdanielk1977 ifcapable schema_version { 28619a8e7e8Sdanielk1977 do_test alter3-5.8 { 28719a8e7e8Sdanielk1977 execsql { 28819a8e7e8Sdanielk1977 PRAGMA aux.schema_version; 28919a8e7e8Sdanielk1977 } 29019a8e7e8Sdanielk1977 } {32} 2913bdca9c9Sdanielk1977 } 29219a8e7e8Sdanielk1977 do_test alter3-5.9 { 29319a8e7e8Sdanielk1977 execsql { 29419a8e7e8Sdanielk1977 SELECT * FROM t1; 29519a8e7e8Sdanielk1977 } 29619a8e7e8Sdanielk1977 } {1 one 2 two} 29719a8e7e8Sdanielk1977 do_test alter3-5.99 { 29819a8e7e8Sdanielk1977 execsql { 29919a8e7e8Sdanielk1977 DROP TABLE aux.t1; 30019a8e7e8Sdanielk1977 DROP TABLE t1; 30119a8e7e8Sdanielk1977 } 30219a8e7e8Sdanielk1977 } {} 3035a8f9374Sdanielk1977} 30419a8e7e8Sdanielk1977 30519a8e7e8Sdanielk1977#---------------------------------------------------------------- 30619a8e7e8Sdanielk1977# Test that the table schema is correctly reloaded when a column 30719a8e7e8Sdanielk1977# is added to a table. 30819a8e7e8Sdanielk1977# 30953c0f748Sdanielk1977ifcapable trigger&&tempdb { 31019a8e7e8Sdanielk1977 do_test alter3-6.1 { 31119a8e7e8Sdanielk1977 execsql { 31219a8e7e8Sdanielk1977 CREATE TABLE t1(a, b); 31319a8e7e8Sdanielk1977 CREATE TABLE log(trig, a, b); 31419a8e7e8Sdanielk1977 31519a8e7e8Sdanielk1977 CREATE TRIGGER t1_a AFTER INSERT ON t1 BEGIN 31619a8e7e8Sdanielk1977 INSERT INTO log VALUES('a', new.a, new.b); 31719a8e7e8Sdanielk1977 END; 31819a8e7e8Sdanielk1977 CREATE TEMP TRIGGER t1_b AFTER INSERT ON t1 BEGIN 31919a8e7e8Sdanielk1977 INSERT INTO log VALUES('b', new.a, new.b); 32019a8e7e8Sdanielk1977 END; 32119a8e7e8Sdanielk1977 32219a8e7e8Sdanielk1977 INSERT INTO t1 VALUES(1, 2); 32319a8e7e8Sdanielk1977 SELECT * FROM log; 32419a8e7e8Sdanielk1977 } 32519a8e7e8Sdanielk1977 } {b 1 2 a 1 2} 32619a8e7e8Sdanielk1977 do_test alter3-6.2 { 32719a8e7e8Sdanielk1977 execsql { 32819a8e7e8Sdanielk1977 ALTER TABLE t1 ADD COLUMN c DEFAULT 'c'; 32919a8e7e8Sdanielk1977 INSERT INTO t1(a, b) VALUES(3, 4); 33019a8e7e8Sdanielk1977 SELECT * FROM log; 33119a8e7e8Sdanielk1977 } 33219a8e7e8Sdanielk1977 } {b 1 2 a 1 2 b 3 4 a 3 4} 33319a8e7e8Sdanielk1977} 33419a8e7e8Sdanielk1977 33592fd9d28Sdrhif {!$has_codec} { 33619a8e7e8Sdanielk1977 ifcapable vacuum { 33719a8e7e8Sdanielk1977 do_test alter3-7.1 { 33819a8e7e8Sdanielk1977 execsql { 33919a8e7e8Sdanielk1977 VACUUM; 34019a8e7e8Sdanielk1977 } 34119a8e7e8Sdanielk1977 get_file_format 34219a8e7e8Sdanielk1977 } {1} 34319a8e7e8Sdanielk1977 do_test alter3-7.2 { 34419a8e7e8Sdanielk1977 execsql { 34519a8e7e8Sdanielk1977 CREATE TABLE abc(a, b, c); 34619a8e7e8Sdanielk1977 ALTER TABLE abc ADD d DEFAULT NULL; 34719a8e7e8Sdanielk1977 } 34819a8e7e8Sdanielk1977 get_file_format 34986396219Sdrh } {3} 35019a8e7e8Sdanielk1977 do_test alter3-7.3 { 35119a8e7e8Sdanielk1977 execsql { 35219a8e7e8Sdanielk1977 ALTER TABLE abc ADD e DEFAULT 10; 35319a8e7e8Sdanielk1977 } 35419a8e7e8Sdanielk1977 get_file_format 35586396219Sdrh } {3} 35619a8e7e8Sdanielk1977 do_test alter3-7.4 { 35719a8e7e8Sdanielk1977 execsql { 35819a8e7e8Sdanielk1977 ALTER TABLE abc ADD f DEFAULT NULL; 35919a8e7e8Sdanielk1977 } 36019a8e7e8Sdanielk1977 get_file_format 36186396219Sdrh } {3} 36219a8e7e8Sdanielk1977 do_test alter3-7.5 { 36319a8e7e8Sdanielk1977 execsql { 36419a8e7e8Sdanielk1977 VACUUM; 36519a8e7e8Sdanielk1977 } 36619a8e7e8Sdanielk1977 get_file_format 36719a8e7e8Sdanielk1977 } {1} 36819a8e7e8Sdanielk1977 } 36992fd9d28Sdrh} 37019a8e7e8Sdanielk1977 371b3a2ccedSdanielk1977# Ticket #1183 - Make sure adding columns to large tables does not cause 372b3a2ccedSdanielk1977# memory corruption (as was the case before this bug was fixed). 373b3a2ccedSdanielk1977do_test alter3-8.1 { 374b3a2ccedSdanielk1977 execsql { 375b3a2ccedSdanielk1977 CREATE TABLE t4(c1); 376b3a2ccedSdanielk1977 } 377b3a2ccedSdanielk1977} {} 378aef0bf64Sdanielk1977set ::sql "" 379b3a2ccedSdanielk1977do_test alter3-8.2 { 380b3a2ccedSdanielk1977 set cols c1 381b3a2ccedSdanielk1977 for {set i 2} {$i < 100} {incr i} { 382b3a2ccedSdanielk1977 execsql " 383b3a2ccedSdanielk1977 ALTER TABLE t4 ADD c$i 384b3a2ccedSdanielk1977 " 385b3a2ccedSdanielk1977 lappend cols c$i 386b3a2ccedSdanielk1977 } 387b3a2ccedSdanielk1977 set ::sql "CREATE TABLE t4([join $cols {, }])" 388b3a2ccedSdanielk1977 list 389b3a2ccedSdanielk1977} {} 390b3a2ccedSdanielk1977do_test alter3-8.2 { 391b3a2ccedSdanielk1977 execsql { 392b3a2ccedSdanielk1977 SELECT sql FROM sqlite_master WHERE name = 't4'; 393b3a2ccedSdanielk1977 } 394b3a2ccedSdanielk1977} [list $::sql] 395b3a2ccedSdanielk1977 396*0f91a535Sdrh# 2021-07-20: Add support for detecting CHECK and NOT NULL constraint 397*0f91a535Sdrh# violations in ALTER TABLE ADD COLUMN 398*0f91a535Sdrh# 399*0f91a535Sdrhreset_db 400*0f91a535Sdrhdo_execsql_test alter3-9.1 { 401*0f91a535Sdrh CREATE TABLE t1(a,b); 402*0f91a535Sdrh INSERT INTO t1 VALUES(1, 2), ('null!',NULL), (3,4); 403*0f91a535Sdrh} {} 404*0f91a535Sdrhdo_catchsql_test alter3-9.2 { 405*0f91a535Sdrh ALTER TABLE t1 ADD COLUMN c CHECK(a!=1); 406*0f91a535Sdrh} {1 {CHECK constraint failed}} 407*0f91a535Sdrhdo_catchsql_test alter3-9.3 { 408*0f91a535Sdrh ALTER TABLE t1 ADD COLUMN c CHECK(a!=3); 409*0f91a535Sdrh} {1 {CHECK constraint failed}} 410*0f91a535Sdrhdo_catchsql_test alter3-9.4 { 411*0f91a535Sdrh ALTER TABLE t1 ADD COLUMN c CHECK(a!=2); 412*0f91a535Sdrh} {0 {}} 413*0f91a535Sdrhdo_catchsql_test alter3-9.5 { 414*0f91a535Sdrh ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL; 415*0f91a535Sdrh} {1 {NOT NULL constraint failed}} 416*0f91a535Sdrhdo_catchsql_test alter3-9.6 { 417*0f91a535Sdrh ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL CHECK(a!=1); 418*0f91a535Sdrh} {1 {CHECK constraint failed}} 419*0f91a535Sdrhdo_catchsql_test alter3-9.7 { 420*0f91a535Sdrh ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL CHECK(a!=3); 421*0f91a535Sdrh} {1 {NOT NULL constraint failed}} 422*0f91a535Sdrh 423*0f91a535Sdrhdo_execsql_test alter3-9.10 { 424*0f91a535Sdrh CREATE TEMP TABLE t0(m,n); 425*0f91a535Sdrh INSERT INTO t0 VALUES(1, 2), ('null!',NULL), (3,4); 426*0f91a535Sdrh ATTACH ':memory:' AS aux1; 427*0f91a535Sdrh CREATE TABLE aux1.t2(x,y); 428*0f91a535Sdrh INSERT INTO t2 VALUES(1, 2), ('null!',NULL), (3,4); 429*0f91a535Sdrh} {} 430*0f91a535Sdrhdo_catchsql_test alter3-9.11 { 431*0f91a535Sdrh ALTER TABLE t0 ADD COLUMN xtra1 AS (n+1) NOT NULL CHECK(m!=1); 432*0f91a535Sdrh} {1 {CHECK constraint failed}} 433*0f91a535Sdrhdo_catchsql_test alter3-9.12 { 434*0f91a535Sdrh ALTER TABLE t0 ADD COLUMN xtra1 AS (n+1) NOT NULL CHECK(m!=3); 435*0f91a535Sdrh} {1 {NOT NULL constraint failed}} 436*0f91a535Sdrhdo_catchsql_test alter3-9.13 { 437*0f91a535Sdrh ALTER TABLE t2 ADD COLUMN xtra1 AS (y+1) NOT NULL CHECK(x!=1); 438*0f91a535Sdrh} {1 {CHECK constraint failed}} 439*0f91a535Sdrhdo_catchsql_test alter3-9.14 { 440*0f91a535Sdrh ALTER TABLE t2 ADD COLUMN xtra1 AS (y+1) NOT NULL CHECK(x!=3); 441*0f91a535Sdrh} {1 {NOT NULL constraint failed}} 442*0f91a535Sdrh 44319a8e7e8Sdanielk1977finish_test 444