Annotation of embedaddon/sqlite3/test/alter3.test, revision 1.1.1.1

1.1       misho       1: # 2005 February 19
                      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: alter3.test,v 1.11 2008/03/19 00:21:31 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: # Determine if there is a codec available on this test.
                     30: #
                     31: if {[catch {sqlite3 -has-codec} r] || $r} {
                     32:   set has_codec 1
                     33: } else {
                     34:   set has_codec 0
                     35: }
                     36: 
                     37: 
                     38: # Test Organisation:
                     39: # ------------------
                     40: #
                     41: # alter3-1.*: Test that ALTER TABLE correctly modifies the CREATE TABLE sql.
                     42: # alter3-2.*: Test error messages.
                     43: # alter3-3.*: Test adding columns with default value NULL.
                     44: # alter3-4.*: Test adding columns with default values other than NULL.
                     45: # alter3-5.*: Test adding columns to tables in ATTACHed databases.
                     46: # alter3-6.*: Test that temp triggers are not accidentally dropped.
                     47: # alter3-7.*: Test that VACUUM resets the file-format.
                     48: #
                     49: 
                     50: # This procedure returns the value of the file-format in file 'test.db'.
                     51: # 
                     52: proc get_file_format {{fname test.db}} {
                     53:   return [hexio_get_int [hexio_read $fname 44 4]]
                     54: }
                     55: 
                     56: do_test alter3-1.1 {
                     57:   execsql {
                     58:     PRAGMA legacy_file_format=ON;
                     59:     CREATE TABLE abc(a, b, c);
                     60:     SELECT sql FROM sqlite_master;
                     61:   }
                     62: } {{CREATE TABLE abc(a, b, c)}}
                     63: do_test alter3-1.2 {
                     64:   execsql {ALTER TABLE abc ADD d INTEGER;}
                     65:   execsql {
                     66:     SELECT sql FROM sqlite_master;
                     67:   }
                     68: } {{CREATE TABLE abc(a, b, c, d INTEGER)}}
                     69: do_test alter3-1.3 {
                     70:   execsql {ALTER TABLE abc ADD e}
                     71:   execsql {
                     72:     SELECT sql FROM sqlite_master;
                     73:   }
                     74: } {{CREATE TABLE abc(a, b, c, d INTEGER, e)}}
                     75: do_test alter3-1.4 {
                     76:   execsql {
                     77:     CREATE TABLE main.t1(a, b);
                     78:     ALTER TABLE t1 ADD c;
                     79:     SELECT sql FROM sqlite_master WHERE tbl_name = 't1';
                     80:   }
                     81: } {{CREATE TABLE t1(a, b, c)}}
                     82: do_test alter3-1.5 {
                     83:   execsql {
                     84:     ALTER TABLE t1 ADD d CHECK (a>d);
                     85:     SELECT sql FROM sqlite_master WHERE tbl_name = 't1';
                     86:   }
                     87: } {{CREATE TABLE t1(a, b, c, d CHECK (a>d))}}
                     88: ifcapable foreignkey {
                     89:   do_test alter3-1.6 {
                     90:     execsql {
                     91:       CREATE TABLE t2(a, b, UNIQUE(a, b));
                     92:       ALTER TABLE t2 ADD c REFERENCES t1(c)  ;
                     93:       SELECT sql FROM sqlite_master WHERE tbl_name = 't2' AND type = 'table';
                     94:     }
                     95:   } {{CREATE TABLE t2(a, b, c REFERENCES t1(c), UNIQUE(a, b))}}
                     96: }
                     97: do_test alter3-1.7 {
                     98:   execsql {
                     99:     CREATE TABLE t3(a, b, UNIQUE(a, b));
                    100:     ALTER TABLE t3 ADD COLUMN c VARCHAR(10, 20);
                    101:     SELECT sql FROM sqlite_master WHERE tbl_name = 't3' AND type = 'table';
                    102:   }
                    103: } {{CREATE TABLE t3(a, b, c VARCHAR(10, 20), UNIQUE(a, b))}}
                    104: do_test alter3-1.99 {
                    105:   catchsql {
                    106:     # May not exist if foriegn-keys are omitted at compile time.
                    107:     DROP TABLE t2; 
                    108:   }
                    109:   execsql {
                    110:     DROP TABLE abc; 
                    111:     DROP TABLE t1; 
                    112:     DROP TABLE t3; 
                    113:   }
                    114: } {}
                    115: 
                    116: do_test alter3-2.1 {
                    117:   execsql {
                    118:     CREATE TABLE t1(a, b);
                    119:   }
                    120:   catchsql {
                    121:     ALTER TABLE t1 ADD c PRIMARY KEY;
                    122:   }
                    123: } {1 {Cannot add a PRIMARY KEY column}}
                    124: do_test alter3-2.2 {
                    125:   catchsql {
                    126:     ALTER TABLE t1 ADD c UNIQUE
                    127:   }
                    128: } {1 {Cannot add a UNIQUE column}}
                    129: do_test alter3-2.3 {
                    130:   catchsql {
                    131:     ALTER TABLE t1 ADD b VARCHAR(10)
                    132:   }
                    133: } {1 {duplicate column name: b}}
                    134: do_test alter3-2.3 {
                    135:   catchsql {
                    136:     ALTER TABLE t1 ADD c NOT NULL;
                    137:   }
                    138: } {1 {Cannot add a NOT NULL column with default value NULL}}
                    139: do_test alter3-2.4 {
                    140:   catchsql {
                    141:     ALTER TABLE t1 ADD c NOT NULL DEFAULT 10;
                    142:   }
                    143: } {0 {}}
                    144: ifcapable view {
                    145:   do_test alter3-2.5 {
                    146:     execsql {
                    147:       CREATE VIEW v1 AS SELECT * FROM t1;
                    148:     }
                    149:     catchsql {
                    150:       alter table v1 add column d;
                    151:     }
                    152:   } {1 {Cannot add a column to a view}}
                    153: }
                    154: do_test alter3-2.6 {
                    155:   catchsql {
                    156:     alter table t1 add column d DEFAULT CURRENT_TIME;
                    157:   }
                    158: } {1 {Cannot add a column with non-constant default}}
                    159: do_test alter3-2.99 {
                    160:   execsql {
                    161:     DROP TABLE t1;
                    162:   }
                    163: } {}
                    164: 
                    165: do_test alter3-3.1 {
                    166:   execsql {
                    167:     CREATE TABLE t1(a, b);
                    168:     INSERT INTO t1 VALUES(1, 100);
                    169:     INSERT INTO t1 VALUES(2, 300);
                    170:     SELECT * FROM t1;
                    171:   }
                    172: } {1 100 2 300}
                    173: do_test alter3-3.1 {
                    174:   execsql {
                    175:     PRAGMA schema_version = 10;
                    176:   }
                    177: } {}
                    178: do_test alter3-3.2 {
                    179:   execsql {
                    180:     ALTER TABLE t1 ADD c;
                    181:     SELECT * FROM t1;
                    182:   }
                    183: } {1 100 {} 2 300 {}}
                    184: if {!$has_codec} {
                    185:   do_test alter3-3.3 {
                    186:     get_file_format
                    187:   } {3}
                    188: }
                    189: ifcapable schema_version {
                    190:   do_test alter3-3.4 {
                    191:     execsql {
                    192:       PRAGMA schema_version;
                    193:     }
                    194:   } {11}
                    195: }
                    196: 
                    197: do_test alter3-4.1 {
                    198:   db close
                    199:   forcedelete test.db
                    200:   set ::DB [sqlite3 db test.db]
                    201:   execsql {
                    202:     PRAGMA legacy_file_format=ON;
                    203:     CREATE TABLE t1(a, b);
                    204:     INSERT INTO t1 VALUES(1, 100);
                    205:     INSERT INTO t1 VALUES(2, 300);
                    206:     SELECT * FROM t1;
                    207:   }
                    208: } {1 100 2 300}
                    209: do_test alter3-4.1 {
                    210:   execsql {
                    211:     PRAGMA schema_version = 20;
                    212:   }
                    213: } {}
                    214: do_test alter3-4.2 {
                    215:   execsql {
                    216:     ALTER TABLE t1 ADD c DEFAULT 'hello world';
                    217:     SELECT * FROM t1;
                    218:   }
                    219: } {1 100 {hello world} 2 300 {hello world}}
                    220: if {!$has_codec} {
                    221:   do_test alter3-4.3 {
                    222:     get_file_format
                    223:   } {3}
                    224: }
                    225: ifcapable schema_version {
                    226:   do_test alter3-4.4 {
                    227:     execsql {
                    228:       PRAGMA schema_version;
                    229:     }
                    230:   } {21}
                    231: }
                    232: do_test alter3-4.99 {
                    233:   execsql {
                    234:     DROP TABLE t1;
                    235:   }
                    236: } {}
                    237: 
                    238: ifcapable attach {
                    239:   do_test alter3-5.1 {
                    240:     forcedelete test2.db
                    241:     forcedelete test2.db-journal
                    242:     execsql {
                    243:       CREATE TABLE t1(a, b);
                    244:       INSERT INTO t1 VALUES(1, 'one');
                    245:       INSERT INTO t1 VALUES(2, 'two');
                    246:       ATTACH 'test2.db' AS aux;
                    247:       CREATE TABLE aux.t1 AS SELECT * FROM t1;
                    248:       PRAGMA aux.schema_version = 30;
                    249:       SELECT sql FROM aux.sqlite_master;
                    250:     } 
                    251:   } {{CREATE TABLE t1(a,b)}}
                    252:   do_test alter3-5.2 {
                    253:     execsql {
                    254:       ALTER TABLE aux.t1 ADD COLUMN c VARCHAR(128);
                    255:       SELECT sql FROM aux.sqlite_master;
                    256:     }
                    257:   } {{CREATE TABLE t1(a,b, c VARCHAR(128))}}
                    258:   do_test alter3-5.3 {
                    259:     execsql {
                    260:       SELECT * FROM aux.t1;
                    261:     }
                    262:   } {1 one {} 2 two {}}
                    263:   ifcapable schema_version {
                    264:     do_test alter3-5.4 {
                    265:       execsql {
                    266:         PRAGMA aux.schema_version;
                    267:       }
                    268:     } {31}
                    269:   }
                    270:   if {!$has_codec} {
                    271:     do_test alter3-5.5 {
                    272:       list [get_file_format test2.db] [get_file_format]
                    273:     } {2 3}
                    274:   }
                    275:   do_test alter3-5.6 {
                    276:     execsql {
                    277:       ALTER TABLE aux.t1 ADD COLUMN d DEFAULT 1000;
                    278:       SELECT sql FROM aux.sqlite_master;
                    279:     }
                    280:   } {{CREATE TABLE t1(a,b, c VARCHAR(128), d DEFAULT 1000)}}
                    281:   do_test alter3-5.7 {
                    282:     execsql {
                    283:       SELECT * FROM aux.t1;
                    284:     }
                    285:   } {1 one {} 1000 2 two {} 1000}
                    286:   ifcapable schema_version {
                    287:     do_test alter3-5.8 {
                    288:       execsql {
                    289:         PRAGMA aux.schema_version;
                    290:       }
                    291:     } {32}
                    292:   }
                    293:   do_test alter3-5.9 {
                    294:     execsql {
                    295:       SELECT * FROM t1;
                    296:     }
                    297:   } {1 one 2 two}
                    298:   do_test alter3-5.99 {
                    299:     execsql {
                    300:       DROP TABLE aux.t1;
                    301:       DROP TABLE t1;
                    302:     }
                    303:   } {}
                    304: }
                    305: 
                    306: #----------------------------------------------------------------
                    307: # Test that the table schema is correctly reloaded when a column
                    308: # is added to a table.
                    309: #
                    310: ifcapable trigger&&tempdb {
                    311:   do_test alter3-6.1 {
                    312:     execsql {
                    313:       CREATE TABLE t1(a, b);
                    314:       CREATE TABLE log(trig, a, b);
                    315: 
                    316:       CREATE TRIGGER t1_a AFTER INSERT ON t1 BEGIN
                    317:         INSERT INTO log VALUES('a', new.a, new.b);
                    318:       END;
                    319:       CREATE TEMP TRIGGER t1_b AFTER INSERT ON t1 BEGIN
                    320:         INSERT INTO log VALUES('b', new.a, new.b);
                    321:       END;
                    322:   
                    323:       INSERT INTO t1 VALUES(1, 2);
                    324:       SELECT * FROM log;
                    325:     }
                    326:   } {b 1 2 a 1 2}
                    327:   do_test alter3-6.2 {
                    328:     execsql {
                    329:       ALTER TABLE t1 ADD COLUMN c DEFAULT 'c';
                    330:       INSERT INTO t1(a, b) VALUES(3, 4);
                    331:       SELECT * FROM log;
                    332:     }
                    333:   } {b 1 2 a 1 2 b 3 4 a 3 4}
                    334: }
                    335: 
                    336: if {!$has_codec} {
                    337:   ifcapable vacuum {
                    338:     do_test alter3-7.1 {
                    339:       execsql {
                    340:         VACUUM;
                    341:       }
                    342:       get_file_format
                    343:     } {1}
                    344:     do_test alter3-7.2 {
                    345:       execsql {
                    346:         CREATE TABLE abc(a, b, c);
                    347:         ALTER TABLE abc ADD d DEFAULT NULL;
                    348:       }
                    349:       get_file_format
                    350:     } {2}
                    351:     do_test alter3-7.3 {
                    352:       execsql {
                    353:         ALTER TABLE abc ADD e DEFAULT 10;
                    354:       }
                    355:       get_file_format
                    356:     } {3}
                    357:     do_test alter3-7.4 {
                    358:       execsql {
                    359:         ALTER TABLE abc ADD f DEFAULT NULL;
                    360:       }
                    361:       get_file_format
                    362:     } {3}
                    363:     do_test alter3-7.5 {
                    364:       execsql {
                    365:         VACUUM;
                    366:       }
                    367:       get_file_format
                    368:     } {1}
                    369:   }
                    370: }
                    371: 
                    372: # Ticket #1183 - Make sure adding columns to large tables does not cause
                    373: # memory corruption (as was the case before this bug was fixed).
                    374: do_test alter3-8.1 {
                    375:   execsql {
                    376:     CREATE TABLE t4(c1);
                    377:   }
                    378: } {}
                    379: set ::sql ""
                    380: do_test alter3-8.2 {
                    381:   set cols c1
                    382:   for {set i 2} {$i < 100} {incr i} {
                    383:     execsql "
                    384:       ALTER TABLE t4 ADD c$i
                    385:     "
                    386:     lappend cols c$i
                    387:   }
                    388:   set ::sql "CREATE TABLE t4([join $cols {, }])"
                    389:   list 
                    390: } {}
                    391: do_test alter3-8.2 {
                    392:   execsql {
                    393:     SELECT sql FROM sqlite_master WHERE name = 't4';
                    394:   }
                    395: } [list $::sql]
                    396: 
                    397: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>