Annotation of embedaddon/sqlite3/test/filefmt.test, revision 1.1.1.1

1.1       misho       1: # 2007 April 6
                      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: # This file implements tests to verify database file format.
                     14: #
                     15: # $Id: filefmt.test,v 1.3 2009/06/18 11:34:43 drh Exp $
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: 
                     20: # Do not use a codec for tests in this file, as the database file is
                     21: # manipulated directly using tcl scripts (using the [hexio_write] command).
                     22: #
                     23: do_not_use_codec
                     24: 
                     25: db close
                     26: forcedelete test.db test.db-journal
                     27: 
                     28: # Database begins with valid 16-byte header string.
                     29: #
                     30: do_test filefmt-1.1 {
                     31:   sqlite3 db test.db
                     32:   db eval {CREATE TABLE t1(x)}
                     33:   db close
                     34:   hexio_read test.db 0 16
                     35: } {53514C69746520666F726D6174203300}
                     36: 
                     37: # If the 16-byte header is changed, the file will not open
                     38: #
                     39: do_test filefmt-1.2 {
                     40:   hexio_write test.db 0 54
                     41:   set x [catch {sqlite3 db test.db} err]
                     42:   lappend x $err
                     43: } {0 {}}
                     44: do_test filefmt-1.3 {
                     45:   catchsql {
                     46:     SELECT count(*) FROM sqlite_master
                     47:   }
                     48: } {1 {file is encrypted or is not a database}}
                     49: do_test filefmt-1.4 {
                     50:   db close
                     51:   hexio_write test.db 0 53
                     52:   sqlite3 db test.db
                     53:   catchsql {
                     54:     SELECT count(*) FROM sqlite_master
                     55:   }
                     56: } {0 1}
                     57: 
                     58: # The page-size is stored at offset 16
                     59: #
                     60: ifcapable pager_pragmas {
                     61:   foreach pagesize {512 1024 2048 4096 8192 16384 32768} {
                     62:      if {[info exists SQLITE_MAX_PAGE_SIZE]
                     63:           && $pagesize>$SQLITE_MAX_PAGE_SIZE} continue
                     64:      do_test filefmt-1.5.$pagesize.1 {
                     65:        db close
                     66:        forcedelete test.db
                     67:        sqlite3 db test.db
                     68:        db eval "PRAGMA auto_vacuum=OFF"
                     69:        db eval "PRAGMA page_size=$pagesize"
                     70:        db eval {CREATE TABLE t1(x)}
                     71:        file size test.db
                     72:      } [expr $pagesize*2]
                     73:      do_test filefmt-1.5.$pagesize.2 {
                     74:        hexio_get_int [hexio_read test.db 16 2]
                     75:      } $pagesize
                     76:   }
                     77: }
                     78: 
                     79: # The page-size must be a power of 2
                     80: #
                     81: do_test filefmt-1.6 {
                     82:   db close
                     83:   hexio_write test.db 16 [hexio_render_int16 1025]
                     84:   sqlite3 db test.db
                     85:   catchsql {
                     86:      SELECT count(*) FROM sqlite_master
                     87:   }
                     88: } {1 {file is encrypted or is not a database}}
                     89: 
                     90: 
                     91: # The page-size must be at least 512 bytes
                     92: #
                     93: do_test filefmt-1.7 {
                     94:   db close
                     95:   hexio_write test.db 16 [hexio_render_int16 256]
                     96:   sqlite3 db test.db
                     97:   catchsql {
                     98:      SELECT count(*) FROM sqlite_master
                     99:   }
                    100: } {1 {file is encrypted or is not a database}}
                    101: 
                    102: # Usable space per page (page-size minus unused space per page)
                    103: # must be at least 480 bytes
                    104: #
                    105: ifcapable pager_pragmas {
                    106:   do_test filefmt-1.8 {
                    107:     db close
                    108:     forcedelete test.db
                    109:     sqlite3 db test.db
                    110:     db eval {PRAGMA page_size=512; CREATE TABLE t1(x)}
                    111:     db close
                    112:     hexio_write test.db 20 21
                    113:     sqlite3 db test.db
                    114:     catchsql {
                    115:        SELECT count(*) FROM sqlite_master
                    116:     }
                    117:   } {1 {file is encrypted or is not a database}}
                    118: }
                    119: 
                    120: #-------------------------------------------------------------------------
                    121: # The following block of tests - filefmt-2.* - test that versions 3.7.0
                    122: # and later can read and write databases that have been modified or created
                    123: # by 3.6.23.1 and earlier. The difference difference is that 3.7.0 stores
                    124: # the size of the database in the database file header, whereas 3.6.23.1
                    125: # always derives this from the size of the file.
                    126: #
                    127: db close
                    128: forcedelete test.db
                    129: 
                    130: set a_string_counter 1
                    131: proc a_string {n} {
                    132:   incr ::a_string_counter
                    133:   string range [string repeat "${::a_string_counter}." $n] 1 $n
                    134: }
                    135: sqlite3 db test.db
                    136: db func a_string a_string
                    137: 
                    138: do_execsql_test filefmt-2.1.1 {
                    139:   PRAGMA page_size = 1024;
                    140:   PRAGMA auto_vacuum = 0;
                    141:   CREATE TABLE t1(a);
                    142:   CREATE INDEX i1 ON t1(a);
                    143:   INSERT INTO t1 VALUES(a_string(3000));
                    144:   CREATE TABLE t2(a);
                    145:   INSERT INTO t2 VALUES(1);
                    146: } {}
                    147: do_test filefmt-2.1.2 {
                    148:   hexio_read test.db 28 4
                    149: } {00000009}
                    150: 
                    151: do_test filefmt-2.1.3 {
                    152:   sql36231 { INSERT INTO t1 VALUES(a_string(3000)) }
                    153: } {}
                    154: 
                    155: do_execsql_test filefmt-2.1.4 { INSERT INTO t2 VALUES(2) } {}
                    156: integrity_check filefmt-2.1.5
                    157: do_test         filefmt-2.1.6 { hexio_read test.db 28 4 } {00000010}
                    158: 
                    159: db close
                    160: forcedelete test.db
                    161: sqlite3 db test.db
                    162: db func a_string a_string
                    163: 
                    164: do_execsql_test filefmt-2.2.1 {
                    165:   PRAGMA page_size = 1024;
                    166:   PRAGMA auto_vacuum = 0;
                    167:   CREATE TABLE t1(a);
                    168:   CREATE INDEX i1 ON t1(a);
                    169:   INSERT INTO t1 VALUES(a_string(3000));
                    170:   CREATE TABLE t2(a);
                    171:   INSERT INTO t2 VALUES(1);
                    172: } {}
                    173: do_test filefmt-2.2.2 {
                    174:   hexio_read test.db 28 4
                    175: } {00000009}
                    176: 
                    177: do_test filefmt-2.2.3 {
                    178:   sql36231 { INSERT INTO t1 VALUES(a_string(3000)) }
                    179: } {}
                    180: 
                    181: do_execsql_test filefmt-2.2.4 { 
                    182:   PRAGMA integrity_check;
                    183:   BEGIN;
                    184:     INSERT INTO t2 VALUES(2);
                    185:     SAVEPOINT a;
                    186:       INSERT INTO t2 VALUES(3);
                    187:     ROLLBACK TO a;
                    188: } {ok}
                    189: 
                    190: integrity_check filefmt-2.2.5
                    191: do_execsql_test filefmt-2.2.6 { COMMIT } {}
                    192: db close
                    193: sqlite3 db test.db
                    194: integrity_check filefmt-2.2.7
                    195: 
                    196: #--------------------------------------------------------------------------
                    197: # Check that ticket 89b8c9ac54 is fixed. Before the fix, the SELECT 
                    198: # statement would return SQLITE_CORRUPT. The database file was not actually
                    199: # corrupted, but SQLite was reporting that it was.
                    200: #
                    201: db close
                    202: forcedelete test.db
                    203: sqlite3 db test.db
                    204: do_execsql_test filefmt-3.1 {
                    205:   PRAGMA auto_vacuum = 1;
                    206:   CREATE TABLE t1(a, b);
                    207: } {}
                    208: do_test filefmt-3.2 { 
                    209:   sql36231 { DROP TABLE t1 } 
                    210: } {}
                    211: do_execsql_test filefmt-3.3 {
                    212:   SELECT * FROM sqlite_master;
                    213:   PRAGMA integrity_check;
                    214: } {ok}
                    215: 
                    216: finish_test

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