# 2012 January 4 {} # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. # # Test recover module syntax. # # $Id$ # TODO(shess): Test with attached databases. # TODO(shess): Handle column mismatches? As things stand, the code # only needs to pull the root page, so that may not be completely # feasible. set testdir [file dirname $argv0] source $testdir/tester.tcl db eval { DROP TABLE IF EXISTS backing; CREATE TABLE backing (t TEXT); DROP TABLE IF EXISTS backing2; CREATE TABLE backing2 (id INTEGER PRIMARY KEY, t TEXT); } # Baseline create works. do_test recover-syntax-0.0 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t TEXT ); } } {0 {}} # Can specify database. do_test recover-syntax-0.1 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( main.backing, t TEXT ); } } {0 {}} # Can specify sqlite_master. do_test recover-syntax-0.2 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( sqlite_master, type TEXT, name TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT ); } } {0 {}} # Fails if virtual table is not in the temp database. do_test recover-syntax-1.0 { db eval {DROP TABLE IF EXISTS temp.syntax;} catchsql { CREATE VIRTUAL TABLE syntax USING recover( backing, t TEXT ); } } {1 {recover table must be in temp database}} # Fails if mentions missing table. do_test recover-syntax-2.0 { db eval {DROP TABLE IF EXISTS temp.syntax;} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( snacking, t TEXT ); } } {1 {unable to find backing table}} # Fails if mentions missing database. do_test recover-syntax-2.1 { db eval {DROP TABLE IF EXISTS temp.syntax;} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( db.backing, t TEXT ); } } {1 {unable to find backing table}} # Fails if mentions garbage backing. do_test recover-syntax-2.2 { db eval {DROP TABLE IF EXISTS temp.syntax;} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( main.backing excess, t TEXT ); } } {1 {unable to find backing table}} # Database only fails. do_test recover-syntax-2.3 { db eval {DROP TABLE IF EXISTS temp.syntax;} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( main., t TEXT ); } } {1 {ill-formed table specifier}} # Table only fails. do_test recover-syntax-2.4 { db eval {DROP TABLE IF EXISTS temp.syntax;} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( .backing, t TEXT ); } } {1 {ill-formed table specifier}} # Manifest typing. do_test recover-syntax-3.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t ); PRAGMA table_info(syntax); } } {0 t {} 0 {} 0} # ANY as an alternative for manifest typing. do_test recover-syntax-3.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t ANY ); PRAGMA table_info(syntax); } } {0 t {} 0 {} 0} # ANY NOT NULL do_test recover-syntax-3.2 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t ANY NOT NULL ); PRAGMA table_info(syntax); } } {0 t {} 1 {} 0} # ANY STRICT is not sensible. do_test recover-syntax-3.3 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, v ANY STRICT ); PRAGMA table_info(syntax); } } {1 {unable to parse column 0}} # TEXT column by type works. do_test recover-syntax-4.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t TEXT ); PRAGMA table_info(syntax); } } {0 t TEXT 0 {} 0} # TEXT NOT NULL do_test recover-syntax-4.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t TEXT NOT NULL ); PRAGMA table_info(syntax); } } {0 t TEXT 1 {} 0} # TEXT STRICT do_test recover-syntax-4.2 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t TEXT STRICT ); PRAGMA table_info(syntax); } } {0 t TEXT 0 {} 0} # TEXT STRICT NOT NULL do_test recover-syntax-4.3 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, t TEXT STRICT NOT NULL ); PRAGMA table_info(syntax); } } {0 t TEXT 1 {} 0} # INTEGER do_test recover-syntax-5.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, i INTEGER ); PRAGMA table_info(syntax); } } {0 i INTEGER 0 {} 0} # INTEGER NOT NULL do_test recover-syntax-5.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, i INTEGER NOT NULL ); PRAGMA table_info(syntax); } } {0 i INTEGER 1 {} 0} # INTEGER STRICT do_test recover-syntax-5.2 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, i INTEGER STRICT ); PRAGMA table_info(syntax); } } {0 i INTEGER 0 {} 0} # INTEGER STRICT NOT NULL do_test recover-syntax-5.3 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, i INTEGER STRICT NOT NULL ); PRAGMA table_info(syntax); } } {0 i INTEGER 1 {} 0} # BLOB do_test recover-syntax-6.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, b BLOB ); PRAGMA table_info(syntax); } } {0 b BLOB 0 {} 0} # BLOB NOT NULL do_test recover-syntax-6.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, b BLOB NOT NULL ); PRAGMA table_info(syntax); } } {0 b BLOB 1 {} 0} # BLOB STRICT do_test recover-syntax-6.2 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, b BLOB STRICT ); PRAGMA table_info(syntax); } } {0 b BLOB 0 {} 0} # BLOB STRICT NOT NULL do_test recover-syntax-6.3 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, b BLOB STRICT NOT NULL ); PRAGMA table_info(syntax); } } {0 b BLOB 1 {} 0} # FLOAT do_test recover-syntax-7.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f FLOAT ); PRAGMA table_info(syntax); } } {0 f FLOAT 0 {} 0} # FLOAT NOT NULL do_test recover-syntax-7.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f FLOAT NOT NULL ); PRAGMA table_info(syntax); } } {0 f FLOAT 1 {} 0} # FLOAT STRICT do_test recover-syntax-7.2 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f FLOAT STRICT ); PRAGMA table_info(syntax); } } {0 f FLOAT 0 {} 0} # FLOAT STRICT NOT NULL do_test recover-syntax-7.3 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f FLOAT STRICT NOT NULL ); PRAGMA table_info(syntax); } } {0 f FLOAT 1 {} 0} # NUMERIC do_test recover-syntax-8.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f NUMERIC ); PRAGMA table_info(syntax); } } {0 f NUMERIC 0 {} 0} # NUMERIC NOT NULL do_test recover-syntax-8.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f NUMERIC NOT NULL ); PRAGMA table_info(syntax); } } {0 f NUMERIC 1 {} 0} # NUMERIC STRICT do_test recover-syntax-8.2 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f NUMERIC STRICT ); PRAGMA table_info(syntax); } } {0 f NUMERIC 0 {} 0} # NUMERIC STRICT NOT NULL do_test recover-syntax-8.3 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, f NUMERIC STRICT NOT NULL ); PRAGMA table_info(syntax); } } {0 f NUMERIC 1 {} 0} # ROWID do_test recover-syntax-9.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing2, id ROWID, v ); PRAGMA table_info(syntax); } } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0} # ROWID NOT NULL (is default) do_test recover-syntax-9.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing2, id ROWID NOT NULL, v ); PRAGMA table_info(syntax); } } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0} # ROWID STRICT do_test recover-syntax-9.0 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing2, id ROWID STRICT, v ); PRAGMA table_info(syntax); } } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0} # ROWID STRICT NOT NULL (is default) do_test recover-syntax-9.1 { db eval {DROP TABLE IF EXISTS temp.syntax} execsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing2, id ROWID STRICT NOT NULL, v ); PRAGMA table_info(syntax); } } {0 id INTEGER 1 {} 0 1 v {} 0 {} 0} # Invalid type info is not ignored. do_test recover-syntax-10.0 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, v GARBAGE ); } } {1 {unable to parse column 0}} # Extraneous type info is not ignored. do_test recover-syntax-10.1 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, v INTEGER GARBAGE ); } } {1 {unable to parse column 0}} # Extraneous type info is not ignored. do_test recover-syntax-10.2 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, v INTEGER NOT NULL GARBAGE ); } } {1 {unable to parse column 0}} # Multiple types don't work. do_test recover-syntax-10.3 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, v INTEGER FLOAT BLOB ); } } {1 {unable to parse column 0}} # Multiple types don't work. do_test recover-syntax-10.4 { db eval {DROP TABLE IF EXISTS temp.syntax} catchsql { CREATE VIRTUAL TABLE temp.syntax USING recover( backing, v INTEGER NOT NULL TEXT ); } } {1 {unable to parse column 0}} finish_test