Home | History | Annotate | Download | only in test
      1 # 2012 January 4 {}
      2 #
      3 # The author disclaims copyright to this source code.  In place of
      4 # a legal notice, here is a blessing:
      5 #
      6 #    May you do good and not evil.
      7 #    May you find forgiveness for yourself and forgive others.
      8 #    May you share freely, never taking more than you give.
      9 #
     10 #***********************************************************************
     11 # This file implements regression tests for SQLite library.
     12 #
     13 # Test recover module syntax.
     14 #
     15 # $Id$
     16 
     17 # TODO(shess): Test with attached databases.
     18 
     19 # TODO(shess): Handle column mismatches?  As things stand, the code
     20 # only needs to pull the root page, so that may not be completely
     21 # feasible.
     22 
     23 set testdir [file dirname $argv0]
     24 source $testdir/tester.tcl
     25 
     26 db eval {
     27   DROP TABLE IF EXISTS backing;
     28   CREATE TABLE backing (t TEXT);
     29 
     30   DROP TABLE IF EXISTS backing2;
     31   CREATE TABLE backing2 (id INTEGER PRIMARY KEY, t TEXT);
     32 }
     33 
     34 # Baseline create works.
     35 do_test recover-syntax-0.0 {
     36   db eval {DROP TABLE IF EXISTS temp.syntax}
     37   catchsql {
     38     CREATE VIRTUAL TABLE temp.syntax USING recover(
     39       backing,
     40       t TEXT
     41     );
     42   }
     43 } {0 {}}
     44 
     45 # Can specify database.
     46 do_test recover-syntax-0.1 {
     47   db eval {DROP TABLE IF EXISTS temp.syntax}
     48   catchsql {
     49     CREATE VIRTUAL TABLE temp.syntax USING recover(
     50       main.backing,
     51       t TEXT
     52     );
     53   }
     54 } {0 {}}
     55 
     56 # Can specify sqlite_master.
     57 do_test recover-syntax-0.2 {
     58   db eval {DROP TABLE IF EXISTS temp.syntax}
     59   catchsql {
     60     CREATE VIRTUAL TABLE temp.syntax USING recover(
     61       sqlite_master,
     62       type TEXT,
     63       name TEXT,
     64       tbl_name TEXT,
     65       rootpage INTEGER,
     66       sql TEXT
     67     );
     68   }
     69 } {0 {}}
     70 
     71 # Fails if virtual table is not in the temp database.
     72 do_test recover-syntax-1.0 {
     73   db eval {DROP TABLE IF EXISTS temp.syntax;}
     74   catchsql {
     75     CREATE VIRTUAL TABLE syntax USING recover(
     76       backing,
     77       t TEXT
     78     );
     79   }
     80 } {1 {recover table must be in temp database}}
     81 
     82 # Fails if mentions missing table.
     83 do_test recover-syntax-2.0 {
     84   db eval {DROP TABLE IF EXISTS temp.syntax;}
     85   catchsql {
     86     CREATE VIRTUAL TABLE temp.syntax USING recover(
     87       snacking,
     88       t TEXT
     89     );
     90   }
     91 } {1 {unable to find backing table}}
     92 
     93 # Fails if mentions missing database.
     94 do_test recover-syntax-2.1 {
     95   db eval {DROP TABLE IF EXISTS temp.syntax;}
     96   catchsql {
     97     CREATE VIRTUAL TABLE temp.syntax USING recover(
     98       db.backing,
     99       t TEXT
    100     );
    101   }
    102 } {1 {unable to find backing table}}
    103 
    104 # Fails if mentions garbage backing.
    105 do_test recover-syntax-2.2 {
    106   db eval {DROP TABLE IF EXISTS temp.syntax;}
    107   catchsql {
    108     CREATE VIRTUAL TABLE temp.syntax USING recover(
    109       main.backing excess,
    110       t TEXT
    111     );
    112   }
    113 } {1 {unable to find backing table}}
    114 
    115 # Database only fails.
    116 do_test recover-syntax-2.3 {
    117   db eval {DROP TABLE IF EXISTS temp.syntax;}
    118   catchsql {
    119     CREATE VIRTUAL TABLE temp.syntax USING recover(
    120       main.,
    121       t TEXT
    122     );
    123   }
    124 } {1 {ill-formed table specifier}}
    125 
    126 # Table only fails.
    127 do_test recover-syntax-2.4 {
    128   db eval {DROP TABLE IF EXISTS temp.syntax;}
    129   catchsql {
    130     CREATE VIRTUAL TABLE temp.syntax USING recover(
    131       .backing,
    132       t TEXT
    133     );
    134   }
    135 } {1 {ill-formed table specifier}}
    136 
    137 # Manifest typing.
    138 do_test recover-syntax-3.0 {
    139   db eval {DROP TABLE IF EXISTS temp.syntax}
    140   execsql {
    141     CREATE VIRTUAL TABLE temp.syntax USING recover(
    142       backing,
    143       t
    144     );
    145     PRAGMA table_info(syntax);
    146   }
    147 } {0 t {} 0 {} 0}
    148 
    149 # ANY as an alternative for manifest typing.
    150 do_test recover-syntax-3.1 {
    151   db eval {DROP TABLE IF EXISTS temp.syntax}
    152   execsql {
    153     CREATE VIRTUAL TABLE temp.syntax USING recover(
    154       backing,
    155       t ANY
    156     );
    157     PRAGMA table_info(syntax);
    158   }
    159 } {0 t {} 0 {} 0}
    160 
    161 # ANY NOT NULL
    162 do_test recover-syntax-3.2 {
    163   db eval {DROP TABLE IF EXISTS temp.syntax}
    164   execsql {
    165     CREATE VIRTUAL TABLE temp.syntax USING recover(
    166       backing,
    167       t ANY NOT NULL
    168     );
    169     PRAGMA table_info(syntax);
    170   }
    171 } {0 t {} 1 {} 0}
    172 
    173 # ANY STRICT is not sensible.
    174 do_test recover-syntax-3.3 {
    175   db eval {DROP TABLE IF EXISTS temp.syntax}
    176   catchsql {
    177     CREATE VIRTUAL TABLE temp.syntax USING recover(
    178       backing,
    179       v ANY STRICT
    180     );
    181     PRAGMA table_info(syntax);
    182   }
    183 } {1 {unable to parse column 0}}
    184 
    185 # TEXT column by type works.
    186 do_test recover-syntax-4.0 {
    187   db eval {DROP TABLE IF EXISTS temp.syntax}
    188   execsql {
    189     CREATE VIRTUAL TABLE temp.syntax USING recover(
    190       backing,
    191       t TEXT
    192     );
    193     PRAGMA table_info(syntax);
    194   }
    195 } {0 t TEXT 0 {} 0}
    196 
    197 # TEXT NOT NULL
    198 do_test recover-syntax-4.1 {
    199   db eval {DROP TABLE IF EXISTS temp.syntax}
    200   execsql {
    201     CREATE VIRTUAL TABLE temp.syntax USING recover(
    202       backing,
    203       t TEXT NOT NULL
    204     );
    205     PRAGMA table_info(syntax);
    206   }
    207 } {0 t TEXT 1 {} 0}
    208 
    209 # TEXT STRICT
    210 do_test recover-syntax-4.2 {
    211   db eval {DROP TABLE IF EXISTS temp.syntax}
    212   execsql {
    213     CREATE VIRTUAL TABLE temp.syntax USING recover(
    214       backing,
    215       t TEXT STRICT
    216     );
    217     PRAGMA table_info(syntax);
    218   }
    219 } {0 t TEXT 0 {} 0}
    220 
    221 # TEXT STRICT NOT NULL
    222 do_test recover-syntax-4.3 {
    223   db eval {DROP TABLE IF EXISTS temp.syntax}
    224   execsql {
    225     CREATE VIRTUAL TABLE temp.syntax USING recover(
    226       backing,
    227       t TEXT STRICT NOT NULL
    228     );
    229     PRAGMA table_info(syntax);
    230   }
    231 } {0 t TEXT 1 {} 0}
    232 
    233 # INTEGER
    234 do_test recover-syntax-5.0 {
    235   db eval {DROP TABLE IF EXISTS temp.syntax}
    236   execsql {
    237     CREATE VIRTUAL TABLE temp.syntax USING recover(
    238       backing,
    239       i INTEGER
    240     );
    241     PRAGMA table_info(syntax);
    242   }
    243 } {0 i INTEGER 0 {} 0}
    244 
    245 # INTEGER NOT NULL
    246 do_test recover-syntax-5.1 {
    247   db eval {DROP TABLE IF EXISTS temp.syntax}
    248   execsql {
    249     CREATE VIRTUAL TABLE temp.syntax USING recover(
    250       backing,
    251       i INTEGER NOT NULL
    252     );
    253     PRAGMA table_info(syntax);
    254   }
    255 } {0 i INTEGER 1 {} 0}
    256 
    257 # INTEGER STRICT
    258 do_test recover-syntax-5.2 {
    259   db eval {DROP TABLE IF EXISTS temp.syntax}
    260   execsql {
    261     CREATE VIRTUAL TABLE temp.syntax USING recover(
    262       backing,
    263       i INTEGER STRICT
    264     );
    265     PRAGMA table_info(syntax);
    266   }
    267 } {0 i INTEGER 0 {} 0}
    268 
    269 # INTEGER STRICT NOT NULL
    270 do_test recover-syntax-5.3 {
    271   db eval {DROP TABLE IF EXISTS temp.syntax}
    272   execsql {
    273     CREATE VIRTUAL TABLE temp.syntax USING recover(
    274       backing,
    275       i INTEGER STRICT NOT NULL
    276     );
    277     PRAGMA table_info(syntax);
    278   }
    279 } {0 i INTEGER 1 {} 0}
    280 
    281 # BLOB
    282 do_test recover-syntax-6.0 {
    283   db eval {DROP TABLE IF EXISTS temp.syntax}
    284   execsql {
    285     CREATE VIRTUAL TABLE temp.syntax USING recover(
    286       backing,
    287       b BLOB
    288     );
    289     PRAGMA table_info(syntax);
    290   }
    291 } {0 b BLOB 0 {} 0}
    292 
    293 # BLOB NOT NULL
    294 do_test recover-syntax-6.1 {
    295   db eval {DROP TABLE IF EXISTS temp.syntax}
    296   execsql {
    297     CREATE VIRTUAL TABLE temp.syntax USING recover(
    298       backing,
    299       b BLOB NOT NULL
    300     );
    301     PRAGMA table_info(syntax);
    302   }
    303 } {0 b BLOB 1 {} 0}
    304 
    305 # BLOB STRICT
    306 do_test recover-syntax-6.2 {
    307   db eval {DROP TABLE IF EXISTS temp.syntax}
    308   execsql {
    309     CREATE VIRTUAL TABLE temp.syntax USING recover(
    310       backing,
    311       b BLOB STRICT
    312     );
    313     PRAGMA table_info(syntax);
    314   }
    315 } {0 b BLOB 0 {} 0}
    316 
    317 # BLOB STRICT NOT NULL
    318 do_test recover-syntax-6.3 {
    319   db eval {DROP TABLE IF EXISTS temp.syntax}
    320   execsql {
    321     CREATE VIRTUAL TABLE temp.syntax USING recover(
    322       backing,
    323       b BLOB STRICT NOT NULL
    324     );
    325     PRAGMA table_info(syntax);
    326   }
    327 } {0 b BLOB 1 {} 0}
    328 
    329 # FLOAT
    330 do_test recover-syntax-7.0 {
    331   db eval {DROP TABLE IF EXISTS temp.syntax}
    332   execsql {
    333     CREATE VIRTUAL TABLE temp.syntax USING recover(
    334       backing,
    335       f FLOAT
    336     );
    337     PRAGMA table_info(syntax);
    338   }
    339 } {0 f FLOAT 0 {} 0}
    340 
    341 # FLOAT NOT NULL
    342 do_test recover-syntax-7.1 {
    343   db eval {DROP TABLE IF EXISTS temp.syntax}
    344   execsql {
    345     CREATE VIRTUAL TABLE temp.syntax USING recover(
    346       backing,
    347       f FLOAT NOT NULL
    348     );
    349     PRAGMA table_info(syntax);
    350   }
    351 } {0 f FLOAT 1 {} 0}
    352 
    353 # FLOAT STRICT
    354 do_test recover-syntax-7.2 {
    355   db eval {DROP TABLE IF EXISTS temp.syntax}
    356   execsql {
    357     CREATE VIRTUAL TABLE temp.syntax USING recover(
    358       backing,
    359       f FLOAT STRICT
    360     );
    361     PRAGMA table_info(syntax);
    362   }
    363 } {0 f FLOAT 0 {} 0}
    364 
    365 # FLOAT STRICT NOT NULL
    366 do_test recover-syntax-7.3 {
    367   db eval {DROP TABLE IF EXISTS temp.syntax}
    368   execsql {
    369     CREATE VIRTUAL TABLE temp.syntax USING recover(
    370       backing,
    371       f FLOAT STRICT NOT NULL
    372     );
    373     PRAGMA table_info(syntax);
    374   }
    375 } {0 f FLOAT 1 {} 0}
    376 
    377 # NUMERIC
    378 do_test recover-syntax-8.0 {
    379   db eval {DROP TABLE IF EXISTS temp.syntax}
    380   execsql {
    381     CREATE VIRTUAL TABLE temp.syntax USING recover(
    382       backing,
    383       f NUMERIC
    384     );
    385     PRAGMA table_info(syntax);
    386   }
    387 } {0 f NUMERIC 0 {} 0}
    388 
    389 # NUMERIC NOT NULL
    390 do_test recover-syntax-8.1 {
    391   db eval {DROP TABLE IF EXISTS temp.syntax}
    392   execsql {
    393     CREATE VIRTUAL TABLE temp.syntax USING recover(
    394       backing,
    395       f NUMERIC NOT NULL
    396     );
    397     PRAGMA table_info(syntax);
    398   }
    399 } {0 f NUMERIC 1 {} 0}
    400 
    401 # NUMERIC STRICT
    402 do_test recover-syntax-8.2 {
    403   db eval {DROP TABLE IF EXISTS temp.syntax}
    404   execsql {
    405     CREATE VIRTUAL TABLE temp.syntax USING recover(
    406       backing,
    407       f NUMERIC STRICT
    408     );
    409     PRAGMA table_info(syntax);
    410   }
    411 } {0 f NUMERIC 0 {} 0}
    412 
    413 # NUMERIC STRICT NOT NULL
    414 do_test recover-syntax-8.3 {
    415   db eval {DROP TABLE IF EXISTS temp.syntax}
    416   execsql {
    417     CREATE VIRTUAL TABLE temp.syntax USING recover(
    418       backing,
    419       f NUMERIC STRICT NOT NULL
    420     );
    421     PRAGMA table_info(syntax);
    422   }
    423 } {0 f NUMERIC 1 {} 0}
    424 
    425 # ROWID
    426 do_test recover-syntax-9.0 {
    427   db eval {DROP TABLE IF EXISTS temp.syntax}
    428   execsql {
    429     CREATE VIRTUAL TABLE temp.syntax USING recover(
    430       backing2,
    431       id ROWID,
    432       v
    433     );
    434     PRAGMA table_info(syntax);
    435   }
    436 } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0}
    437 
    438 # ROWID NOT NULL (is default)
    439 do_test recover-syntax-9.1 {
    440   db eval {DROP TABLE IF EXISTS temp.syntax}
    441   execsql {
    442     CREATE VIRTUAL TABLE temp.syntax USING recover(
    443       backing2,
    444       id ROWID NOT NULL,
    445       v
    446     );
    447     PRAGMA table_info(syntax);
    448   }
    449 } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0}
    450 
    451 # ROWID STRICT
    452 do_test recover-syntax-9.0 {
    453   db eval {DROP TABLE IF EXISTS temp.syntax}
    454   execsql {
    455     CREATE VIRTUAL TABLE temp.syntax USING recover(
    456       backing2,
    457       id ROWID STRICT,
    458       v
    459     );
    460     PRAGMA table_info(syntax);
    461   }
    462 } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0}
    463 
    464 # ROWID STRICT NOT NULL (is default)
    465 do_test recover-syntax-9.1 {
    466   db eval {DROP TABLE IF EXISTS temp.syntax}
    467   execsql {
    468     CREATE VIRTUAL TABLE temp.syntax USING recover(
    469       backing2,
    470       id ROWID STRICT NOT NULL,
    471       v
    472     );
    473     PRAGMA table_info(syntax);
    474   }
    475 } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0}
    476 
    477 # Invalid type info is not ignored.
    478 do_test recover-syntax-10.0 {
    479   db eval {DROP TABLE IF EXISTS temp.syntax}
    480   catchsql {
    481     CREATE VIRTUAL TABLE temp.syntax USING recover(
    482       backing,
    483       v GARBAGE
    484     );
    485   }
    486 } {1 {unable to parse column 0}}
    487 
    488 # Extraneous type info is not ignored.
    489 do_test recover-syntax-10.1 {
    490   db eval {DROP TABLE IF EXISTS temp.syntax}
    491   catchsql {
    492     CREATE VIRTUAL TABLE temp.syntax USING recover(
    493       backing,
    494       v INTEGER GARBAGE
    495     );
    496   }
    497 } {1 {unable to parse column 0}}
    498 
    499 # Extraneous type info is not ignored.
    500 do_test recover-syntax-10.2 {
    501   db eval {DROP TABLE IF EXISTS temp.syntax}
    502   catchsql {
    503     CREATE VIRTUAL TABLE temp.syntax USING recover(
    504       backing,
    505       v INTEGER NOT NULL GARBAGE
    506     );
    507   }
    508 } {1 {unable to parse column 0}}
    509 
    510 # Multiple types don't work.
    511 do_test recover-syntax-10.3 {
    512   db eval {DROP TABLE IF EXISTS temp.syntax}
    513   catchsql {
    514     CREATE VIRTUAL TABLE temp.syntax USING recover(
    515       backing,
    516       v INTEGER FLOAT BLOB
    517     );
    518   }
    519 } {1 {unable to parse column 0}}
    520 
    521 # Multiple types don't work.
    522 do_test recover-syntax-10.4 {
    523   db eval {DROP TABLE IF EXISTS temp.syntax}
    524   catchsql {
    525     CREATE VIRTUAL TABLE temp.syntax USING recover(
    526       backing,
    527       v INTEGER NOT NULL TEXT
    528     );
    529   }
    530 } {1 {unable to parse column 0}}
    531 
    532 finish_test
    533