Annotation of embedaddon/sqlite3/test/alter4.test, revision 1.1.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>