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