Annotation of embedaddon/sqlite3/test/e_createtable.test, revision 1.1

1.1     ! misho       1: # 2010 September 25
        !             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: #
        !            12: # This file implements tests to verify that the "testable statements" in 
        !            13: # the lang_createtable.html document are correct.
        !            14: #
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: 
        !            19: set ::testprefix e_createtable
        !            20: 
        !            21: # Test organization:
        !            22: #
        !            23: #   e_createtable-0.*: Test that the syntax diagrams are correct.
        !            24: #
        !            25: #   e_createtable-1.*: Test statements related to table and database names, 
        !            26: #       the TEMP and TEMPORARY keywords, and the IF NOT EXISTS clause.
        !            27: #
        !            28: #   e_createtable-2.*: Test "CREATE TABLE AS" statements.
        !            29: #
        !            30: 
        !            31: proc do_createtable_tests {nm args} {
        !            32:   uplevel do_select_tests [list e_createtable-$nm] $args
        !            33: }
        !            34: 
        !            35: 
        !            36: #-------------------------------------------------------------------------
        !            37: # This command returns a serialized tcl array mapping from the name of
        !            38: # each attached database to a list of tables in that database. For example,
        !            39: # if the database schema is created with:
        !            40: #
        !            41: #   CREATE TABLE t1(x);
        !            42: #   CREATE TEMP TABLE t2(x);
        !            43: #   CREATE TEMP TABLE t3(x);
        !            44: #
        !            45: # Then this command returns "main t1 temp {t2 t3}".
        !            46: #
        !            47: proc table_list {} {
        !            48:   set res [list]
        !            49:   db eval { pragma database_list } a {
        !            50:     set dbname $a(name)
        !            51:     set master $a(name).sqlite_master
        !            52:     if {$dbname == "temp"} { set master sqlite_temp_master }
        !            53:     lappend res $dbname [
        !            54:       db eval "SELECT DISTINCT tbl_name FROM $master ORDER BY tbl_name"
        !            55:     ]
        !            56:   }
        !            57:   set res
        !            58: }
        !            59: 
        !            60: 
        !            61: # EVIDENCE-OF: R-47266-09114 -- syntax diagram type-name
        !            62: #
        !            63: do_createtable_tests 0.1.1 -repair {
        !            64:   drop_all_tables
        !            65: } {
        !            66:   1   "CREATE TABLE t1(c1 one)"                        {}
        !            67:   2   "CREATE TABLE t1(c1 one two)"                    {}
        !            68:   3   "CREATE TABLE t1(c1 one two three)"              {}
        !            69:   4   "CREATE TABLE t1(c1 one two three four)"         {}
        !            70:   5   "CREATE TABLE t1(c1 one two three four(14))"     {}
        !            71:   6   "CREATE TABLE t1(c1 one two three four(14, 22))" {}
        !            72:   7   "CREATE TABLE t1(c1 var(+14, -22.3))"            {}
        !            73:   8   "CREATE TABLE t1(c1 var(1.0e10))"                {}
        !            74: }
        !            75: do_createtable_tests 0.1.2 -error {
        !            76:   near "%s": syntax error
        !            77: } {
        !            78:   1   "CREATE TABLE t1(c1 one(number))"                {number}
        !            79: }
        !            80: 
        !            81: 
        !            82: # EVIDENCE-OF: R-60689-48779 -- syntax diagram column-constraint
        !            83: #
        !            84: do_createtable_tests 0.2.1 -repair {
        !            85:   drop_all_tables 
        !            86:   execsql { CREATE TABLE t2(x PRIMARY KEY) }
        !            87: } {
        !            88:   1.1   "CREATE TABLE t1(c1 text PRIMARY KEY)"                         {}
        !            89:   1.2   "CREATE TABLE t1(c1 text PRIMARY KEY ASC)"                     {}
        !            90:   1.3   "CREATE TABLE t1(c1 text PRIMARY KEY DESC)"                    {}
        !            91:   1.4   "CREATE TABLE t1(c1 text CONSTRAINT cons PRIMARY KEY DESC)"    {}
        !            92: 
        !            93:   2.1   "CREATE TABLE t1(c1 text NOT NULL)"                            {}
        !            94:   2.2   "CREATE TABLE t1(c1 text CONSTRAINT nm NOT NULL)"              {}
        !            95:   2.3   "CREATE TABLE t1(c1 text NULL)"                                {}
        !            96:   2.4   "CREATE TABLE t1(c1 text CONSTRAINT nm NULL)"                  {}
        !            97: 
        !            98:   3.1   "CREATE TABLE t1(c1 text UNIQUE)"                              {}
        !            99:   3.2   "CREATE TABLE t1(c1 text CONSTRAINT un UNIQUE)"                {}
        !           100: 
        !           101:   4.1   "CREATE TABLE t1(c1 text CHECK(c1!=0))"                        {}
        !           102:   4.2   "CREATE TABLE t1(c1 text CONSTRAINT chk CHECK(c1!=0))"         {}
        !           103: 
        !           104:   5.1   "CREATE TABLE t1(c1 text DEFAULT 1)"                           {}
        !           105:   5.2   "CREATE TABLE t1(c1 text DEFAULT -1)"                          {}
        !           106:   5.3   "CREATE TABLE t1(c1 text DEFAULT +1)"                          {}
        !           107:   5.4   "CREATE TABLE t1(c1 text DEFAULT -45.8e22)"                    {}
        !           108:   5.5   "CREATE TABLE t1(c1 text DEFAULT (1+1))"                       {}
        !           109:   5.6   "CREATE TABLE t1(c1 text CONSTRAINT \"1 2\" DEFAULT (1+1))"    {}
        !           110: 
        !           111:   6.1   "CREATE TABLE t1(c1 text COLLATE nocase)"        {}
        !           112:   6.2   "CREATE TABLE t1(c1 text CONSTRAINT 'a x' COLLATE nocase)"     {}
        !           113: 
        !           114:   7.1   "CREATE TABLE t1(c1 REFERENCES t2)"                            {}
        !           115:   7.2   "CREATE TABLE t1(c1 CONSTRAINT abc REFERENCES t2)"             {}
        !           116: 
        !           117:   8.1   {
        !           118:     CREATE TABLE t1(c1 
        !           119:       PRIMARY KEY NOT NULL UNIQUE CHECK(c1 IS 'ten') DEFAULT 123 REFERENCES t1
        !           120:     );
        !           121:   } {}
        !           122:   8.2   {
        !           123:     CREATE TABLE t1(c1 
        !           124:       REFERENCES t1 DEFAULT 123 CHECK(c1 IS 'ten') UNIQUE NOT NULL PRIMARY KEY 
        !           125:     );
        !           126:   } {}
        !           127: }
        !           128: 
        !           129: # EVIDENCE-OF: R-58169-51804 -- syntax diagram table-constraint
        !           130: #
        !           131: do_createtable_tests 0.3.1 -repair {
        !           132:   drop_all_tables 
        !           133:   execsql { CREATE TABLE t2(x PRIMARY KEY) }
        !           134: } {
        !           135:   1.1   "CREATE TABLE t1(c1, c2, PRIMARY KEY(c1))"                         {}
        !           136:   1.2   "CREATE TABLE t1(c1, c2, PRIMARY KEY(c1, c2))"                     {}
        !           137:   1.3   "CREATE TABLE t1(c1, c2, PRIMARY KEY(c1, c2) ON CONFLICT IGNORE)"  {}
        !           138: 
        !           139:   2.1   "CREATE TABLE t1(c1, c2, UNIQUE(c1))"                              {}
        !           140:   2.2   "CREATE TABLE t1(c1, c2, UNIQUE(c1, c2))"                          {}
        !           141:   2.3   "CREATE TABLE t1(c1, c2, UNIQUE(c1, c2) ON CONFLICT IGNORE)"       {}
        !           142: 
        !           143:   3.1   "CREATE TABLE t1(c1, c2, CHECK(c1 IS NOT c2))"                     {}
        !           144: 
        !           145:   4.1   "CREATE TABLE t1(c1, c2, FOREIGN KEY(c1) REFERENCES t2)"           {}
        !           146: }
        !           147: 
        !           148: # EVIDENCE-OF: R-44826-22243 -- syntax diagram column-def
        !           149: #
        !           150: do_createtable_tests 0.4.1 -repair {
        !           151:   drop_all_tables 
        !           152: } {
        !           153:   1     {CREATE TABLE t1(
        !           154:            col1,
        !           155:            col2 TEXT,
        !           156:            col3 INTEGER UNIQUE,
        !           157:            col4 VARCHAR(10, 10) PRIMARY KEY,
        !           158:            "name with spaces" REFERENCES t1
        !           159:          );
        !           160:         } {}
        !           161: }
        !           162: 
        !           163: # EVIDENCE-OF: R-45698-45677 -- syntax diagram create-table-stmt
        !           164: #
        !           165: do_createtable_tests 0.5.1 -repair {
        !           166:   drop_all_tables 
        !           167:   execsql { CREATE TABLE t2(a, b, c) }
        !           168: } {
        !           169:   1     "CREATE TABLE t1(a, b, c)"                                    {}
        !           170:   2     "CREATE TEMP TABLE t1(a, b, c)"                               {}
        !           171:   3     "CREATE TEMPORARY TABLE t1(a, b, c)"                          {}
        !           172:   4     "CREATE TABLE IF NOT EXISTS t1(a, b, c)"                      {}
        !           173:   5     "CREATE TEMP TABLE IF NOT EXISTS t1(a, b, c)"                 {}
        !           174:   6     "CREATE TEMPORARY TABLE IF NOT EXISTS t1(a, b, c)"            {}
        !           175: 
        !           176:   7     "CREATE TABLE main.t1(a, b, c)"                               {}
        !           177:   8     "CREATE TEMP TABLE temp.t1(a, b, c)"                          {}
        !           178:   9     "CREATE TEMPORARY TABLE temp.t1(a, b, c)"                     {}
        !           179:   10    "CREATE TABLE IF NOT EXISTS main.t1(a, b, c)"                 {}
        !           180:   11    "CREATE TEMP TABLE IF NOT EXISTS temp.t1(a, b, c)"            {}
        !           181:   12    "CREATE TEMPORARY TABLE IF NOT EXISTS temp.t1(a, b, c)"       {}
        !           182: 
        !           183:   13    "CREATE TABLE t1 AS SELECT * FROM t2"                         {}
        !           184:   14    "CREATE TEMP TABLE t1 AS SELECT c, b, a FROM t2"              {}
        !           185:   15    "CREATE TABLE t1 AS SELECT count(*), max(b), min(a) FROM t2"  {}
        !           186: }
        !           187: 
        !           188: # EVIDENCE-OF: R-24369-11919 -- syntax diagram foreign-key-clause
        !           189: #
        !           190: #   1:         Explicit parent-key columns.
        !           191: #   2:         Implicit child-key columns.
        !           192: #
        !           193: #   1:         MATCH FULL
        !           194: #   2:         MATCH PARTIAL
        !           195: #   3:         MATCH SIMPLE
        !           196: #   4:         MATCH STICK
        !           197: #   5:         
        !           198: #
        !           199: #   1:         ON DELETE SET NULL
        !           200: #   2:         ON DELETE SET DEFAULT
        !           201: #   3:         ON DELETE CASCADE
        !           202: #   4:         ON DELETE RESTRICT
        !           203: #   5:         ON DELETE NO ACTION
        !           204: #   6:
        !           205: #
        !           206: #   1:         ON UPDATE SET NULL
        !           207: #   2:         ON UPDATE SET DEFAULT
        !           208: #   3:         ON UPDATE CASCADE
        !           209: #   4:         ON UPDATE RESTRICT
        !           210: #   5:         ON UPDATE NO ACTION
        !           211: #   6:
        !           212: #
        !           213: #   1:         NOT DEFERRABLE INITIALLY DEFERRED
        !           214: #   2:         NOT DEFERRABLE INITIALLY IMMEDIATE
        !           215: #   3:         NOT DEFERRABLE
        !           216: #   4:         DEFERRABLE INITIALLY DEFERRED
        !           217: #   5:         DEFERRABLE INITIALLY IMMEDIATE
        !           218: #   6:         DEFERRABLE
        !           219: #   7:         
        !           220: #
        !           221: do_createtable_tests 0.6.1 -repair {
        !           222:   drop_all_tables 
        !           223:   execsql { CREATE TABLE t2(x PRIMARY KEY, y) }
        !           224:   execsql { CREATE TABLE t3(i, j, UNIQUE(i, j) ) }
        !           225: } {
        !           226:   11146 { CREATE TABLE t1(a 
        !           227:     REFERENCES t2(x) MATCH FULL 
        !           228:     ON DELETE SET NULL ON UPDATE RESTRICT DEFERRABLE
        !           229:   )} {}
        !           230:   11412 { CREATE TABLE t1(a 
        !           231:     REFERENCES t2(x) 
        !           232:     ON DELETE RESTRICT ON UPDATE SET NULL MATCH FULL 
        !           233:     NOT DEFERRABLE INITIALLY IMMEDIATE
        !           234:   )} {}
        !           235:   12135 { CREATE TABLE t1(a 
        !           236:     REFERENCES t2(x) MATCH PARTIAL 
        !           237:     ON DELETE SET NULL ON UPDATE CASCADE DEFERRABLE INITIALLY IMMEDIATE
        !           238:   )} {}
        !           239:   12427 { CREATE TABLE t1(a 
        !           240:     REFERENCES t2(x) MATCH PARTIAL 
        !           241:     ON DELETE RESTRICT ON UPDATE SET DEFAULT 
        !           242:   )} {}
        !           243:   12446 { CREATE TABLE t1(a 
        !           244:     REFERENCES t2(x) MATCH PARTIAL 
        !           245:     ON DELETE RESTRICT ON UPDATE RESTRICT DEFERRABLE
        !           246:   )} {}
        !           247:   12522 { CREATE TABLE t1(a 
        !           248:     REFERENCES t2(x) MATCH PARTIAL 
        !           249:     ON DELETE NO ACTION ON UPDATE SET DEFAULT NOT DEFERRABLE INITIALLY IMMEDIATE
        !           250:   )} {}
        !           251:   13133 { CREATE TABLE t1(a 
        !           252:     REFERENCES t2(x) MATCH SIMPLE 
        !           253:     ON DELETE SET NULL ON UPDATE CASCADE NOT DEFERRABLE
        !           254:   )} {}
        !           255:   13216 { CREATE TABLE t1(a 
        !           256:     REFERENCES t2(x) MATCH SIMPLE 
        !           257:     ON DELETE SET DEFAULT ON UPDATE SET NULL DEFERRABLE
        !           258:   )} {}
        !           259:   13263 { CREATE TABLE t1(a 
        !           260:     REFERENCES t2(x) MATCH SIMPLE 
        !           261:     ON DELETE SET DEFAULT  NOT DEFERRABLE
        !           262:   )} {}
        !           263:   13421 { CREATE TABLE t1(a 
        !           264:     REFERENCES t2(x) MATCH SIMPLE 
        !           265:     ON DELETE RESTRICT ON UPDATE SET DEFAULT NOT DEFERRABLE INITIALLY DEFERRED
        !           266:   )} {}
        !           267:   13432 { CREATE TABLE t1(a 
        !           268:     REFERENCES t2(x) MATCH SIMPLE 
        !           269:     ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
        !           270:   )} {}
        !           271:   13523 { CREATE TABLE t1(a 
        !           272:     REFERENCES t2(x) MATCH SIMPLE 
        !           273:     ON DELETE NO ACTION ON UPDATE SET DEFAULT NOT DEFERRABLE
        !           274:   )} {}
        !           275:   14336 { CREATE TABLE t1(a 
        !           276:     REFERENCES t2(x) MATCH STICK 
        !           277:     ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE
        !           278:   )} {}
        !           279:   14611 { CREATE TABLE t1(a 
        !           280:     REFERENCES t2(x) MATCH STICK 
        !           281:     ON UPDATE SET NULL NOT DEFERRABLE INITIALLY DEFERRED
        !           282:   )} {}
        !           283:   15155 { CREATE TABLE t1(a 
        !           284:     REFERENCES t2(x)
        !           285:     ON DELETE SET NULL ON UPDATE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
        !           286:   )} {}
        !           287:   15453 { CREATE TABLE t1(a 
        !           288:     REFERENCES t2(x) ON DELETE RESTRICT ON UPDATE NO ACTION NOT DEFERRABLE
        !           289:   )} {}
        !           290:   15661 { CREATE TABLE t1(a 
        !           291:     REFERENCES t2(x) NOT DEFERRABLE INITIALLY DEFERRED
        !           292:   )} {}
        !           293:   21115 { CREATE TABLE t1(a 
        !           294:     REFERENCES t2 MATCH FULL 
        !           295:     ON DELETE SET NULL ON UPDATE SET NULL DEFERRABLE INITIALLY IMMEDIATE
        !           296:   )} {}
        !           297:   21123 { CREATE TABLE t1(a 
        !           298:     REFERENCES t2 MATCH FULL 
        !           299:     ON DELETE SET NULL ON UPDATE SET DEFAULT NOT DEFERRABLE
        !           300:   )} {}
        !           301:   21217 { CREATE TABLE t1(a 
        !           302:     REFERENCES t2 MATCH FULL ON DELETE SET DEFAULT ON UPDATE SET NULL 
        !           303:   )} {}
        !           304:   21362 { CREATE TABLE t1(a 
        !           305:     REFERENCES t2 MATCH FULL 
        !           306:     ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
        !           307:   )} {}
        !           308:   22143 { CREATE TABLE t1(a 
        !           309:     REFERENCES t2 MATCH PARTIAL 
        !           310:     ON DELETE SET NULL ON UPDATE RESTRICT NOT DEFERRABLE
        !           311:   )} {}
        !           312:   22156 { CREATE TABLE t1(a 
        !           313:     REFERENCES t2 MATCH PARTIAL 
        !           314:     ON DELETE SET NULL ON UPDATE NO ACTION DEFERRABLE
        !           315:   )} {}
        !           316:   22327 { CREATE TABLE t1(a 
        !           317:     REFERENCES t2 MATCH PARTIAL ON DELETE CASCADE ON UPDATE SET DEFAULT 
        !           318:   )} {}
        !           319:   22663 { CREATE TABLE t1(a 
        !           320:     REFERENCES t2 MATCH PARTIAL NOT DEFERRABLE
        !           321:   )} {}
        !           322:   23236 { CREATE TABLE t1(a 
        !           323:     REFERENCES t2 MATCH SIMPLE 
        !           324:     ON DELETE SET DEFAULT ON UPDATE CASCADE DEFERRABLE
        !           325:   )} {}
        !           326:   24155 { CREATE TABLE t1(a 
        !           327:     REFERENCES t2 MATCH STICK 
        !           328:     ON DELETE SET NULL ON UPDATE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
        !           329:   )} {}
        !           330:   24522 { CREATE TABLE t1(a 
        !           331:     REFERENCES t2 MATCH STICK 
        !           332:     ON DELETE NO ACTION ON UPDATE SET DEFAULT NOT DEFERRABLE INITIALLY IMMEDIATE
        !           333:   )} {}
        !           334:   24625 { CREATE TABLE t1(a 
        !           335:     REFERENCES t2 MATCH STICK 
        !           336:     ON UPDATE SET DEFAULT DEFERRABLE INITIALLY IMMEDIATE
        !           337:   )} {}
        !           338:   25454 { CREATE TABLE t1(a 
        !           339:     REFERENCES t2 
        !           340:     ON DELETE RESTRICT ON UPDATE NO ACTION DEFERRABLE INITIALLY DEFERRED
        !           341:   )} {}
        !           342: }
        !           343: 
        !           344: #-------------------------------------------------------------------------
        !           345: # Test cases e_createtable-1.* - test statements related to table and
        !           346: # database names, the TEMP and TEMPORARY keywords, and the IF NOT EXISTS
        !           347: # clause.
        !           348: #
        !           349: drop_all_tables
        !           350: forcedelete test.db2 test.db3
        !           351: 
        !           352: do_execsql_test e_createtable-1.0 {
        !           353:   ATTACH 'test.db2' AS auxa;
        !           354:   ATTACH 'test.db3' AS auxb;
        !           355: } {}
        !           356: 
        !           357: # EVIDENCE-OF: R-17899-04554 Table names that begin with "sqlite_" are
        !           358: # reserved for internal use. It is an error to attempt to create a table
        !           359: # with a name that starts with "sqlite_".
        !           360: #
        !           361: do_createtable_tests 1.1.1 -error {
        !           362:   object name reserved for internal use: %s
        !           363: } {
        !           364:   1    "CREATE TABLE sqlite_abc(a, b, c)"        sqlite_abc
        !           365:   2    "CREATE TABLE temp.sqlite_helloworld(x)"  sqlite_helloworld
        !           366:   3    {CREATE TABLE auxa."sqlite__"(x, y)}      sqlite__
        !           367:   4    {CREATE TABLE auxb."sqlite_"(z)}          sqlite_
        !           368:   5    {CREATE TABLE "SQLITE_TBL"(z)}            SQLITE_TBL
        !           369: }
        !           370: do_createtable_tests 1.1.2 {
        !           371:   1    "CREATE TABLE sqlit_abc(a, b, c)"         {}
        !           372:   2    "CREATE TABLE temp.sqlitehelloworld(x)"   {}
        !           373:   3    {CREATE TABLE auxa."sqlite"(x, y)}        {}
        !           374:   4    {CREATE TABLE auxb."sqlite-"(z)}          {}
        !           375:   5    {CREATE TABLE "SQLITE-TBL"(z)}            {}
        !           376: }
        !           377: 
        !           378: 
        !           379: # EVIDENCE-OF: R-10195-31023 If a <database-name> is specified, it
        !           380: # must be either "main", "temp", or the name of an attached database.
        !           381: #
        !           382: # EVIDENCE-OF: R-39822-07822 In this case the new table is created in
        !           383: # the named database.
        !           384: #
        !           385: #   Test cases 1.2.* test the first of the two requirements above. The
        !           386: #   second is verified by cases 1.3.*.
        !           387: #
        !           388: do_createtable_tests 1.2.1 -error {
        !           389:   unknown database %s
        !           390: } {
        !           391:   1    "CREATE TABLE george.t1(a, b)"            george
        !           392:   2    "CREATE TABLE _.t1(a, b)"                 _
        !           393: }
        !           394: do_createtable_tests 1.2.2 {
        !           395:   1    "CREATE TABLE main.abc(a, b, c)"          {}
        !           396:   2    "CREATE TABLE temp.helloworld(x)"         {}
        !           397:   3    {CREATE TABLE auxa."t 1"(x, y)}           {}
        !           398:   4    {CREATE TABLE auxb.xyz(z)}                {}
        !           399: }
        !           400: drop_all_tables
        !           401: do_createtable_tests 1.3 -tclquery {
        !           402:   unset -nocomplain X
        !           403:   array set X [table_list]
        !           404:   list $X(main) $X(temp) $X(auxa) $X(auxb)
        !           405: } {
        !           406:   1    "CREATE TABLE main.abc(a, b, c)"  {abc {} {} {}}
        !           407:   2    "CREATE TABLE main.t1(a, b, c)"   {{abc t1} {} {} {}}
        !           408:   3    "CREATE TABLE temp.tmp(a, b, c)"  {{abc t1} tmp {} {}}
        !           409:   4    "CREATE TABLE auxb.tbl(x, y)"     {{abc t1} tmp {} tbl}
        !           410:   5    "CREATE TABLE auxb.t1(k, v)"      {{abc t1} tmp {} {t1 tbl}}
        !           411:   6    "CREATE TABLE auxa.next(c, d)"    {{abc t1} tmp next {t1 tbl}}
        !           412: }
        !           413: 
        !           414: # EVIDENCE-OF: R-18895-27365 If the "TEMP" or "TEMPORARY" keyword occurs
        !           415: # between the "CREATE" and "TABLE" then the new table is created in the
        !           416: # temp database.
        !           417: #
        !           418: drop_all_tables
        !           419: do_createtable_tests 1.4 -tclquery {
        !           420:   unset -nocomplain X
        !           421:   array set X [table_list]
        !           422:   list $X(main) $X(temp) $X(auxa) $X(auxb)
        !           423: } {
        !           424:   1    "CREATE TEMP TABLE t1(a, b)"      {{} t1 {} {}}
        !           425:   2    "CREATE TEMPORARY TABLE t2(a, b)" {{} {t1 t2} {} {}}
        !           426: }
        !           427: 
        !           428: # EVIDENCE-OF: R-49439-47561 It is an error to specify both a
        !           429: # <database-name> and the TEMP or TEMPORARY keyword, unless the
        !           430: # <database-name> is "temp".
        !           431: #
        !           432: drop_all_tables
        !           433: do_createtable_tests 1.5.1 -error {
        !           434:   temporary table name must be unqualified
        !           435: } {
        !           436:   1    "CREATE TEMP TABLE main.t1(a, b)"        {}
        !           437:   2    "CREATE TEMPORARY TABLE auxa.t2(a, b)"   {}
        !           438:   3    "CREATE TEMP TABLE auxb.t3(a, b)"        {}
        !           439:   4    "CREATE TEMPORARY TABLE main.xxx(x)"     {}
        !           440: }
        !           441: drop_all_tables
        !           442: do_createtable_tests 1.5.2 -tclquery {
        !           443:   unset -nocomplain X
        !           444:   array set X [table_list]
        !           445:   list $X(main) $X(temp) $X(auxa) $X(auxb)
        !           446: } {
        !           447:   1    "CREATE TEMP TABLE temp.t1(a, b)"        {{} t1 {} {}}
        !           448:   2    "CREATE TEMPORARY TABLE temp.t2(a, b)"   {{} {t1 t2} {} {}}
        !           449:   3    "CREATE TEMP TABLE TEMP.t3(a, b)"        {{} {t1 t2 t3} {} {}}
        !           450:   4    "CREATE TEMPORARY TABLE TEMP.xxx(x)"     {{} {t1 t2 t3 xxx} {} {}}
        !           451: }
        !           452: 
        !           453: # EVIDENCE-OF: R-00917-09393 If no database name is specified and the
        !           454: # TEMP keyword is not present then the table is created in the main
        !           455: # database.
        !           456: #
        !           457: drop_all_tables
        !           458: do_createtable_tests 1.6 -tclquery {
        !           459:   unset -nocomplain X
        !           460:   array set X [table_list]
        !           461:   list $X(main) $X(temp) $X(auxa) $X(auxb)
        !           462: } {
        !           463:   1    "CREATE TABLE t1(a, b)"   {t1 {} {} {}}
        !           464:   2    "CREATE TABLE t2(a, b)"   {{t1 t2} {} {} {}}
        !           465:   3    "CREATE TABLE t3(a, b)"   {{t1 t2 t3} {} {} {}}
        !           466:   4    "CREATE TABLE xxx(x)"     {{t1 t2 t3 xxx} {} {} {}}
        !           467: }
        !           468: 
        !           469: drop_all_tables
        !           470: do_execsql_test e_createtable-1.7.0 {
        !           471:   CREATE TABLE t1(x, y);
        !           472:   CREATE INDEX i1 ON t1(x);
        !           473:   CREATE VIEW  v1 AS SELECT * FROM t1;
        !           474: 
        !           475:   CREATE TABLE auxa.tbl1(x, y);
        !           476:   CREATE INDEX auxa.idx1 ON tbl1(x);
        !           477:   CREATE VIEW auxa.view1 AS SELECT * FROM tbl1;
        !           478: } {}
        !           479: 
        !           480: # EVIDENCE-OF: R-01232-54838 It is usually an error to attempt to create
        !           481: # a new table in a database that already contains a table, index or view
        !           482: # of the same name.
        !           483: #
        !           484: #   Test cases 1.7.1.* verify that creating a table in a database with a
        !           485: #   table/index/view of the same name does fail. 1.7.2.* tests that creating
        !           486: #   a table with the same name as a table/index/view in a different database
        !           487: #   is Ok.
        !           488: #
        !           489: do_createtable_tests 1.7.1 -error { %s } {
        !           490:   1    "CREATE TABLE t1(a, b)"   {{table t1 already exists}}
        !           491:   2    "CREATE TABLE i1(a, b)"   {{there is already an index named i1}}
        !           492:   3    "CREATE TABLE v1(a, b)"   {{table v1 already exists}}
        !           493:   4    "CREATE TABLE auxa.tbl1(a, b)"   {{table tbl1 already exists}}
        !           494:   5    "CREATE TABLE auxa.idx1(a, b)"   {{there is already an index named idx1}}
        !           495:   6    "CREATE TABLE auxa.view1(a, b)"  {{table view1 already exists}}
        !           496: }
        !           497: do_createtable_tests 1.7.2 {
        !           498:   1    "CREATE TABLE auxa.t1(a, b)"   {}
        !           499:   2    "CREATE TABLE auxa.i1(a, b)"   {}
        !           500:   3    "CREATE TABLE auxa.v1(a, b)"   {}
        !           501:   4    "CREATE TABLE tbl1(a, b)"      {}
        !           502:   5    "CREATE TABLE idx1(a, b)"      {}
        !           503:   6    "CREATE TABLE view1(a, b)"     {}
        !           504: }
        !           505: 
        !           506: # EVIDENCE-OF: R-33917-24086 However, if the "IF NOT EXISTS" clause is
        !           507: # specified as part of the CREATE TABLE statement and a table or view of
        !           508: # the same name already exists, the CREATE TABLE command simply has no
        !           509: # effect (and no error message is returned).
        !           510: #
        !           511: drop_all_tables
        !           512: do_execsql_test e_createtable-1.8.0 {
        !           513:   CREATE TABLE t1(x, y);
        !           514:   CREATE INDEX i1 ON t1(x);
        !           515:   CREATE VIEW  v1 AS SELECT * FROM t1;
        !           516:   CREATE TABLE auxa.tbl1(x, y);
        !           517:   CREATE INDEX auxa.idx1 ON tbl1(x);
        !           518:   CREATE VIEW auxa.view1 AS SELECT * FROM tbl1;
        !           519: } {}
        !           520: do_createtable_tests 1.8 {
        !           521:   1    "CREATE TABLE IF NOT EXISTS t1(a, b)"          {}
        !           522:   2    "CREATE TABLE IF NOT EXISTS auxa.tbl1(a, b)"   {}
        !           523:   3    "CREATE TABLE IF NOT EXISTS v1(a, b)"          {}
        !           524:   4    "CREATE TABLE IF NOT EXISTS auxa.view1(a, b)"  {}
        !           525: }
        !           526: 
        !           527: # EVIDENCE-OF: R-16465-40078 An error is still returned if the table
        !           528: # cannot be created because of an existing index, even if the "IF NOT
        !           529: # EXISTS" clause is specified.
        !           530: #
        !           531: do_createtable_tests 1.9 -error { %s } {
        !           532:   1    "CREATE TABLE IF NOT EXISTS i1(a, b)"   
        !           533:        {{there is already an index named i1}}
        !           534:   2    "CREATE TABLE IF NOT EXISTS auxa.idx1(a, b)"   
        !           535:        {{there is already an index named idx1}}
        !           536: }
        !           537: 
        !           538: # EVIDENCE-OF: R-05513-33819 It is not an error to create a table that
        !           539: # has the same name as an existing trigger.
        !           540: #
        !           541: drop_all_tables
        !           542: do_execsql_test e_createtable-1.10.0 {
        !           543:   CREATE TABLE t1(x, y);
        !           544:   CREATE TABLE auxb.t2(x, y);
        !           545: 
        !           546:   CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
        !           547:     SELECT 1;
        !           548:   END;
        !           549:   CREATE TRIGGER auxb.tr2 AFTER INSERT ON t2 BEGIN
        !           550:     SELECT 1;
        !           551:   END;
        !           552: } {}
        !           553: do_createtable_tests 1.10 {
        !           554:   1    "CREATE TABLE tr1(a, b)"          {}
        !           555:   2    "CREATE TABLE tr2(a, b)"          {}
        !           556:   3    "CREATE TABLE auxb.tr1(a, b)"     {}
        !           557:   4    "CREATE TABLE auxb.tr2(a, b)"     {}
        !           558: }
        !           559: 
        !           560: # EVIDENCE-OF: R-22283-14179 Tables are removed using the DROP TABLE
        !           561: # statement.
        !           562: #
        !           563: drop_all_tables
        !           564: do_execsql_test e_createtable-1.11.0 {
        !           565:   CREATE TABLE t1(a, b);
        !           566:   CREATE TABLE t2(a, b);
        !           567:   CREATE TABLE auxa.t3(a, b);
        !           568:   CREATE TABLE auxa.t4(a, b);
        !           569: } {}
        !           570: 
        !           571: do_execsql_test e_createtable-1.11.1.1 {
        !           572:   SELECT * FROM t1;
        !           573:   SELECT * FROM t2;
        !           574:   SELECT * FROM t3;
        !           575:   SELECT * FROM t4;
        !           576: } {}
        !           577: do_execsql_test  e_createtable-1.11.1.2 { DROP TABLE t1 } {}
        !           578: do_catchsql_test e_createtable-1.11.1.3        !           579:   SELECT * FROM t1 
        !           580: } {1 {no such table: t1}}
        !           581: do_execsql_test  e_createtable-1.11.1.4 { DROP TABLE t3 } {}
        !           582: do_catchsql_test e_createtable-1.11.1.5        !           583:   SELECT * FROM t3 
        !           584: } {1 {no such table: t3}}
        !           585: 
        !           586: do_execsql_test e_createtable-1.11.2.1 {
        !           587:   SELECT name FROM sqlite_master;
        !           588:   SELECT name FROM auxa.sqlite_master;
        !           589: } {t2 t4}
        !           590: do_execsql_test  e_createtable-1.11.2.2 { DROP TABLE t2 } {}
        !           591: do_execsql_test  e_createtable-1.11.2.3 { DROP TABLE t4 } {}
        !           592: do_execsql_test e_createtable-1.11.2.4 {
        !           593:   SELECT name FROM sqlite_master;
        !           594:   SELECT name FROM auxa.sqlite_master;
        !           595: } {}
        !           596: 
        !           597: #-------------------------------------------------------------------------
        !           598: # Test cases e_createtable-2.* - test statements related to the CREATE
        !           599: # TABLE AS ... SELECT statement.
        !           600: #
        !           601: 
        !           602: # Three Tcl commands:
        !           603: #
        !           604: #   select_column_names SQL
        !           605: #     The argument must be a SELECT statement. Return a list of the names
        !           606: #     of the columns of the result-set that would be returned by executing
        !           607: #     the SELECT.
        !           608: #
        !           609: #   table_column_names TBL
        !           610: #     The argument must be a table name. Return a list of column names, from
        !           611: #     left to right, for the table.
        !           612: #
        !           613: #   table_column_decltypes TBL
        !           614: #     The argument must be a table name. Return a list of column declared
        !           615: #     types, from left to right, for the table.
        !           616: #
        !           617: proc sci {select cmd} {
        !           618:   set res [list]
        !           619:   set STMT [sqlite3_prepare_v2 db $select -1 dummy]
        !           620:   for {set i 0} {$i < [sqlite3_column_count $STMT]} {incr i} {
        !           621:     lappend res [$cmd $STMT $i]
        !           622:   }
        !           623:   sqlite3_finalize $STMT
        !           624:   set res
        !           625: }
        !           626: proc tci {tbl cmd} { sci "SELECT * FROM $tbl" $cmd }
        !           627: proc select_column_names    {sql} { sci $sql sqlite3_column_name }
        !           628: proc table_column_names     {tbl} { tci $tbl sqlite3_column_name }
        !           629: proc table_column_decltypes {tbl} { tci $tbl sqlite3_column_decltype }
        !           630: 
        !           631: # Create a database schema. This schema is used by tests 2.1.* through 2.3.*.
        !           632: #
        !           633: drop_all_tables
        !           634: do_execsql_test e_createtable-2.0 {
        !           635:   CREATE TABLE t1(a, b, c);
        !           636:   CREATE TABLE t2(d, e, f);
        !           637:   CREATE TABLE t3(g BIGINT, h VARCHAR(10));
        !           638:   CREATE TABLE t4(i BLOB, j ANYOLDATA);
        !           639:   CREATE TABLE t5(k FLOAT, l INTEGER);
        !           640:   CREATE TABLE t6(m DEFAULT 10, n DEFAULT 5, PRIMARY KEY(m, n));
        !           641:   CREATE TABLE t7(x INTEGER PRIMARY KEY);
        !           642:   CREATE TABLE t8(o COLLATE nocase DEFAULT 'abc');
        !           643:   CREATE TABLE t9(p NOT NULL, q DOUBLE CHECK (q!=0), r STRING UNIQUE);
        !           644: } {}
        !           645: 
        !           646: # EVIDENCE-OF: R-64828-59568 The table has the same number of columns as
        !           647: # the rows returned by the SELECT statement. The name of each column is
        !           648: # the same as the name of the corresponding column in the result set of
        !           649: # the SELECT statement.
        !           650: #
        !           651: do_createtable_tests 2.1 -tclquery {
        !           652:   table_column_names x1
        !           653: } -repair {
        !           654:   catchsql { DROP TABLE x1 }
        !           655: } {
        !           656:   1    "CREATE TABLE x1 AS SELECT * FROM t1"                     {a b c}
        !           657:   2    "CREATE TABLE x1 AS SELECT c, b, a FROM t1"               {c b a}
        !           658:   3    "CREATE TABLE x1 AS SELECT * FROM t1, t2"                 {a b c d e f}
        !           659:   4    "CREATE TABLE x1 AS SELECT count(*) FROM t1"              {count(*)}
        !           660:   5    "CREATE TABLE x1 AS SELECT count(a) AS a, max(b) FROM t1" {a max(b)}
        !           661: }
        !           662: 
        !           663: # EVIDENCE-OF: R-37111-22855 The declared type of each column is
        !           664: # determined by the expression affinity of the corresponding expression
        !           665: # in the result set of the SELECT statement, as follows: Expression
        !           666: # Affinity Column Declared Type TEXT "TEXT" NUMERIC "NUM" INTEGER "INT"
        !           667: # REAL "REAL" NONE "" (empty string)
        !           668: #
        !           669: do_createtable_tests 2.2 -tclquery {
        !           670:   table_column_decltypes x1
        !           671: } -repair {
        !           672:   catchsql { DROP TABLE x1 }
        !           673: } {
        !           674:   1    "CREATE TABLE x1 AS SELECT a FROM t1"     {""}
        !           675:   2    "CREATE TABLE x1 AS SELECT * FROM t3"     {INT TEXT}
        !           676:   3    "CREATE TABLE x1 AS SELECT * FROM t4"     {"" NUM}
        !           677:   4    "CREATE TABLE x1 AS SELECT * FROM t5"     {REAL INT}
        !           678: }
        !           679: 
        !           680: # EVIDENCE-OF: R-16667-09772 A table created using CREATE TABLE AS has
        !           681: # no PRIMARY KEY and no constraints of any kind. The default value of
        !           682: # each column is NULL. The default collation sequence for each column of
        !           683: # the new table is BINARY.
        !           684: #
        !           685: #   The following tests create tables based on SELECT statements that read
        !           686: #   from tables that have primary keys, constraints and explicit default 
        !           687: #   collation sequences. None of this is transfered to the definition of
        !           688: #   the new table as stored in the sqlite_master table.
        !           689: #
        !           690: #   Tests 2.3.2.* show that the default value of each column is NULL.
        !           691: #
        !           692: do_createtable_tests 2.3.1 -query {
        !           693:   SELECT sql FROM sqlite_master ORDER BY rowid DESC LIMIT 1
        !           694: } {
        !           695:   1    "CREATE TABLE x1 AS SELECT * FROM t6" {{CREATE TABLE x1(m,n)}}
        !           696:   2    "CREATE TABLE x2 AS SELECT * FROM t7" {{CREATE TABLE x2(x INT)}}
        !           697:   3    "CREATE TABLE x3 AS SELECT * FROM t8" {{CREATE TABLE x3(o)}}
        !           698:   4    "CREATE TABLE x4 AS SELECT * FROM t9" {{CREATE TABLE x4(p,q REAL,r NUM)}}
        !           699: }
        !           700: do_execsql_test e_createtable-2.3.2.1 {
        !           701:   INSERT INTO x1 DEFAULT VALUES;
        !           702:   INSERT INTO x2 DEFAULT VALUES;
        !           703:   INSERT INTO x3 DEFAULT VALUES;
        !           704:   INSERT INTO x4 DEFAULT VALUES;
        !           705: } {}
        !           706: db nullvalue null
        !           707: do_execsql_test e_createtable-2.3.2.2 { SELECT * FROM x1 } {null null}
        !           708: do_execsql_test e_createtable-2.3.2.3 { SELECT * FROM x2 } {null}
        !           709: do_execsql_test e_createtable-2.3.2.4 { SELECT * FROM x3 } {null}
        !           710: do_execsql_test e_createtable-2.3.2.5 { SELECT * FROM x4 } {null null null}
        !           711: db nullvalue {}
        !           712: 
        !           713: drop_all_tables
        !           714: do_execsql_test e_createtable-2.4.0 {
        !           715:   CREATE TABLE t1(x, y);
        !           716:   INSERT INTO t1 VALUES('i',   'one');
        !           717:   INSERT INTO t1 VALUES('ii',  'two');
        !           718:   INSERT INTO t1 VALUES('iii', 'three');
        !           719: } {}
        !           720: 
        !           721: # EVIDENCE-OF: R-24153-28352 Tables created using CREATE TABLE AS are
        !           722: # initially populated with the rows of data returned by the SELECT
        !           723: # statement.
        !           724: #
        !           725: # EVIDENCE-OF: R-08224-30249 Rows are assigned contiguously ascending
        !           726: # rowid values, starting with 1, in the order that they are returned by
        !           727: # the SELECT statement.
        !           728: #
        !           729: #   Each test case below is specified as the name of a table to create
        !           730: #   using "CREATE TABLE ... AS SELECT ..." and a SELECT statement to use in
        !           731: #   creating it. The table is created. 
        !           732: #
        !           733: #   Test cases 2.4.*.1 check that after it has been created, the data in the
        !           734: #   table is the same as the data returned by the SELECT statement executed as
        !           735: #   a standalone command, verifying the first testable statement above.
        !           736: #
        !           737: #   Test cases 2.4.*.2 check that the rowids were allocated contiguously
        !           738: #   as required by the second testable statement above. That the rowids
        !           739: #   from the contiguous block were allocated to rows in the order rows are
        !           740: #   returned by the SELECT statement is verified by 2.4.*.1.
        !           741: #
        !           742: # EVIDENCE-OF: R-32365-09043 A "CREATE TABLE ... AS SELECT" statement
        !           743: # creates and populates a database table based on the results of a
        !           744: # SELECT statement.
        !           745: #
        !           746: #   The above is also considered to be tested by the following. It is
        !           747: #   clear that tables are being created and populated by the command in
        !           748: #   question.
        !           749: #
        !           750: foreach {tn tbl select} {
        !           751:   1   x1   "SELECT * FROM t1"
        !           752:   2   x2   "SELECT * FROM t1 ORDER BY x DESC"
        !           753:   3   x3   "SELECT * FROM t1 ORDER BY x ASC"
        !           754: } {
        !           755:   # Create the table using a "CREATE TABLE ... AS SELECT ..." command.
        !           756:   execsql [subst {CREATE TABLE $tbl AS $select}]
        !           757: 
        !           758:   # Check that the rows inserted into the table, sorted in ascending rowid
        !           759:   # order, match those returned by executing the SELECT statement as a
        !           760:   # standalone command.
        !           761:   do_execsql_test e_createtable-2.4.$tn.1 [subst {
        !           762:     SELECT * FROM $tbl ORDER BY rowid;
        !           763:   }] [execsql $select]
        !           764: 
        !           765:   # Check that the rowids in the new table are a contiguous block starting
        !           766:   # with rowid 1. Note that this will fail if SELECT statement $select 
        !           767:   # returns 0 rows (as max(rowid) will be NULL).
        !           768:   do_execsql_test e_createtable-2.4.$tn.2 [subst {
        !           769:     SELECT min(rowid), count(rowid)==max(rowid) FROM $tbl
        !           770:   }] {1 1}
        !           771: }
        !           772: 
        !           773: #--------------------------------------------------------------------------
        !           774: # Test cases for column defintions in CREATE TABLE statements that do not
        !           775: # use a SELECT statement. Not including data constraints. In other words,
        !           776: # tests for the specification of:
        !           777: #
        !           778: #   * declared types,
        !           779: #   * default values, and
        !           780: #   * default collation sequences.
        !           781: #
        !           782: 
        !           783: # EVIDENCE-OF: R-27219-49057 Unlike most SQL databases, SQLite does not
        !           784: # restrict the type of data that may be inserted into a column based on
        !           785: # the columns declared type.
        !           786: #
        !           787: #   Test this by creating a few tables with varied declared types, then
        !           788: #   inserting various different types of values into them.
        !           789: #
        !           790: drop_all_tables
        !           791: do_execsql_test e_createtable-3.1.0 {
        !           792:   CREATE TABLE t1(x VARCHAR(10), y INTEGER, z DOUBLE);
        !           793:   CREATE TABLE t2(a DATETIME, b STRING, c REAL);
        !           794:   CREATE TABLE t3(o, t);
        !           795: } {}
        !           796: 
        !           797: # value type -> declared column type
        !           798: # ----------------------------------
        !           799: # integer    -> VARCHAR(10)
        !           800: # string     -> INTEGER
        !           801: # blob       -> DOUBLE
        !           802: #
        !           803: do_execsql_test e_createtable-3.1.1 {
        !           804:   INSERT INTO t1 VALUES(14, 'quite a lengthy string', X'555655');
        !           805:   SELECT * FROM t1;
        !           806: } {14 {quite a lengthy string} UVU}
        !           807: 
        !           808: # string     -> DATETIME
        !           809: # integer    -> STRING
        !           810: # time       -> REAL
        !           811: #
        !           812: do_execsql_test e_createtable-3.1.2 {
        !           813:   INSERT INTO t2 VALUES('not a datetime', 13, '12:41:59');
        !           814:   SELECT * FROM t2;
        !           815: } {{not a datetime} 13 12:41:59}
        !           816: 
        !           817: # EVIDENCE-OF: R-10565-09557 The declared type of a column is used to
        !           818: # determine the affinity of the column only.
        !           819: #
        !           820: #     Affinities are tested in more detail elsewhere (see document
        !           821: #     datatype3.html). Here, just test that affinity transformations
        !           822: #     consistent with the expected affinity of each column (based on
        !           823: #     the declared type) appear to take place.
        !           824: #
        !           825: # Affinities of t1 (test cases 3.2.1.*): TEXT, INTEGER, REAL
        !           826: # Affinities of t2 (test cases 3.2.2.*): NUMERIC, NUMERIC, REAL
        !           827: # Affinities of t3 (test cases 3.2.3.*): NONE, NONE
        !           828: #
        !           829: do_execsql_test e_createtable-3.2.0 { DELETE FROM t1; DELETE FROM t2; } {}
        !           830: 
        !           831: do_createtable_tests 3.2.1 -query {
        !           832:   SELECT quote(x), quote(y), quote(z) FROM t1 ORDER BY rowid DESC LIMIT 1;
        !           833: } {
        !           834:   1   "INSERT INTO t1 VALUES(15,   '22.0', '14')"   {'15' 22 14.0}
        !           835:   2   "INSERT INTO t1 VALUES(22.0, 22.0, 22.0)"     {'22.0' 22 22.0}
        !           836: }
        !           837: do_createtable_tests 3.2.2 -query {
        !           838:   SELECT quote(a), quote(b), quote(c) FROM t2 ORDER BY rowid DESC LIMIT 1;
        !           839: } {
        !           840:   1   "INSERT INTO t2 VALUES(15,   '22.0', '14')"   {15   22  14.0}
        !           841:   2   "INSERT INTO t2 VALUES(22.0, 22.0, 22.0)"     {22   22  22.0}
        !           842: }
        !           843: do_createtable_tests 3.2.3 -query {
        !           844:   SELECT quote(o), quote(t) FROM t3 ORDER BY rowid DESC LIMIT 1;
        !           845: } {
        !           846:   1   "INSERT INTO t3 VALUES('15', '22.0')"         {'15' '22.0'}
        !           847:   2   "INSERT INTO t3 VALUES(15, 22.0)"             {15 22.0}
        !           848: }
        !           849: 
        !           850: # EVIDENCE-OF: R-42316-09582 If there is no explicit DEFAULT clause
        !           851: # attached to a column definition, then the default value of the column
        !           852: # is NULL.
        !           853: #
        !           854: #     None of the columns in table t1 have an explicit DEFAULT clause.
        !           855: #     So testing that the default value of all columns in table t1 is
        !           856: #     NULL serves to verify the above.
        !           857: #     
        !           858: do_createtable_tests 3.2.3 -query {
        !           859:   SELECT quote(x), quote(y), quote(z) FROM t1
        !           860: } -repair {
        !           861:   execsql { DELETE FROM t1 }
        !           862: } {
        !           863:   1   "INSERT INTO t1(x, y) VALUES('abc', 'xyz')"   {'abc' 'xyz' NULL}
        !           864:   2   "INSERT INTO t1(x, z) VALUES('abc', 'xyz')"   {'abc' NULL 'xyz'}
        !           865:   3   "INSERT INTO t1 DEFAULT VALUES"               {NULL NULL NULL}
        !           866: }
        !           867: 
        !           868: # EVIDENCE-OF: R-62940-43005 An explicit DEFAULT clause may specify that
        !           869: # the default value is NULL, a string constant, a blob constant, a
        !           870: # signed-number, or any constant expression enclosed in parentheses. An
        !           871: # explicit default value may also be one of the special case-independent
        !           872: # keywords CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP.
        !           873: #
        !           874: do_execsql_test e_createtable-3.3.1 {
        !           875:   CREATE TABLE t4(
        !           876:     a DEFAULT NULL,
        !           877:     b DEFAULT 'string constant',
        !           878:     c DEFAULT X'424C4F42',
        !           879:     d DEFAULT 1,
        !           880:     e DEFAULT -1,
        !           881:     f DEFAULT 3.14,
        !           882:     g DEFAULT -3.14,
        !           883:     h DEFAULT ( substr('abcd', 0, 2) || 'cd' ),
        !           884:     i DEFAULT CURRENT_TIME,
        !           885:     j DEFAULT CURRENT_DATE,
        !           886:     k DEFAULT CURRENT_TIMESTAMP
        !           887:   );
        !           888: } {}
        !           889: 
        !           890: # EVIDENCE-OF: R-10288-43169 For the purposes of the DEFAULT clause, an
        !           891: # expression is considered constant provided that it does not contain
        !           892: # any sub-queries or string constants enclosed in double quotes.
        !           893: #
        !           894: do_createtable_tests 3.4.1 -error {
        !           895:   default value of column [x] is not constant
        !           896: } {
        !           897:   1   {CREATE TABLE t5(x DEFAULT ( (SELECT 1) ))}  {}
        !           898:   2   {CREATE TABLE t5(x DEFAULT ( "abc" ))}  {}
        !           899:   3   {CREATE TABLE t5(x DEFAULT ( 1 IN (SELECT 1) ))}  {}
        !           900:   4   {CREATE TABLE t5(x DEFAULT ( EXISTS (SELECT 1) ))}  {}
        !           901: }
        !           902: do_createtable_tests 3.4.2 -repair {
        !           903:   catchsql { DROP TABLE t5 }
        !           904: } {
        !           905:   1   {CREATE TABLE t5(x DEFAULT ( 'abc' ))}  {}
        !           906:   2   {CREATE TABLE t5(x DEFAULT ( 1 IN (1, 2, 3) ))}  {}
        !           907: }
        !           908: 
        !           909: # EVIDENCE-OF: R-18814-23501 Each time a row is inserted into the table
        !           910: # by an INSERT statement that does not provide explicit values for all
        !           911: # table columns the values stored in the new row are determined by their
        !           912: # default values
        !           913: #
        !           914: #     Verify this with some assert statements for which all, some and no
        !           915: #     columns lack explicit values.
        !           916: #
        !           917: set sqlite_current_time 1000000000
        !           918: do_createtable_tests 3.5 -query {
        !           919:   SELECT quote(a), quote(b), quote(c), quote(d), quote(e), quote(f), 
        !           920:          quote(g), quote(h), quote(i), quote(j), quote(k)
        !           921:   FROM t4 ORDER BY rowid DESC LIMIT 1;
        !           922: } {
        !           923:   1 "INSERT INTO t4 DEFAULT VALUES" {
        !           924:     NULL {'string constant'} X'424C4F42' 1 -1 3.14 -3.14 
        !           925:     'acd' '01:46:40' '2001-09-09' {'2001-09-09 01:46:40'}
        !           926:   }
        !           927: 
        !           928:   2 "INSERT INTO t4(a, b, c) VALUES(1, 2, 3)" {
        !           929:     1 2 3 1 -1 3.14 -3.14 'acd' '01:46:40' '2001-09-09' {'2001-09-09 01:46:40'}
        !           930:   }
        !           931: 
        !           932:   3 "INSERT INTO t4(k, j, i) VALUES(1, 2, 3)" {
        !           933:     NULL {'string constant'} X'424C4F42' 1 -1 3.14 -3.14 'acd' 3 2 1
        !           934:   }
        !           935: 
        !           936:   4 "INSERT INTO t4(a,b,c,d,e,f,g,h,i,j,k) VALUES(1,2,3,4,5,6,7,8,9,10,11)" {
        !           937:     1 2 3 4 5 6 7 8 9 10 11
        !           938:   }
        !           939: }
        !           940: 
        !           941: # EVIDENCE-OF: R-12572-62501 If the default value of the column is a
        !           942: # constant NULL, text, blob or signed-number value, then that value is
        !           943: # used directly in the new row.
        !           944: #
        !           945: do_execsql_test e_createtable-3.6.1 {
        !           946:   CREATE TABLE t5(
        !           947:     a DEFAULT NULL,  
        !           948:     b DEFAULT 'text value',  
        !           949:     c DEFAULT X'424C4F42',
        !           950:     d DEFAULT -45678.6,
        !           951:     e DEFAULT 394507
        !           952:   );
        !           953: } {}
        !           954: do_execsql_test e_createtable-3.6.2 {
        !           955:   INSERT INTO t5 DEFAULT VALUES;
        !           956:   SELECT quote(a), quote(b), quote(c), quote(d), quote(e) FROM t5;
        !           957: } {NULL {'text value'} X'424C4F42' -45678.6 394507}
        !           958: 
        !           959: # EVIDENCE-OF: R-60616-50251 If the default value of a column is an
        !           960: # expression in parentheses, then the expression is evaluated once for
        !           961: # each row inserted and the results used in the new row.
        !           962: #
        !           963: #   Test case 3.6.4 demonstrates that the expression is evaluated 
        !           964: #   separately for each row if the INSERT is an "INSERT INTO ... SELECT ..."
        !           965: #   command.
        !           966: #
        !           967: set ::nextint 0
        !           968: proc nextint {} { incr ::nextint }
        !           969: db func nextint nextint
        !           970: 
        !           971: do_execsql_test e_createtable-3.7.1 {
        !           972:   CREATE TABLE t6(a DEFAULT ( nextint() ), b DEFAULT ( nextint() ));
        !           973: } {}
        !           974: do_execsql_test e_createtable-3.7.2 {
        !           975:   INSERT INTO t6 DEFAULT VALUES;
        !           976:   SELECT quote(a), quote(b) FROM t6;
        !           977: } {1 2}
        !           978: do_execsql_test e_createtable-3.7.3 {
        !           979:   INSERT INTO t6(a) VALUES('X');
        !           980:   SELECT quote(a), quote(b) FROM t6;
        !           981: } {1 2 'X' 3}
        !           982: do_execsql_test e_createtable-3.7.4 {
        !           983:   INSERT INTO t6(a) SELECT a FROM t6;
        !           984:   SELECT quote(a), quote(b) FROM t6;
        !           985: } {1 2 'X' 3 1 4 'X' 5}
        !           986: 
        !           987: # EVIDENCE-OF: R-15363-55230 If the default value of a column is
        !           988: # CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP, then the value used
        !           989: # in the new row is a text representation of the current UTC date and/or
        !           990: # time.
        !           991: #
        !           992: #     This is difficult to test literally without knowing what time the 
        !           993: #     user will run the tests. Instead, we test that the three cases
        !           994: #     above set the value to the current date and/or time according to
        !           995: #     the xCurrentTime() method of the VFS. Which is usually the same
        !           996: #     as UTC. In this case, however, we instrument it to always return
        !           997: #     a time equivalent to "2001-09-09 01:46:40 UTC".
        !           998: #
        !           999: set sqlite_current_time 1000000000
        !          1000: do_execsql_test e_createtable-3.8.1 {
        !          1001:   CREATE TABLE t7(
        !          1002:     a DEFAULT CURRENT_TIME, 
        !          1003:     b DEFAULT CURRENT_DATE, 
        !          1004:     c DEFAULT CURRENT_TIMESTAMP
        !          1005:   );
        !          1006: } {}
        !          1007: do_execsql_test e_createtable-3.8.2 {
        !          1008:   INSERT INTO t7 DEFAULT VALUES;
        !          1009:   SELECT quote(a), quote(b), quote(c) FROM t7;
        !          1010: } {'01:46:40' '2001-09-09' {'2001-09-09 01:46:40'}}
        !          1011: 
        !          1012: 
        !          1013: # EVIDENCE-OF: R-62327-53843 For CURRENT_TIME, the format of the value
        !          1014: # is "HH:MM:SS".
        !          1015: #
        !          1016: # EVIDENCE-OF: R-03775-43471 For CURRENT_DATE, "YYYY-MM-DD".
        !          1017: #
        !          1018: # EVIDENCE-OF: R-07677-44926 The format for CURRENT_TIMESTAMP is
        !          1019: # "YYYY-MM-DD HH:MM:SS".
        !          1020: #
        !          1021: #     The three above are demonstrated by tests 1, 2 and 3 below. 
        !          1022: #     Respectively.
        !          1023: #
        !          1024: do_createtable_tests 3.8.3 -query {
        !          1025:   SELECT a, b, c FROM t7 ORDER BY rowid DESC LIMIT 1;
        !          1026: } {
        !          1027:   1 "INSERT INTO t7(b, c) VALUES('x', 'y')" {01:46:40 x y}
        !          1028:   2 "INSERT INTO t7(c, a) VALUES('x', 'y')" {y 2001-09-09 x}
        !          1029:   3 "INSERT INTO t7(a, b) VALUES('x', 'y')" {x y {2001-09-09 01:46:40}}
        !          1030: }
        !          1031: 
        !          1032: # EVIDENCE-OF: R-55061-47754 The COLLATE clause specifies the name of a
        !          1033: # collating sequence to use as the default collation sequence for the
        !          1034: # column.
        !          1035: #
        !          1036: # EVIDENCE-OF: R-40275-54363 If no COLLATE clause is specified, the
        !          1037: # default collation sequence is BINARY.
        !          1038: #
        !          1039: do_execsql_test e_createtable-3-9.1 {
        !          1040:   CREATE TABLE t8(a COLLATE nocase, b COLLATE rtrim, c COLLATE binary, d);
        !          1041:   INSERT INTO t8 VALUES('abc',   'abc',   'abc',   'abc');
        !          1042:   INSERT INTO t8 VALUES('abc  ', 'abc  ', 'abc  ', 'abc  ');
        !          1043:   INSERT INTO t8 VALUES('ABC  ', 'ABC  ', 'ABC  ', 'ABC  ');
        !          1044:   INSERT INTO t8 VALUES('ABC',   'ABC',   'ABC',   'ABC');
        !          1045: } {}
        !          1046: do_createtable_tests 3.9 {
        !          1047:   2    "SELECT a FROM t8 ORDER BY a, rowid"    {abc ABC {abc  } {ABC  }}
        !          1048:   3    "SELECT b FROM t8 ORDER BY b, rowid"    {{ABC  } ABC abc {abc  }}
        !          1049:   4    "SELECT c FROM t8 ORDER BY c, rowid"    {ABC {ABC  } abc {abc  }}
        !          1050:   5    "SELECT d FROM t8 ORDER BY d, rowid"    {ABC {ABC  } abc {abc  }}
        !          1051: }
        !          1052: 
        !          1053: # EVIDENCE-OF: R-25473-20557 The number of columns in a table is limited
        !          1054: # by the SQLITE_MAX_COLUMN compile-time parameter.
        !          1055: #
        !          1056: proc columns {n} {
        !          1057:   set res [list]
        !          1058:   for {set i 0} {$i < $n} {incr i} { lappend res "c$i" }
        !          1059:   join $res ", "
        !          1060: }
        !          1061: do_execsql_test e_createtable-3.10.1 [subst {
        !          1062:   CREATE TABLE t9([columns $::SQLITE_MAX_COLUMN]);
        !          1063: }] {}
        !          1064: do_catchsql_test e_createtable-3.10.2 [subst {
        !          1065:   CREATE TABLE t10([columns [expr $::SQLITE_MAX_COLUMN+1]]);
        !          1066: }] {1 {too many columns on t10}}
        !          1067: 
        !          1068: # EVIDENCE-OF: R-27775-64721 Both of these limits can be lowered at
        !          1069: # runtime using the sqlite3_limit() C/C++ interface.
        !          1070: #
        !          1071: #   A 30,000 byte blob consumes 30,003 bytes of record space. A record 
        !          1072: #   that contains 3 such blobs consumes (30,000*3)+1 bytes of space. Tests
        !          1073: #   3.11.4 and 3.11.5, which verify that SQLITE_MAX_LENGTH may be lowered
        !          1074: #   at runtime, are based on this calculation.
        !          1075: #
        !          1076: sqlite3_limit db SQLITE_LIMIT_COLUMN 500
        !          1077: do_execsql_test e_createtable-3.11.1 [subst {
        !          1078:   CREATE TABLE t10([columns 500]);
        !          1079: }] {}
        !          1080: do_catchsql_test e_createtable-3.11.2 [subst {
        !          1081:   CREATE TABLE t11([columns 501]);
        !          1082: }] {1 {too many columns on t11}}
        !          1083: 
        !          1084: # Check that it is not possible to raise the column limit above its 
        !          1085: # default compile time value.
        !          1086: #
        !          1087: sqlite3_limit db SQLITE_LIMIT_COLUMN [expr $::SQLITE_MAX_COLUMN+2]
        !          1088: do_catchsql_test e_createtable-3.11.3 [subst {
        !          1089:   CREATE TABLE t11([columns [expr $::SQLITE_MAX_COLUMN+1]]);
        !          1090: }] {1 {too many columns on t11}}
        !          1091: 
        !          1092: sqlite3_limit db SQLITE_LIMIT_LENGTH 90010
        !          1093: do_execsql_test e_createtable-3.11.4 {
        !          1094:   CREATE TABLE t12(a, b, c);
        !          1095:   INSERT INTO t12 VALUES(randomblob(30000),randomblob(30000),randomblob(30000));
        !          1096: } {}
        !          1097: do_catchsql_test e_createtable-3.11.5 {
        !          1098:   INSERT INTO t12 VALUES(randomblob(30001),randomblob(30000),randomblob(30000));
        !          1099: } {1 {string or blob too big}}
        !          1100: 
        !          1101: #-------------------------------------------------------------------------
        !          1102: # Tests for statements regarding constraints (PRIMARY KEY, UNIQUE, NOT 
        !          1103: # NULL and CHECK constraints).
        !          1104: #
        !          1105: 
        !          1106: # EVIDENCE-OF: R-52382-54248 Each table in SQLite may have at most one
        !          1107: # PRIMARY KEY.
        !          1108: # 
        !          1109: # EVIDENCE-OF: R-18080-47271 If there is more than one PRIMARY KEY
        !          1110: # clause in a single CREATE TABLE statement, it is an error.
        !          1111: #
        !          1112: #     To test the two above, show that zero primary keys is Ok, one primary
        !          1113: #     key is Ok, and two or more primary keys is an error.
        !          1114: #
        !          1115: drop_all_tables
        !          1116: do_createtable_tests 4.1.1 {
        !          1117:   1    "CREATE TABLE t1(a, b, c)"                                        {}
        !          1118:   2    "CREATE TABLE t2(a PRIMARY KEY, b, c)"                            {}
        !          1119:   3    "CREATE TABLE t3(a, b, c, PRIMARY KEY(a))"                        {}
        !          1120:   4    "CREATE TABLE t4(a, b, c, PRIMARY KEY(c,b,a))"                    {}
        !          1121: }
        !          1122: do_createtable_tests 4.1.2 -error {
        !          1123:   table "t5" has more than one primary key
        !          1124: } {
        !          1125:   1    "CREATE TABLE t5(a PRIMARY KEY, b PRIMARY KEY, c)"                {}
        !          1126:   2    "CREATE TABLE t5(a, b PRIMARY KEY, c, PRIMARY KEY(a))"            {}
        !          1127:   3    "CREATE TABLE t5(a INTEGER PRIMARY KEY, b PRIMARY KEY, c)"        {}
        !          1128:   4    "CREATE TABLE t5(a INTEGER PRIMARY KEY, b, c, PRIMARY KEY(b, c))" {}
        !          1129:   5    "CREATE TABLE t5(a PRIMARY KEY, b, c, PRIMARY KEY(a))"            {}
        !          1130:   6    "CREATE TABLE t5(a INTEGER PRIMARY KEY, b, c, PRIMARY KEY(a))"    {}
        !          1131: }
        !          1132: 
        !          1133: proc table_pk {tbl} { 
        !          1134:   set pk [list]
        !          1135:   db eval "pragma table_info($tbl)" a {
        !          1136:     if {$a(pk)} { lappend pk $a(name) }
        !          1137:   }
        !          1138:   set pk
        !          1139: }
        !          1140: 
        !          1141: # EVIDENCE-OF: R-41411-18837 If the keywords PRIMARY KEY are added to a
        !          1142: # column definition, then the primary key for the table consists of that
        !          1143: # single column.
        !          1144: #
        !          1145: #     The above is tested by 4.2.1.*
        !          1146: #
        !          1147: # EVIDENCE-OF: R-31775-48204 Or, if a PRIMARY KEY clause is specified as
        !          1148: # a table-constraint, then the primary key of the table consists of the
        !          1149: # list of columns specified as part of the PRIMARY KEY clause.
        !          1150: #
        !          1151: #     The above is tested by 4.2.2.*
        !          1152: #
        !          1153: do_createtable_tests 4.2 -repair {
        !          1154:   catchsql { DROP TABLE t5 }
        !          1155: } -tclquery {
        !          1156:   table_pk t5
        !          1157: } {
        !          1158:   1.1    "CREATE TABLE t5(a, b INTEGER PRIMARY KEY, c)"       {b}
        !          1159:   1.2    "CREATE TABLE t5(a PRIMARY KEY, b, c)"               {a}
        !          1160: 
        !          1161:   2.1    "CREATE TABLE t5(a, b, c, PRIMARY KEY(a))"           {a}
        !          1162:   2.2    "CREATE TABLE t5(a, b, c, PRIMARY KEY(c,b,a))"       {a b c}
        !          1163:   2.3    "CREATE TABLE t5(a, b INTEGER PRIMARY KEY, c)"       {b}
        !          1164: }
        !          1165: 
        !          1166: # EVIDENCE-OF: R-33986-09410 Each row in a table with a primary key must
        !          1167: # feature a unique combination of values in its primary key columns.
        !          1168: #
        !          1169: # EVIDENCE-OF: R-39102-06737 If an INSERT or UPDATE statement attempts
        !          1170: # to modify the table content so that two or more rows feature identical
        !          1171: # primary key values, it is a constraint violation.
        !          1172: #
        !          1173: drop_all_tables
        !          1174: do_execsql_test 4.3.0 {
        !          1175:   CREATE TABLE t1(x PRIMARY KEY, y);
        !          1176:   INSERT INTO t1 VALUES(0,          'zero');
        !          1177:   INSERT INTO t1 VALUES(45.5,       'one');
        !          1178:   INSERT INTO t1 VALUES('brambles', 'two');
        !          1179:   INSERT INTO t1 VALUES(X'ABCDEF',  'three');
        !          1180: 
        !          1181:   CREATE TABLE t2(x, y, PRIMARY KEY(x, y));
        !          1182:   INSERT INTO t2 VALUES(0,          'zero');
        !          1183:   INSERT INTO t2 VALUES(45.5,       'one');
        !          1184:   INSERT INTO t2 VALUES('brambles', 'two');
        !          1185:   INSERT INTO t2 VALUES(X'ABCDEF',  'three');
        !          1186: } {}
        !          1187: 
        !          1188: do_createtable_tests 4.3.1 -error { %s not unique } {
        !          1189:   1    "INSERT INTO t1 VALUES(0, 0)"                 {"column x is"}
        !          1190:   2    "INSERT INTO t1 VALUES(45.5, 'abc')"          {"column x is"}
        !          1191:   3    "INSERT INTO t1 VALUES(0.0, 'abc')"           {"column x is"}
        !          1192:   4    "INSERT INTO t1 VALUES('brambles', 'abc')"    {"column x is"}
        !          1193:   5    "INSERT INTO t1 VALUES(X'ABCDEF', 'abc')"     {"column x is"}
        !          1194: 
        !          1195:   6    "INSERT INTO t2 VALUES(0, 'zero')"            {"columns x, y are"}
        !          1196:   7    "INSERT INTO t2 VALUES(45.5, 'one')"          {"columns x, y are"}
        !          1197:   8    "INSERT INTO t2 VALUES(0.0, 'zero')"          {"columns x, y are"}
        !          1198:   9    "INSERT INTO t2 VALUES('brambles', 'two')"    {"columns x, y are"}
        !          1199:   10   "INSERT INTO t2 VALUES(X'ABCDEF', 'three')"   {"columns x, y are"}
        !          1200: }
        !          1201: do_createtable_tests 4.3.2 {
        !          1202:   1    "INSERT INTO t1 VALUES(-1, 0)"                {}
        !          1203:   2    "INSERT INTO t1 VALUES(45.2, 'abc')"          {}
        !          1204:   3    "INSERT INTO t1 VALUES(0.01, 'abc')"          {}
        !          1205:   4    "INSERT INTO t1 VALUES('bramble', 'abc')"     {}
        !          1206:   5    "INSERT INTO t1 VALUES(X'ABCDEE', 'abc')"     {}
        !          1207: 
        !          1208:   6    "INSERT INTO t2 VALUES(0, 0)"                 {}
        !          1209:   7    "INSERT INTO t2 VALUES(45.5, 'abc')"          {}
        !          1210:   8    "INSERT INTO t2 VALUES(0.0, 'abc')"           {}
        !          1211:   9    "INSERT INTO t2 VALUES('brambles', 'abc')"    {}
        !          1212:   10   "INSERT INTO t2 VALUES(X'ABCDEF', 'abc')"     {}
        !          1213: }
        !          1214: do_createtable_tests 4.3.3 -error { %s not unique } {
        !          1215:   1    "UPDATE t1 SET x=0           WHERE y='two'"    {"column x is"}
        !          1216:   2    "UPDATE t1 SET x='brambles'  WHERE y='three'"  {"column x is"}
        !          1217:   3    "UPDATE t1 SET x=45.5        WHERE y='zero'"   {"column x is"}
        !          1218:   4    "UPDATE t1 SET x=X'ABCDEF'   WHERE y='one'"    {"column x is"}
        !          1219:   5    "UPDATE t1 SET x=0.0         WHERE y='three'"  {"column x is"}
        !          1220: 
        !          1221:   6    "UPDATE t2 SET x=0, y='zero' WHERE y='two'"    {"columns x, y are"}
        !          1222:   7    "UPDATE t2 SET x='brambles', y='two' WHERE y='three'"  
        !          1223:        {"columns x, y are"}
        !          1224:   8    "UPDATE t2 SET x=45.5, y='one' WHERE y='zero'" {"columns x, y are"}
        !          1225:   9    "UPDATE t2 SET x=X'ABCDEF', y='three' WHERE y='one'" 
        !          1226:        {"columns x, y are"}
        !          1227:   10   "UPDATE t2 SET x=0.0, y='zero'        WHERE y='three'"  
        !          1228:        {"columns x, y are"}
        !          1229: }
        !          1230: 
        !          1231: 
        !          1232: # EVIDENCE-OF: R-52572-02078 For the purposes of determining the
        !          1233: # uniqueness of primary key values, NULL values are considered distinct
        !          1234: # from all other values, including other NULLs.
        !          1235: #
        !          1236: do_createtable_tests 4.4 {
        !          1237:   1    "INSERT INTO t1 VALUES(NULL, 0)"              {}
        !          1238:   2    "INSERT INTO t1 VALUES(NULL, 0)"              {}
        !          1239:   3    "INSERT INTO t1 VALUES(NULL, 0)"              {}
        !          1240: 
        !          1241:   4    "INSERT INTO t2 VALUES(NULL, 'zero')"         {}
        !          1242:   5    "INSERT INTO t2 VALUES(NULL, 'one')"          {}
        !          1243:   6    "INSERT INTO t2 VALUES(NULL, 'two')"          {}
        !          1244:   7    "INSERT INTO t2 VALUES(NULL, 'three')"        {}
        !          1245: 
        !          1246:   8    "INSERT INTO t2 VALUES(0, NULL)"              {}
        !          1247:   9    "INSERT INTO t2 VALUES(45.5, NULL)"           {}
        !          1248:   10   "INSERT INTO t2 VALUES(0.0, NULL)"            {}
        !          1249:   11   "INSERT INTO t2 VALUES('brambles', NULL)"     {}
        !          1250:   12   "INSERT INTO t2 VALUES(X'ABCDEF', NULL)"      {}
        !          1251: 
        !          1252:   13   "INSERT INTO t2 VALUES(NULL, NULL)"           {}
        !          1253:   14   "INSERT INTO t2 VALUES(NULL, NULL)"           {}
        !          1254: }
        !          1255: 
        !          1256: # EVIDENCE-OF: R-61866-38053 Unless the column is an INTEGER PRIMARY KEY
        !          1257: # SQLite allows NULL values in a PRIMARY KEY column.
        !          1258: #
        !          1259: #     If the column is an integer primary key, attempting to insert a NULL
        !          1260: #     into the column triggers the auto-increment behaviour. Attempting
        !          1261: #     to use UPDATE to set an ipk column to a NULL value is an error.
        !          1262: #
        !          1263: do_createtable_tests 4.5.1 {
        !          1264:   1    "SELECT count(*) FROM t1 WHERE x IS NULL"                   3
        !          1265:   2    "SELECT count(*) FROM t2 WHERE x IS NULL"                   6
        !          1266:   3    "SELECT count(*) FROM t2 WHERE y IS NULL"                   7
        !          1267:   4    "SELECT count(*) FROM t2 WHERE x IS NULL AND y IS NULL"     2
        !          1268: }
        !          1269: do_execsql_test 4.5.2 {
        !          1270:   CREATE TABLE t3(s, u INTEGER PRIMARY KEY, v);
        !          1271:   INSERT INTO t3 VALUES(1, NULL, 2);
        !          1272:   INSERT INTO t3 VALUES('x', NULL, 'y');
        !          1273:   SELECT u FROM t3;
        !          1274: } {1 2}
        !          1275: do_catchsql_test 4.5.3 {
        !          1276:   INSERT INTO t3 VALUES(2, 5, 3);
        !          1277:   UPDATE t3 SET u = NULL WHERE s = 2;
        !          1278: } {1 {datatype mismatch}}
        !          1279: 
        !          1280: # EVIDENCE-OF: R-00227-21080 A UNIQUE constraint is similar to a PRIMARY
        !          1281: # KEY constraint, except that a single table may have any number of
        !          1282: # UNIQUE constraints.
        !          1283: #
        !          1284: drop_all_tables
        !          1285: do_createtable_tests 4.6 {
        !          1286:   1    "CREATE TABLE t1(a UNIQUE, b UNIQUE)"                       {}
        !          1287:   2    "CREATE TABLE t2(a UNIQUE, b, c, UNIQUE(c, b))"             {}
        !          1288:   3    "CREATE TABLE t3(a, b, c, UNIQUE(a), UNIQUE(b), UNIQUE(c))" {}
        !          1289:   4    "CREATE TABLE t4(a, b, c, UNIQUE(a, b, c))"                 {}
        !          1290: }
        !          1291: 
        !          1292: # EVIDENCE-OF: R-55240-58877 For each UNIQUE constraint on the table,
        !          1293: # each row must feature a unique combination of values in the columns
        !          1294: # identified by the UNIQUE constraint.
        !          1295: #
        !          1296: # EVIDENCE-OF: R-47733-51480 If an INSERT or UPDATE statement attempts
        !          1297: # to modify the table content so that two or more rows feature identical
        !          1298: # values in a set of columns that are subject to a UNIQUE constraint, it
        !          1299: # is a constraint violation.
        !          1300: #
        !          1301: do_execsql_test 4.7.0 {
        !          1302:   INSERT INTO t1 VALUES(1, 2);
        !          1303:   INSERT INTO t1 VALUES(4.3, 5.5);
        !          1304:   INSERT INTO t1 VALUES('reveal', 'variableness');
        !          1305:   INSERT INTO t1 VALUES(X'123456', X'654321');
        !          1306: 
        !          1307:   INSERT INTO t4 VALUES('xyx', 1, 1);
        !          1308:   INSERT INTO t4 VALUES('xyx', 2, 1);
        !          1309:   INSERT INTO t4 VALUES('uvw', 1, 1);
        !          1310: }
        !          1311: do_createtable_tests 4.7.1 -error { %s not unique } {
        !          1312:   1    "INSERT INTO t1 VALUES(1, 'one')"             {{column a is}}
        !          1313:   2    "INSERT INTO t1 VALUES(4.3, 'two')"           {{column a is}}
        !          1314:   3    "INSERT INTO t1 VALUES('reveal', 'three')"    {{column a is}}
        !          1315:   4    "INSERT INTO t1 VALUES(X'123456', 'four')"    {{column a is}}
        !          1316: 
        !          1317:   5    "UPDATE t1 SET a = 1 WHERE rowid=2"           {{column a is}}
        !          1318:   6    "UPDATE t1 SET a = 4.3 WHERE rowid=3"         {{column a is}}
        !          1319:   7    "UPDATE t1 SET a = 'reveal' WHERE rowid=4"    {{column a is}}
        !          1320:   8    "UPDATE t1 SET a = X'123456' WHERE rowid=1"   {{column a is}}
        !          1321: 
        !          1322:   9    "INSERT INTO t4 VALUES('xyx', 1, 1)"          {{columns a, b, c are}}
        !          1323:   10   "INSERT INTO t4 VALUES('xyx', 2, 1)"          {{columns a, b, c are}}
        !          1324:   11   "INSERT INTO t4 VALUES('uvw', 1, 1)"          {{columns a, b, c are}}
        !          1325: 
        !          1326:   12   "UPDATE t4 SET a='xyx' WHERE rowid=3"         {{columns a, b, c are}}
        !          1327:   13   "UPDATE t4 SET b=1 WHERE rowid=2"             {{columns a, b, c are}}
        !          1328:   14   "UPDATE t4 SET a=0, b=0, c=0"                 {{columns a, b, c are}}
        !          1329: }
        !          1330: 
        !          1331: # EVIDENCE-OF: R-21289-11559 As with PRIMARY KEY constraints, for the
        !          1332: # purposes of UNIQUE constraints NULL values are considered distinct
        !          1333: # from all other values (including other NULLs).
        !          1334: #
        !          1335: do_createtable_tests 4.8 {
        !          1336:   1    "INSERT INTO t1 VALUES(NULL, NULL)"           {}
        !          1337:   2    "INSERT INTO t1 VALUES(NULL, NULL)"           {}
        !          1338:   3    "UPDATE t1 SET a = NULL"                      {}
        !          1339:   4    "UPDATE t1 SET b = NULL"                      {}
        !          1340: 
        !          1341:   5    "INSERT INTO t4 VALUES(NULL, NULL, NULL)"     {}
        !          1342:   6    "INSERT INTO t4 VALUES(NULL, NULL, NULL)"     {}
        !          1343:   7    "UPDATE t4 SET a = NULL"                      {}
        !          1344:   8    "UPDATE t4 SET b = NULL"                      {}
        !          1345:   9    "UPDATE t4 SET c = NULL"                      {}
        !          1346: }
        !          1347: 
        !          1348: # EVIDENCE-OF: R-26983-26377 INTEGER PRIMARY KEY columns aside, both
        !          1349: # UNIQUE and PRIMARY KEY constraints are implemented by creating an
        !          1350: # index in the database (in the same way as a "CREATE UNIQUE INDEX"
        !          1351: # statement would).
        !          1352: do_createtable_tests 4.9 -repair drop_all_tables -query {
        !          1353:   SELECT count(*) FROM sqlite_master WHERE type='index'
        !          1354: } {
        !          1355:   1    "CREATE TABLE t1(a TEXT PRIMARY KEY, b)"              1
        !          1356:   2    "CREATE TABLE t1(a INTEGER PRIMARY KEY, b)"           0
        !          1357:   3    "CREATE TABLE t1(a TEXT UNIQUE, b)"                   1
        !          1358:   4    "CREATE TABLE t1(a PRIMARY KEY, b TEXT UNIQUE)"       2
        !          1359:   5    "CREATE TABLE t1(a PRIMARY KEY, b, c, UNIQUE(c, b))"  2
        !          1360: }
        !          1361: 
        !          1362: # EVIDENCE-OF: R-02252-33116 Such an index is used like any other index
        !          1363: # in the database to optimize queries.
        !          1364: #
        !          1365: do_execsql_test 4.10.0 {
        !          1366:   CREATE TABLE t1(a, b PRIMARY KEY);
        !          1367:   CREATE TABLE t2(a, b, c, UNIQUE(b, c));
        !          1368: }
        !          1369: do_createtable_tests 4.10 {
        !          1370:   1    "EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b = 5" 
        !          1371:        {0 0 0 {SEARCH TABLE t1 USING INDEX sqlite_autoindex_t1_1 (b=?) (~1 rows)}}
        !          1372: 
        !          1373:   2    "EXPLAIN QUERY PLAN SELECT * FROM t2 ORDER BY b, c"
        !          1374:        {0 0 0 {SCAN TABLE t2 USING INDEX sqlite_autoindex_t2_1 (~1000000 rows)}}
        !          1375: 
        !          1376:   3    "EXPLAIN QUERY PLAN SELECT * FROM t2 WHERE b=10 AND c>10"
        !          1377:        {0 0 0 {SEARCH TABLE t2 USING INDEX sqlite_autoindex_t2_1 (b=? AND c>?) (~2 rows)}}
        !          1378: }
        !          1379: 
        !          1380: # EVIDENCE-OF: R-45493-35653 A CHECK constraint may be attached to a
        !          1381: # column definition or specified as a table constraint. In practice it
        !          1382: # makes no difference.
        !          1383: #
        !          1384: #   All the tests that deal with CHECK constraints below (4.11.* and 
        !          1385: #   4.12.*) are run once for a table with the check constraint attached
        !          1386: #   to a column definition, and once with a table where the check 
        !          1387: #   condition is specified as a table constraint.
        !          1388: #
        !          1389: # EVIDENCE-OF: R-55435-14303 Each time a new row is inserted into the
        !          1390: # table or an existing row is updated, the expression associated with
        !          1391: # each CHECK constraint is evaluated and cast to a NUMERIC value in the
        !          1392: # same way as a CAST expression. If the result is zero (integer value 0
        !          1393: # or real value 0.0), then a constraint violation has occurred.
        !          1394: #
        !          1395: drop_all_tables
        !          1396: do_execsql_test 4.11 {
        !          1397:   CREATE TABLE x1(a TEXT, b INTEGER CHECK( b>0 ));
        !          1398:   CREATE TABLE t1(a TEXT, b INTEGER, CHECK( b>0 ));
        !          1399:   INSERT INTO x1 VALUES('x', 'xx');
        !          1400:   INSERT INTO x1 VALUES('y', 'yy');
        !          1401:   INSERT INTO t1 SELECT * FROM x1;
        !          1402: 
        !          1403:   CREATE TABLE x2(a CHECK( a||b ), b);
        !          1404:   CREATE TABLE t2(a, b, CHECK( a||b ));
        !          1405:   INSERT INTO x2 VALUES(1, 'xx');
        !          1406:   INSERT INTO x2 VALUES(1, 'yy');
        !          1407:   INSERT INTO t2 SELECT * FROM x2;
        !          1408: }
        !          1409: 
        !          1410: do_createtable_tests 4.11 -error {constraint failed} {
        !          1411:   1a    "INSERT INTO x1 VALUES('one', 0)"       {}
        !          1412:   1b    "INSERT INTO t1 VALUES('one', -4.0)"    {}
        !          1413: 
        !          1414:   2a    "INSERT INTO x2 VALUES('abc', 1)"       {}
        !          1415:   2b    "INSERT INTO t2 VALUES('abc', 1)"       {}
        !          1416: 
        !          1417:   3a    "INSERT INTO x2 VALUES(0, 'abc')"       {}
        !          1418:   3b    "INSERT INTO t2 VALUES(0, 'abc')"       {}
        !          1419: 
        !          1420:   4a    "UPDATE t1 SET b=-1 WHERE rowid=1"      {}
        !          1421:   4b    "UPDATE x1 SET b=-1 WHERE rowid=1"      {}
        !          1422: 
        !          1423:   4a    "UPDATE x2 SET a='' WHERE rowid=1"      {}
        !          1424:   4b    "UPDATE t2 SET a='' WHERE rowid=1"      {}
        !          1425: }
        !          1426: 
        !          1427: # EVIDENCE-OF: R-34109-39108 If the CHECK expression evaluates to NULL,
        !          1428: # or any other non-zero value, it is not a constraint violation.
        !          1429: #
        !          1430: do_createtable_tests 4.12 {
        !          1431:   1a    "INSERT INTO x1 VALUES('one', NULL)"    {}
        !          1432:   1b    "INSERT INTO t1 VALUES('one', NULL)"    {}
        !          1433: 
        !          1434:   2a    "INSERT INTO x1 VALUES('one', 2)"    {}
        !          1435:   2b    "INSERT INTO t1 VALUES('one', 2)"    {}
        !          1436: 
        !          1437:   3a    "INSERT INTO x2 VALUES(1, 'abc')"       {}
        !          1438:   3b    "INSERT INTO t2 VALUES(1, 'abc')"       {}
        !          1439: }
        !          1440: 
        !          1441: # EVIDENCE-OF: R-02060-64547 A NOT NULL constraint may only be attached
        !          1442: # to a column definition, not specified as a table constraint.
        !          1443: #
        !          1444: drop_all_tables
        !          1445: do_createtable_tests 4.13.1 {
        !          1446:   1     "CREATE TABLE t1(a NOT NULL, b)"                               {}
        !          1447:   2     "CREATE TABLE t2(a PRIMARY KEY NOT NULL, b)"                   {}
        !          1448:   3     "CREATE TABLE t3(a NOT NULL, b NOT NULL, c NOT NULL UNIQUE)"   {}
        !          1449: }
        !          1450: do_createtable_tests 4.13.2 -error {
        !          1451:   near "NOT": syntax error
        !          1452: } {
        !          1453:   1     "CREATE TABLE t4(a, b, NOT NULL(a))"                   {}
        !          1454:   2     "CREATE TABLE t4(a PRIMARY KEY, b, NOT NULL(a))"       {}
        !          1455:   3     "CREATE TABLE t4(a, b, c UNIQUE, NOT NULL(a, b, c))"   {}
        !          1456: }
        !          1457: 
        !          1458: # EVIDENCE-OF: R-31795-57643 a NOT NULL constraint dictates that the
        !          1459: # associated column may not contain a NULL value. Attempting to set the
        !          1460: # column value to NULL when inserting a new row or updating an existing
        !          1461: # one causes a constraint violation.
        !          1462: #
        !          1463: #     These tests use the tables created by 4.13.
        !          1464: #
        !          1465: do_execsql_test 4.14.0 {
        !          1466:   INSERT INTO t1 VALUES('x', 'y');
        !          1467:   INSERT INTO t1 VALUES('z', NULL);
        !          1468: 
        !          1469:   INSERT INTO t2 VALUES('x', 'y');
        !          1470:   INSERT INTO t2 VALUES('z', NULL);
        !          1471: 
        !          1472:   INSERT INTO t3 VALUES('x', 'y', 'z');
        !          1473:   INSERT INTO t3 VALUES(1, 2, 3);
        !          1474: }
        !          1475: do_createtable_tests 4.14 -error {
        !          1476:   %s may not be NULL
        !          1477: } {
        !          1478:   1    "INSERT INTO t1 VALUES(NULL, 'a')"         {t1.a}
        !          1479:   2    "INSERT INTO t2 VALUES(NULL, 'b')"         {t2.a}
        !          1480:   3    "INSERT INTO t3 VALUES('c', 'd', NULL)"    {t3.c}
        !          1481:   4    "INSERT INTO t3 VALUES('e', NULL, 'f')"    {t3.b}
        !          1482:   5    "INSERT INTO t3 VALUES(NULL, 'g', 'h')"    {t3.a}
        !          1483: }
        !          1484: 
        !          1485: # EVIDENCE-OF: R-42511-39459 PRIMARY KEY, UNIQUE and NOT NULL
        !          1486: # constraints may be explicitly assigned a default conflict resolution
        !          1487: # algorithm by including a conflict-clause in their definitions.
        !          1488: #
        !          1489: #     Conflict clauses: ABORT, ROLLBACK, IGNORE, FAIL, REPLACE
        !          1490: #
        !          1491: #     Test cases 4.15.*, 4.16.* and 4.17.* focus on PRIMARY KEY, NOT NULL
        !          1492: #     and UNIQUE constraints, respectively.
        !          1493: #
        !          1494: drop_all_tables
        !          1495: do_execsql_test 4.15.0 {
        !          1496:   CREATE TABLE t1_ab(a PRIMARY KEY ON CONFLICT ABORT, b);
        !          1497:   CREATE TABLE t1_ro(a PRIMARY KEY ON CONFLICT ROLLBACK, b);
        !          1498:   CREATE TABLE t1_ig(a PRIMARY KEY ON CONFLICT IGNORE, b);
        !          1499:   CREATE TABLE t1_fa(a PRIMARY KEY ON CONFLICT FAIL, b);
        !          1500:   CREATE TABLE t1_re(a PRIMARY KEY ON CONFLICT REPLACE, b);
        !          1501:   CREATE TABLE t1_xx(a PRIMARY KEY, b);
        !          1502: 
        !          1503:   INSERT INTO t1_ab VALUES(1, 'one');
        !          1504:   INSERT INTO t1_ab VALUES(2, 'two');
        !          1505:   INSERT INTO t1_ro SELECT * FROM t1_ab;
        !          1506:   INSERT INTO t1_ig SELECT * FROM t1_ab;
        !          1507:   INSERT INTO t1_fa SELECT * FROM t1_ab;
        !          1508:   INSERT INTO t1_re SELECT * FROM t1_ab;
        !          1509:   INSERT INTO t1_xx SELECT * FROM t1_ab;
        !          1510: 
        !          1511:   CREATE TABLE t2_ab(a, b NOT NULL ON CONFLICT ABORT);
        !          1512:   CREATE TABLE t2_ro(a, b NOT NULL ON CONFLICT ROLLBACK);
        !          1513:   CREATE TABLE t2_ig(a, b NOT NULL ON CONFLICT IGNORE);
        !          1514:   CREATE TABLE t2_fa(a, b NOT NULL ON CONFLICT FAIL);
        !          1515:   CREATE TABLE t2_re(a, b NOT NULL ON CONFLICT REPLACE);
        !          1516:   CREATE TABLE t2_xx(a, b NOT NULL);
        !          1517: 
        !          1518:   INSERT INTO t2_ab VALUES(1, 'one');
        !          1519:   INSERT INTO t2_ab VALUES(2, 'two');
        !          1520:   INSERT INTO t2_ro SELECT * FROM t2_ab;
        !          1521:   INSERT INTO t2_ig SELECT * FROM t2_ab;
        !          1522:   INSERT INTO t2_fa SELECT * FROM t2_ab;
        !          1523:   INSERT INTO t2_re SELECT * FROM t2_ab;
        !          1524:   INSERT INTO t2_xx SELECT * FROM t2_ab;
        !          1525: 
        !          1526:   CREATE TABLE t3_ab(a, b, UNIQUE(a, b) ON CONFLICT ABORT);
        !          1527:   CREATE TABLE t3_ro(a, b, UNIQUE(a, b) ON CONFLICT ROLLBACK);
        !          1528:   CREATE TABLE t3_ig(a, b, UNIQUE(a, b) ON CONFLICT IGNORE);
        !          1529:   CREATE TABLE t3_fa(a, b, UNIQUE(a, b) ON CONFLICT FAIL);
        !          1530:   CREATE TABLE t3_re(a, b, UNIQUE(a, b) ON CONFLICT REPLACE);
        !          1531:   CREATE TABLE t3_xx(a, b, UNIQUE(a, b));
        !          1532: 
        !          1533:   INSERT INTO t3_ab VALUES(1, 'one');
        !          1534:   INSERT INTO t3_ab VALUES(2, 'two');
        !          1535:   INSERT INTO t3_ro SELECT * FROM t3_ab;
        !          1536:   INSERT INTO t3_ig SELECT * FROM t3_ab;
        !          1537:   INSERT INTO t3_fa SELECT * FROM t3_ab;
        !          1538:   INSERT INTO t3_re SELECT * FROM t3_ab;
        !          1539:   INSERT INTO t3_xx SELECT * FROM t3_ab;
        !          1540: }
        !          1541: 
        !          1542: foreach {tn tbl res ac data} {
        !          1543:   1   t1_ab    {1 {column a is not unique}} 0 {1 one 2 two 3 three}
        !          1544:   2   t1_ro    {1 {column a is not unique}} 1 {1 one 2 two}
        !          1545:   3   t1_fa    {1 {column a is not unique}} 0 {1 one 2 two 3 three 4 string}
        !          1546:   4   t1_ig    {0 {}} 0 {1 one 2 two 3 three 4 string 6 string}
        !          1547:   5   t1_re    {0 {}} 0 {1 one 2 two 4 string 3 string 6 string}
        !          1548:   6   t1_xx    {1 {column a is not unique}} 0 {1 one 2 two 3 three}
        !          1549: } {
        !          1550:   catchsql COMMIT
        !          1551:   do_execsql_test  4.15.$tn.1 "BEGIN; INSERT INTO $tbl VALUES(3, 'three')"
        !          1552: 
        !          1553:   do_catchsql_test 4.15.$tn.2        !          1554:     INSERT INTO $tbl SELECT ((a%2)*a+3), 'string' FROM $tbl;
        !          1555:   " $res
        !          1556: 
        !          1557:   do_test e_createtable-4.15.$tn.3 { sqlite3_get_autocommit db } $ac
        !          1558:   do_execsql_test 4.15.$tn.4 "SELECT * FROM $tbl" $data
        !          1559: }
        !          1560: foreach {tn tbl res ac data} {
        !          1561:   1   t2_ab    {1 {t2_ab.b may not be NULL}} 0 {1 one 2 two 3 three}
        !          1562:   2   t2_ro    {1 {t2_ro.b may not be NULL}} 1 {1 one 2 two}
        !          1563:   3   t2_fa    {1 {t2_fa.b may not be NULL}} 0 {1 one 2 two 3 three 4 xx}
        !          1564:   4   t2_ig    {0 {}} 0 {1 one 2 two 3 three 4 xx 6 xx}
        !          1565:   5   t2_re    {1 {t2_re.b may not be NULL}} 0 {1 one 2 two 3 three}
        !          1566:   6   t2_xx    {1 {t2_xx.b may not be NULL}} 0 {1 one 2 two 3 three}
        !          1567: } {
        !          1568:   catchsql COMMIT
        !          1569:   do_execsql_test  4.16.$tn.1 "BEGIN; INSERT INTO $tbl VALUES(3, 'three')"
        !          1570: 
        !          1571:   do_catchsql_test 4.16.$tn.2        !          1572:     INSERT INTO $tbl SELECT a+3, CASE a WHEN 2 THEN NULL ELSE 'xx' END FROM $tbl
        !          1573:   " $res
        !          1574: 
        !          1575:   do_test e_createtable-4.16.$tn.3 { sqlite3_get_autocommit db } $ac
        !          1576:   do_execsql_test 4.16.$tn.4 "SELECT * FROM $tbl" $data
        !          1577: }
        !          1578: foreach {tn tbl res ac data} {
        !          1579:   1   t3_ab    {1 {columns a, b are not unique}} 0 {1 one 2 two 3 three}
        !          1580:   2   t3_ro    {1 {columns a, b are not unique}} 1 {1 one 2 two}
        !          1581:   3   t3_fa    {1 {columns a, b are not unique}} 0 {1 one 2 two 3 three 4 three}
        !          1582:   4   t3_ig    {0 {}} 0 {1 one 2 two 3 three 4 three 6 three}
        !          1583:   5   t3_re    {0 {}} 0 {1 one 2 two 4 three 3 three 6 three}
        !          1584:   6   t3_xx    {1 {columns a, b are not unique}} 0 {1 one 2 two 3 three}
        !          1585: } {
        !          1586:   catchsql COMMIT
        !          1587:   do_execsql_test  4.17.$tn.1 "BEGIN; INSERT INTO $tbl VALUES(3, 'three')"
        !          1588: 
        !          1589:   do_catchsql_test 4.17.$tn.2        !          1590:     INSERT INTO $tbl SELECT ((a%2)*a+3), 'three' FROM $tbl
        !          1591:   " $res
        !          1592: 
        !          1593:   do_test e_createtable-4.17.$tn.3 { sqlite3_get_autocommit db } $ac
        !          1594:   do_execsql_test 4.17.$tn.4 "SELECT * FROM $tbl" $data
        !          1595: }
        !          1596: catchsql COMMIT
        !          1597: 
        !          1598: # EVIDENCE-OF: R-12645-39772 Or, if a constraint definition does not
        !          1599: # include a conflict-clause or it is a CHECK constraint, the default
        !          1600: # conflict resolution algorithm is ABORT.
        !          1601: #
        !          1602: #     The first half of the above is tested along with explicit ON 
        !          1603: #     CONFLICT clauses above (specifically, the tests involving t1_xx, t2_xx
        !          1604: #     and t3_xx). The following just tests that the default conflict
        !          1605: #     handling for CHECK constraints is ABORT.
        !          1606: #
        !          1607: do_execsql_test 4.18.1 {
        !          1608:   CREATE TABLE t4(a, b CHECK (b!=10));
        !          1609:   INSERT INTO t4 VALUES(1, 2);
        !          1610:   INSERT INTO t4 VALUES(3, 4);
        !          1611: }
        !          1612: do_execsql_test  4.18.2 { BEGIN; INSERT INTO t4 VALUES(5, 6) }
        !          1613: do_catchsql_test 4.18.3 { 
        !          1614:   INSERT INTO t4 SELECT a+4, b+4 FROM t4
        !          1615: } {1 {constraint failed}}
        !          1616: do_test e_createtable-4.18.4 { sqlite3_get_autocommit db } 0
        !          1617: do_execsql_test 4.18.5 { SELECT * FROM t4 } {1 2 3 4 5 6}
        !          1618: 
        !          1619: # EVIDENCE-OF: R-19114-56113 Different constraints within the same table
        !          1620: # may have different default conflict resolution algorithms.
        !          1621: #
        !          1622: do_execsql_test 4.19.0 {
        !          1623:   CREATE TABLE t5(a NOT NULL ON CONFLICT IGNORE, b NOT NULL ON CONFLICT ABORT);
        !          1624: }
        !          1625: do_catchsql_test 4.19.1 { INSERT INTO t5 VALUES(NULL, 'not null') } {0 {}}
        !          1626: do_execsql_test  4.19.2 { SELECT * FROM t5 } {}
        !          1627: do_catchsql_test 4.19.3 { INSERT INTO t5 VALUES('not null', NULL) } \
        !          1628:   {1 {t5.b may not be NULL}}
        !          1629: do_execsql_test  4.19.4 { SELECT * FROM t5 } {}
        !          1630: 
        !          1631: #------------------------------------------------------------------------
        !          1632: # Tests for INTEGER PRIMARY KEY and rowid related statements.
        !          1633: #
        !          1634: 
        !          1635: # EVIDENCE-OF: R-52584-04009 The rowid value can be accessed using one
        !          1636: # of the special case-independent names "rowid", "oid", or "_rowid_" in
        !          1637: # place of a column name.
        !          1638: #
        !          1639: drop_all_tables
        !          1640: do_execsql_test 5.1.0 {
        !          1641:   CREATE TABLE t1(x, y);
        !          1642:   INSERT INTO t1 VALUES('one', 'first');
        !          1643:   INSERT INTO t1 VALUES('two', 'second');
        !          1644:   INSERT INTO t1 VALUES('three', 'third');
        !          1645: }
        !          1646: do_createtable_tests 5.1 {
        !          1647:   1   "SELECT rowid FROM t1"        {1 2 3}
        !          1648:   2   "SELECT oid FROM t1"          {1 2 3}
        !          1649:   3   "SELECT _rowid_ FROM t1"      {1 2 3}
        !          1650:   4   "SELECT ROWID FROM t1"        {1 2 3}
        !          1651:   5   "SELECT OID FROM t1"          {1 2 3}
        !          1652:   6   "SELECT _ROWID_ FROM t1"      {1 2 3}
        !          1653:   7   "SELECT RoWiD FROM t1"        {1 2 3}
        !          1654:   8   "SELECT OiD FROM t1"          {1 2 3}
        !          1655:   9   "SELECT _RoWiD_ FROM t1"      {1 2 3}
        !          1656: }
        !          1657: 
        !          1658: # EVIDENCE-OF: R-26501-17306 If a table contains a user defined column
        !          1659: # named "rowid", "oid" or "_rowid_", then that name always refers the
        !          1660: # explicitly declared column and cannot be used to retrieve the integer
        !          1661: # rowid value.
        !          1662: #
        !          1663: do_execsql_test 5.2.0 {
        !          1664:   CREATE TABLE t2(oid, b);
        !          1665:   CREATE TABLE t3(a, _rowid_);
        !          1666:   CREATE TABLE t4(a, b, rowid);
        !          1667: 
        !          1668:   INSERT INTO t2 VALUES('one', 'two');
        !          1669:   INSERT INTO t2 VALUES('three', 'four');
        !          1670: 
        !          1671:   INSERT INTO t3 VALUES('five', 'six');
        !          1672:   INSERT INTO t3 VALUES('seven', 'eight');
        !          1673: 
        !          1674:   INSERT INTO t4 VALUES('nine', 'ten', 'eleven');
        !          1675:   INSERT INTO t4 VALUES('twelve', 'thirteen', 'fourteen');
        !          1676: }
        !          1677: do_createtable_tests 5.2 {
        !          1678:   1   "SELECT oid, rowid, _rowid_ FROM t2"   {one 1 1      three 2 2}
        !          1679:   2   "SELECT oid, rowid, _rowid_ FROM t3"   {1 1 six      2 2 eight} 
        !          1680:   3   "SELECT oid, rowid, _rowid_ FROM t4"   {1 eleven 1   2 fourteen 2}
        !          1681: }
        !          1682: 
        !          1683: 
        !          1684: # Argument $tbl is the name of a table in the database. Argument $col is
        !          1685: # the name of one of the tables columns. Return 1 if $col is an alias for
        !          1686: # the rowid, or 0 otherwise.
        !          1687: #
        !          1688: proc is_integer_primary_key {tbl col} {
        !          1689:   lindex [db eval [subst {
        !          1690:     DELETE FROM $tbl;
        !          1691:     INSERT INTO $tbl ($col) VALUES(0);
        !          1692:     SELECT (rowid==$col) FROM $tbl;
        !          1693:     DELETE FROM $tbl;
        !          1694:   }]] 0
        !          1695: }
        !          1696: 
        !          1697: # EVIDENCE-OF: R-53738-31673 With one exception, if a table has a
        !          1698: # primary key that consists of a single column, and the declared type of
        !          1699: # that column is "INTEGER" in any mixture of upper and lower case, then
        !          1700: # the column becomes an alias for the rowid.
        !          1701: #
        !          1702: # EVIDENCE-OF: R-45951-08347 if the declaration of a column with
        !          1703: # declared type "INTEGER" includes an "PRIMARY KEY DESC" clause, it does
        !          1704: # not become an alias for the rowid and is not classified as an integer
        !          1705: # primary key.
        !          1706: #
        !          1707: do_createtable_tests 5.3 -tclquery { 
        !          1708:   is_integer_primary_key t5 pk
        !          1709: } -repair {
        !          1710:   catchsql { DROP TABLE t5 }
        !          1711: } {
        !          1712:   1   "CREATE TABLE t5(pk integer primary key)"                         1
        !          1713:   2   "CREATE TABLE t5(pk integer, primary key(pk))"                    1
        !          1714:   3   "CREATE TABLE t5(pk integer, v integer, primary key(pk))"         1
        !          1715:   4   "CREATE TABLE t5(pk integer, v integer, primary key(pk, v))"      0
        !          1716:   5   "CREATE TABLE t5(pk int, v integer, primary key(pk, v))"          0
        !          1717:   6   "CREATE TABLE t5(pk int, v integer, primary key(pk))"             0
        !          1718:   7   "CREATE TABLE t5(pk int primary key, v integer)"                  0
        !          1719:   8   "CREATE TABLE t5(pk inTEger primary key)"                         1
        !          1720:   9   "CREATE TABLE t5(pk inteGEr, primary key(pk))"                    1
        !          1721:   10  "CREATE TABLE t5(pk INTEGER, v integer, primary key(pk))"         1
        !          1722: }
        !          1723: 
        !          1724: # EVIDENCE-OF: R-41444-49665 Other integer type names like "INT" or
        !          1725: # "BIGINT" or "SHORT INTEGER" or "UNSIGNED INTEGER" causes the primary
        !          1726: # key column to behave as an ordinary table column with integer affinity
        !          1727: # and a unique index, not as an alias for the rowid.
        !          1728: #
        !          1729: do_execsql_test 5.4.1 {
        !          1730:   CREATE TABLE t6(pk INT primary key);
        !          1731:   CREATE TABLE t7(pk BIGINT primary key);
        !          1732:   CREATE TABLE t8(pk SHORT INTEGER primary key);
        !          1733:   CREATE TABLE t9(pk UNSIGNED INTEGER primary key);
        !          1734: } 
        !          1735: do_test e_createtable-5.4.2.1 { is_integer_primary_key t6 pk } 0
        !          1736: do_test e_createtable-5.4.2.2 { is_integer_primary_key t7 pk } 0
        !          1737: do_test e_createtable-5.4.2.3 { is_integer_primary_key t8 pk } 0
        !          1738: do_test e_createtable-5.4.2.4 { is_integer_primary_key t9 pk } 0
        !          1739: 
        !          1740: do_execsql_test 5.4.3 {
        !          1741:   INSERT INTO t6 VALUES('2.0');
        !          1742:   INSERT INTO t7 VALUES('2.0');
        !          1743:   INSERT INTO t8 VALUES('2.0');
        !          1744:   INSERT INTO t9 VALUES('2.0');
        !          1745:   SELECT typeof(pk), pk FROM t6;
        !          1746:   SELECT typeof(pk), pk FROM t7;
        !          1747:   SELECT typeof(pk), pk FROM t8;
        !          1748:   SELECT typeof(pk), pk FROM t9;
        !          1749: } {integer 2 integer 2 integer 2 integer 2}
        !          1750: 
        !          1751: do_catchsql_test 5.4.4.1 { 
        !          1752:   INSERT INTO t6 VALUES(2) 
        !          1753: } {1 {column pk is not unique}}
        !          1754: do_catchsql_test 5.4.4.2 { 
        !          1755:   INSERT INTO t7 VALUES(2) 
        !          1756: } {1 {column pk is not unique}}
        !          1757: do_catchsql_test 5.4.4.3 { 
        !          1758:   INSERT INTO t8 VALUES(2) 
        !          1759: } {1 {column pk is not unique}}
        !          1760: do_catchsql_test 5.4.4.4 { 
        !          1761:   INSERT INTO t9 VALUES(2) 
        !          1762: } {1 {column pk is not unique}}
        !          1763: 
        !          1764: # EVIDENCE-OF: R-56094-57830 the following three table declarations all
        !          1765: # cause the column "x" to be an alias for the rowid (an integer primary
        !          1766: # key): CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z); CREATE TABLE
        !          1767: # t(x INTEGER, y, z, PRIMARY KEY(x ASC)); CREATE TABLE t(x INTEGER, y,
        !          1768: # z, PRIMARY KEY(x DESC));
        !          1769: #
        !          1770: # EVIDENCE-OF: R-20149-25884 the following declaration does not result
        !          1771: # in "x" being an alias for the rowid: CREATE TABLE t(x INTEGER PRIMARY
        !          1772: # KEY DESC, y, z);
        !          1773: #
        !          1774: do_createtable_tests 5 -tclquery { 
        !          1775:   is_integer_primary_key t x
        !          1776: } -repair {
        !          1777:   catchsql { DROP TABLE t }
        !          1778: } {
        !          1779:   5.1    "CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z)"      1
        !          1780:   5.2    "CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x ASC))"  1
        !          1781:   5.3    "CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x DESC))" 1
        !          1782:   6.1    "CREATE TABLE t(x INTEGER PRIMARY KEY DESC, y, z)"     0
        !          1783: }
        !          1784: 
        !          1785: # EVIDENCE-OF: R-03733-29734 Rowid values may be modified using an
        !          1786: # UPDATE statement in the same way as any other column value can, either
        !          1787: # using one of the built-in aliases ("rowid", "oid" or "_rowid_") or by
        !          1788: # using an alias created by an integer primary key.
        !          1789: #
        !          1790: do_execsql_test 5.7.0 {
        !          1791:   CREATE TABLE t10(a, b);
        !          1792:   INSERT INTO t10 VALUES('ten', 10);
        !          1793: 
        !          1794:   CREATE TABLE t11(a, b INTEGER PRIMARY KEY);
        !          1795:   INSERT INTO t11 VALUES('ten', 10);
        !          1796: }
        !          1797: do_createtable_tests 5.7.1 -query { 
        !          1798:   SELECT rowid, _rowid_, oid FROM t10;
        !          1799: } {
        !          1800:   1    "UPDATE t10 SET rowid = 5"   {5 5 5}
        !          1801:   2    "UPDATE t10 SET _rowid_ = 6" {6 6 6}
        !          1802:   3    "UPDATE t10 SET oid = 7"     {7 7 7}
        !          1803: }
        !          1804: do_createtable_tests 5.7.2 -query { 
        !          1805:   SELECT rowid, _rowid_, oid, b FROM t11;
        !          1806: } {
        !          1807:   1    "UPDATE t11 SET rowid = 5"   {5 5 5 5}
        !          1808:   2    "UPDATE t11 SET _rowid_ = 6" {6 6 6 6}
        !          1809:   3    "UPDATE t11 SET oid = 7"     {7 7 7 7}
        !          1810:   4    "UPDATE t11 SET b = 8"       {8 8 8 8}
        !          1811: }
        !          1812: 
        !          1813: # EVIDENCE-OF: R-58706-14229 Similarly, an INSERT statement may provide
        !          1814: # a value to use as the rowid for each row inserted.
        !          1815: #
        !          1816: do_createtable_tests 5.8.1 -query { 
        !          1817:   SELECT rowid, _rowid_, oid FROM t10;
        !          1818: } -repair { 
        !          1819:   execsql { DELETE FROM t10 } 
        !          1820: } {
        !          1821:   1    "INSERT INTO t10(oid) VALUES(15)"           {15 15 15}
        !          1822:   2    "INSERT INTO t10(rowid) VALUES(16)"         {16 16 16}
        !          1823:   3    "INSERT INTO t10(_rowid_) VALUES(17)"       {17 17 17}
        !          1824:   4    "INSERT INTO t10(a, b, oid) VALUES(1,2,3)"  {3 3 3}
        !          1825: }
        !          1826: do_createtable_tests 5.8.2 -query { 
        !          1827:   SELECT rowid, _rowid_, oid, b FROM t11;
        !          1828: } -repair { 
        !          1829:   execsql { DELETE FROM t11 } 
        !          1830: } {
        !          1831:   1    "INSERT INTO t11(oid) VALUES(15)"           {15 15 15 15}
        !          1832:   2    "INSERT INTO t11(rowid) VALUES(16)"         {16 16 16 16}
        !          1833:   3    "INSERT INTO t11(_rowid_) VALUES(17)"       {17 17 17 17}
        !          1834:   4    "INSERT INTO t11(a, b) VALUES(1,2)"         {2 2 2 2}
        !          1835: }
        !          1836: 
        !          1837: # EVIDENCE-OF: R-32326-44592 Unlike normal SQLite columns, an integer
        !          1838: # primary key or rowid column must contain integer values. Integer
        !          1839: # primary key or rowid columns are not able to hold floating point
        !          1840: # values, strings, BLOBs, or NULLs.
        !          1841: #
        !          1842: #     This is considered by the tests for the following 3 statements,
        !          1843: #     which show that:
        !          1844: #
        !          1845: #       1. Attempts to UPDATE a rowid column to a non-integer value fail,
        !          1846: #       2. Attempts to INSERT a real, string or blob value into a rowid 
        !          1847: #          column fail, and
        !          1848: #       3. Attempting to INSERT a NULL value into a rowid column causes the
        !          1849: #          system to automatically select an integer value to use.
        !          1850: #
        !          1851: 
        !          1852: 
        !          1853: # EVIDENCE-OF: R-64224-62578 If an UPDATE statement attempts to set an
        !          1854: # integer primary key or rowid column to a NULL or blob value, or to a
        !          1855: # string or real value that cannot be losslessly converted to an
        !          1856: # integer, a "datatype mismatch" error occurs and the statement is
        !          1857: # aborted.
        !          1858: #
        !          1859: drop_all_tables
        !          1860: do_execsql_test 5.9.0 {
        !          1861:   CREATE TABLE t12(x INTEGER PRIMARY KEY, y);
        !          1862:   INSERT INTO t12 VALUES(5, 'five');
        !          1863: }
        !          1864: do_createtable_tests 5.9.1 -query { SELECT typeof(x), x FROM t12 } {
        !          1865:   1   "UPDATE t12 SET x = 4"       {integer 4}
        !          1866:   2   "UPDATE t12 SET x = 10.0"    {integer 10}
        !          1867:   3   "UPDATE t12 SET x = '12.0'"  {integer 12}
        !          1868:   4   "UPDATE t12 SET x = '-15.0'" {integer -15}
        !          1869: }
        !          1870: do_createtable_tests 5.9.2 -error {
        !          1871:   datatype mismatch
        !          1872: } {
        !          1873:   1   "UPDATE t12 SET x = 4.1"         {}
        !          1874:   2   "UPDATE t12 SET x = 'hello'"     {}
        !          1875:   3   "UPDATE t12 SET x = NULL"        {}
        !          1876:   4   "UPDATE t12 SET x = X'ABCD'"     {}
        !          1877:   5   "UPDATE t12 SET x = X'3900'"     {}
        !          1878:   6   "UPDATE t12 SET x = X'39'"       {}
        !          1879: }
        !          1880: 
        !          1881: # EVIDENCE-OF: R-05734-13629 If an INSERT statement attempts to insert a
        !          1882: # blob value, or a string or real value that cannot be losslessly
        !          1883: # converted to an integer into an integer primary key or rowid column, a
        !          1884: # "datatype mismatch" error occurs and the statement is aborted.
        !          1885: #
        !          1886: do_execsql_test 5.10.0 { DELETE FROM t12 }
        !          1887: do_createtable_tests 5.10.1 -error { 
        !          1888:   datatype mismatch
        !          1889: } {
        !          1890:   1   "INSERT INTO t12(x) VALUES(4.1)"     {}
        !          1891:   2   "INSERT INTO t12(x) VALUES('hello')" {}
        !          1892:   3   "INSERT INTO t12(x) VALUES(X'ABCD')" {}
        !          1893:   4   "INSERT INTO t12(x) VALUES(X'3900')" {}
        !          1894:   5   "INSERT INTO t12(x) VALUES(X'39')"   {}
        !          1895: }
        !          1896: do_createtable_tests 5.10.2 -query { 
        !          1897:   SELECT typeof(x), x FROM t12 
        !          1898: } -repair {
        !          1899:   execsql { DELETE FROM t12 }
        !          1900: } {
        !          1901:   1   "INSERT INTO t12(x) VALUES(4)"       {integer 4}
        !          1902:   2   "INSERT INTO t12(x) VALUES(10.0)"    {integer 10}
        !          1903:   3   "INSERT INTO t12(x) VALUES('12.0')"  {integer 12}
        !          1904:   4   "INSERT INTO t12(x) VALUES('4e3')"   {integer 4000}
        !          1905:   5   "INSERT INTO t12(x) VALUES('-14.0')" {integer -14}
        !          1906: }
        !          1907: 
        !          1908: # EVIDENCE-OF: R-07986-46024 If an INSERT statement attempts to insert a
        !          1909: # NULL value into a rowid or integer primary key column, the system
        !          1910: # chooses an integer value to use as the rowid automatically.
        !          1911: #
        !          1912: do_execsql_test 5.11.0 { DELETE FROM t12 }
        !          1913: do_createtable_tests 5.11 -query { 
        !          1914:   SELECT typeof(x), x FROM t12 WHERE y IS (SELECT max(y) FROM t12)
        !          1915: } {
        !          1916:   1   "INSERT INTO t12 DEFAULT VALUES"                {integer 1}
        !          1917:   2   "INSERT INTO t12(y)   VALUES(5)"                {integer 2}
        !          1918:   3   "INSERT INTO t12(x,y) VALUES(NULL, 10)"         {integer 3}
        !          1919:   4   "INSERT INTO t12(x,y) SELECT NULL, 15 FROM t12" 
        !          1920:       {integer 4 integer 5 integer 6}
        !          1921:   5   "INSERT INTO t12(y) SELECT 20 FROM t12 LIMIT 3"
        !          1922:       {integer 7 integer 8 integer 9}
        !          1923: }
        !          1924: 
        !          1925: finish_test

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