xref: /sqlite-3.40.0/test/filefmt.test (revision ccf6d093)
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
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19db close
20file delete -force test.db test.db-journal
21
22# Database begins with valid 16-byte header string.
23#
24do_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#
33do_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 {}}
38do_test filefmt-1.3 {
39  catchsql {
40    SELECT count(*) FROM sqlite_master
41  }
42} {1 {file is encrypted or is not a database}}
43do_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#
54ifcapable 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#
75do_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#
87do_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 480 bytes
98#
99ifcapable 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 21
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
115finish_test
116