persistentstorage/sqlite3api/TEST/TclScript/filefmt.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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.2 2007/04/06 21:42:22 drh Exp $
       
    16 
       
    17 set testdir [file dirname $argv0]
       
    18 source $testdir/tester.tcl
       
    19 db close
       
    20 file delete -force test.db test.db-journal
       
    21 
       
    22 # Database begins with valid 16-byte header string.
       
    23 #
       
    24 do_test filefmt-1.1 {
       
    25   sqlite3 db test.db
       
    26   db eval {CREATE TABLE t1(x)}
       
    27   db close
       
    28   hexio_read test.db 0 16
       
    29 } {53514C69746520666F726D6174203300}
       
    30 
       
    31 # If the 16-byte header is changed, the file will not open
       
    32 #
       
    33 do_test filefmt-1.2 {
       
    34   hexio_write test.db 0 54
       
    35   set x [catch {sqlite3 db test.db} err]
       
    36   lappend x $err
       
    37 } {0 {}}
       
    38 do_test filefmt-1.3 {
       
    39   catchsql {
       
    40     SELECT count(*) FROM sqlite_master
       
    41   }
       
    42 } {1 {file is encrypted or is not a database}}
       
    43 do_test filefmt-1.4 {
       
    44   db close
       
    45   hexio_write test.db 0 53
       
    46   sqlite3 db test.db
       
    47   catchsql {
       
    48     SELECT count(*) FROM sqlite_master
       
    49   }
       
    50 } {0 1}
       
    51 
       
    52 # The page-size is stored at offset 16
       
    53 #
       
    54 ifcapable pager_pragmas {
       
    55   foreach pagesize {512 1024 2048 4096 8192 16384 32768} {
       
    56      if {[info exists SQLITE_MAX_PAGE_SIZE]
       
    57           && $pagesize>$SQLITE_MAX_PAGE_SIZE} continue
       
    58      do_test filefmt-1.5.$pagesize.1 {
       
    59        db close
       
    60        file delete -force test.db
       
    61        sqlite3 db test.db
       
    62        db eval "PRAGMA auto_vacuum=OFF"
       
    63        db eval "PRAGMA page_size=$pagesize"
       
    64        db eval {CREATE TABLE t1(x)}
       
    65        file size test.db
       
    66      } [expr $pagesize*2]
       
    67      do_test filefmt-1.5.$pagesize.2 {
       
    68        hexio_get_int [hexio_read test.db 16 2]
       
    69      } $pagesize
       
    70   }
       
    71 }
       
    72 
       
    73 # The page-size must be a power of 2
       
    74 #
       
    75 do_test filefmt-1.6 {
       
    76   db close
       
    77   hexio_write test.db 16 [hexio_render_int16 1025]
       
    78   sqlite3 db test.db
       
    79   catchsql {
       
    80      SELECT count(*) FROM sqlite_master
       
    81   }
       
    82 } {1 {file is encrypted or is not a database}}
       
    83 
       
    84 
       
    85 # The page-size must be at least 512 bytes
       
    86 #
       
    87 do_test filefmt-1.7 {
       
    88   db close
       
    89   hexio_write test.db 16 [hexio_render_int16 256]
       
    90   sqlite3 db test.db
       
    91   catchsql {
       
    92      SELECT count(*) FROM sqlite_master
       
    93   }
       
    94 } {1 {file is encrypted or is not a database}}
       
    95 
       
    96 # Usable space per page (page-size minus unused space per page)
       
    97 # must be at least 500 bytes
       
    98 #
       
    99 ifcapable pager_pragmas {
       
   100   do_test filefmt-1.8 {
       
   101     db close
       
   102     file delete -force test.db
       
   103     sqlite3 db test.db
       
   104     db eval {PRAGMA page_size=512; CREATE TABLE t1(x)}
       
   105     db close
       
   106     hexio_write test.db 20 10
       
   107     sqlite3 db test.db
       
   108     catchsql {
       
   109        SELECT count(*) FROM sqlite_master
       
   110     }
       
   111   } {1 {file is encrypted or is not a database}}
       
   112 }
       
   113 
       
   114 
       
   115 finish_test