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