Annotation of embedaddon/sqlite3/test/alter4.test, revision 1.1
1.1 ! misho 1: # 2009 February 2
! 2: #
! 3: # The author disclaims copyright to this source code. In place of
! 4: # 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: # This file implements regression tests for SQLite library. The
! 12: # focus of this script is testing that SQLite can handle a subtle
! 13: # file format change that may be used in the future to implement
! 14: # "ALTER TABLE ... ADD COLUMN".
! 15: #
! 16: # $Id: alter4.test,v 1.1 2009/02/02 18:03:22 drh Exp $
! 17: #
! 18:
! 19: set testdir [file dirname $argv0]
! 20:
! 21: source $testdir/tester.tcl
! 22:
! 23: # If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
! 24: ifcapable !altertable {
! 25: finish_test
! 26: return
! 27: }
! 28:
! 29:
! 30: # Test Organisation:
! 31: # ------------------
! 32: #
! 33: # alter4-1.*: Test that ALTER TABLE correctly modifies the CREATE TABLE sql.
! 34: # alter4-2.*: Test error messages.
! 35: # alter4-3.*: Test adding columns with default value NULL.
! 36: # alter4-4.*: Test adding columns with default values other than NULL.
! 37: # alter4-5.*: Test adding columns to tables in ATTACHed databases.
! 38: # alter4-6.*: Test that temp triggers are not accidentally dropped.
! 39: # alter4-7.*: Test that VACUUM resets the file-format.
! 40: #
! 41:
! 42: do_test alter4-1.1 {
! 43: execsql {
! 44: CREATE TEMP TABLE abc(a, b, c);
! 45: SELECT sql FROM sqlite_temp_master;
! 46: }
! 47: } {{CREATE TABLE abc(a, b, c)}}
! 48: do_test alter4-1.2 {
! 49: execsql {ALTER TABLE abc ADD d INTEGER;}
! 50: execsql {
! 51: SELECT sql FROM sqlite_temp_master;
! 52: }
! 53: } {{CREATE TABLE abc(a, b, c, d INTEGER)}}
! 54: do_test alter4-1.3 {
! 55: execsql {ALTER TABLE abc ADD e}
! 56: execsql {
! 57: SELECT sql FROM sqlite_temp_master;
! 58: }
! 59: } {{CREATE TABLE abc(a, b, c, d INTEGER, e)}}
! 60: do_test alter4-1.4 {
! 61: execsql {
! 62: CREATE TABLE temp.t1(a, b);
! 63: ALTER TABLE t1 ADD c;
! 64: SELECT sql FROM sqlite_temp_master WHERE tbl_name = 't1';
! 65: }
! 66: } {{CREATE TABLE t1(a, b, c)}}
! 67: do_test alter4-1.5 {
! 68: execsql {
! 69: ALTER TABLE t1 ADD d CHECK (a>d);
! 70: SELECT sql FROM sqlite_temp_master WHERE tbl_name = 't1';
! 71: }
! 72: } {{CREATE TABLE t1(a, b, c, d CHECK (a>d))}}
! 73: ifcapable foreignkey {
! 74: do_test alter4-1.6 {
! 75: execsql {
! 76: CREATE TEMP TABLE t2(a, b, UNIQUE(a, b));
! 77: ALTER TABLE t2 ADD c REFERENCES t1(c) ;
! 78: SELECT sql FROM sqlite_temp_master
! 79: WHERE tbl_name = 't2' AND type = 'table';
! 80: }
! 81: } {{CREATE TABLE t2(a, b, c REFERENCES t1(c), UNIQUE(a, b))}}
! 82: }
! 83: do_test alter4-1.7 {
! 84: execsql {
! 85: CREATE TEMPORARY TABLE t3(a, b, UNIQUE(a, b));
! 86: ALTER TABLE t3 ADD COLUMN c VARCHAR(10, 20);
! 87: SELECT sql FROM sqlite_temp_master
! 88: WHERE tbl_name = 't3' AND type = 'table';
! 89: }
! 90: } {{CREATE TABLE t3(a, b, c VARCHAR(10, 20), UNIQUE(a, b))}}
! 91: do_test alter4-1.99 {
! 92: catchsql {
! 93: # May not exist if foriegn-keys are omitted at compile time.
! 94: DROP TABLE t2;
! 95: }
! 96: execsql {
! 97: DROP TABLE abc;
! 98: DROP TABLE t1;
! 99: DROP TABLE t3;
! 100: }
! 101: } {}
! 102:
! 103: do_test alter4-2.1 {
! 104: execsql {
! 105: CREATE TABLE temp.t1(a, b);
! 106: }
! 107: catchsql {
! 108: ALTER TABLE t1 ADD c PRIMARY KEY;
! 109: }
! 110: } {1 {Cannot add a PRIMARY KEY column}}
! 111: do_test alter4-2.2 {
! 112: catchsql {
! 113: ALTER TABLE t1 ADD c UNIQUE
! 114: }
! 115: } {1 {Cannot add a UNIQUE column}}
! 116: do_test alter4-2.3 {
! 117: catchsql {
! 118: ALTER TABLE t1 ADD b VARCHAR(10)
! 119: }
! 120: } {1 {duplicate column name: b}}
! 121: do_test alter4-2.3 {
! 122: catchsql {
! 123: ALTER TABLE t1 ADD c NOT NULL;
! 124: }
! 125: } {1 {Cannot add a NOT NULL column with default value NULL}}
! 126: do_test alter4-2.4 {
! 127: catchsql {
! 128: ALTER TABLE t1 ADD c NOT NULL DEFAULT 10;
! 129: }
! 130: } {0 {}}
! 131: ifcapable view {
! 132: do_test alter4-2.5 {
! 133: execsql {
! 134: CREATE TEMPORARY VIEW v1 AS SELECT * FROM t1;
! 135: }
! 136: catchsql {
! 137: alter table v1 add column d;
! 138: }
! 139: } {1 {Cannot add a column to a view}}
! 140: }
! 141: do_test alter4-2.6 {
! 142: catchsql {
! 143: alter table t1 add column d DEFAULT CURRENT_TIME;
! 144: }
! 145: } {1 {Cannot add a column with non-constant default}}
! 146: do_test alter4-2.99 {
! 147: execsql {
! 148: DROP TABLE t1;
! 149: }
! 150: } {}
! 151:
! 152: do_test alter4-3.1 {
! 153: execsql {
! 154: CREATE TEMP TABLE t1(a, b);
! 155: INSERT INTO t1 VALUES(1, 100);
! 156: INSERT INTO t1 VALUES(2, 300);
! 157: SELECT * FROM t1;
! 158: }
! 159: } {1 100 2 300}
! 160: do_test alter4-3.1 {
! 161: execsql {
! 162: PRAGMA schema_version = 10;
! 163: }
! 164: } {}
! 165: do_test alter4-3.2 {
! 166: execsql {
! 167: ALTER TABLE t1 ADD c;
! 168: SELECT * FROM t1;
! 169: }
! 170: } {1 100 {} 2 300 {}}
! 171: ifcapable schema_version {
! 172: do_test alter4-3.4 {
! 173: execsql {
! 174: PRAGMA schema_version;
! 175: }
! 176: } {10}
! 177: }
! 178:
! 179: do_test alter4-4.1 {
! 180: db close
! 181: forcedelete test.db
! 182: set ::DB [sqlite3 db test.db]
! 183: execsql {
! 184: CREATE TEMP TABLE t1(a, b);
! 185: INSERT INTO t1 VALUES(1, 100);
! 186: INSERT INTO t1 VALUES(2, 300);
! 187: SELECT * FROM t1;
! 188: }
! 189: } {1 100 2 300}
! 190: do_test alter4-4.1 {
! 191: execsql {
! 192: PRAGMA schema_version = 20;
! 193: }
! 194: } {}
! 195: do_test alter4-4.2 {
! 196: execsql {
! 197: ALTER TABLE t1 ADD c DEFAULT 'hello world';
! 198: SELECT * FROM t1;
! 199: }
! 200: } {1 100 {hello world} 2 300 {hello world}}
! 201: ifcapable schema_version {
! 202: do_test alter4-4.4 {
! 203: execsql {
! 204: PRAGMA schema_version;
! 205: }
! 206: } {20}
! 207: }
! 208: do_test alter4-4.99 {
! 209: execsql {
! 210: DROP TABLE t1;
! 211: }
! 212: } {}
! 213:
! 214: ifcapable attach {
! 215: do_test alter4-5.1 {
! 216: forcedelete test2.db
! 217: forcedelete test2.db-journal
! 218: execsql {
! 219: CREATE TEMP TABLE t1(a, b);
! 220: INSERT INTO t1 VALUES(1, 'one');
! 221: INSERT INTO t1 VALUES(2, 'two');
! 222: ATTACH 'test2.db' AS aux;
! 223: CREATE TABLE aux.t1 AS SELECT * FROM t1;
! 224: PRAGMA aux.schema_version = 30;
! 225: SELECT sql FROM aux.sqlite_master;
! 226: }
! 227: } {{CREATE TABLE t1(a,b)}}
! 228: do_test alter4-5.2 {
! 229: execsql {
! 230: ALTER TABLE aux.t1 ADD COLUMN c VARCHAR(128);
! 231: SELECT sql FROM aux.sqlite_master;
! 232: }
! 233: } {{CREATE TABLE t1(a,b, c VARCHAR(128))}}
! 234: do_test alter4-5.3 {
! 235: execsql {
! 236: SELECT * FROM aux.t1;
! 237: }
! 238: } {1 one {} 2 two {}}
! 239: ifcapable schema_version {
! 240: do_test alter4-5.4 {
! 241: execsql {
! 242: PRAGMA aux.schema_version;
! 243: }
! 244: } {31}
! 245: }
! 246: do_test alter4-5.6 {
! 247: execsql {
! 248: ALTER TABLE aux.t1 ADD COLUMN d DEFAULT 1000;
! 249: SELECT sql FROM aux.sqlite_master;
! 250: }
! 251: } {{CREATE TABLE t1(a,b, c VARCHAR(128), d DEFAULT 1000)}}
! 252: do_test alter4-5.7 {
! 253: execsql {
! 254: SELECT * FROM aux.t1;
! 255: }
! 256: } {1 one {} 1000 2 two {} 1000}
! 257: ifcapable schema_version {
! 258: do_test alter4-5.8 {
! 259: execsql {
! 260: PRAGMA aux.schema_version;
! 261: }
! 262: } {32}
! 263: }
! 264: do_test alter4-5.9 {
! 265: execsql {
! 266: SELECT * FROM t1;
! 267: }
! 268: } {1 one 2 two}
! 269: do_test alter4-5.99 {
! 270: execsql {
! 271: DROP TABLE aux.t1;
! 272: DROP TABLE t1;
! 273: }
! 274: } {}
! 275: }
! 276:
! 277: #----------------------------------------------------------------
! 278: # Test that the table schema is correctly reloaded when a column
! 279: # is added to a table.
! 280: #
! 281: ifcapable trigger&&tempdb {
! 282: do_test alter4-6.1 {
! 283: execsql {
! 284: CREATE TEMP TABLE t1(a, b);
! 285: CREATE TEMP TABLE log(trig, a, b);
! 286:
! 287: CREATE TRIGGER t1_a AFTER INSERT ON t1 BEGIN
! 288: INSERT INTO log VALUES('a', new.a, new.b);
! 289: END;
! 290: CREATE TEMP TRIGGER t1_b AFTER INSERT ON t1 BEGIN
! 291: INSERT INTO log VALUES('b', new.a, new.b);
! 292: END;
! 293:
! 294: INSERT INTO t1 VALUES(1, 2);
! 295: SELECT * FROM log;
! 296: }
! 297: } {b 1 2 a 1 2}
! 298: do_test alter4-6.2 {
! 299: execsql {
! 300: ALTER TABLE t1 ADD COLUMN c DEFAULT 'c';
! 301: INSERT INTO t1(a, b) VALUES(3, 4);
! 302: SELECT * FROM log;
! 303: }
! 304: } {b 1 2 a 1 2 b 3 4 a 3 4}
! 305: }
! 306:
! 307: # Ticket #1183 - Make sure adding columns to large tables does not cause
! 308: # memory corruption (as was the case before this bug was fixed).
! 309: do_test alter4-8.1 {
! 310: execsql {
! 311: CREATE TEMP TABLE t4(c1);
! 312: }
! 313: } {}
! 314: set ::sql ""
! 315: do_test alter4-8.2 {
! 316: set cols c1
! 317: for {set i 2} {$i < 100} {incr i} {
! 318: execsql "
! 319: ALTER TABLE t4 ADD c$i
! 320: "
! 321: lappend cols c$i
! 322: }
! 323: set ::sql "CREATE TABLE t4([join $cols {, }])"
! 324: list
! 325: } {}
! 326: do_test alter4-8.2 {
! 327: execsql {
! 328: SELECT sql FROM sqlite_temp_master WHERE name = 't4';
! 329: }
! 330: } [list $::sql]
! 331:
! 332: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>