Small performance optimization in sqlite3VdbeRecordCompareWithSkip() for
[sqlite.git] / test / memdb1.test
blob771d5e42faf30e20f7090ca949ee14cf60eb4c58
1 # 2018-01-02
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this file is the "memdb" VFS
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
17 set testprefix memdb1
18 do_not_use_codec
20 ifcapable !deserialize {
21   finish_test
22   return
25 # Create a MEMDB and populate it with some dummy data.
26 # Then extract the database into the $::db1 variable.
27 # Verify that the size of $::db1 is the same as the size of
28 # the database.
30 unset -nocomplain db1
31 unset -nocomplain sz1
32 unset -nocomplain pgsz
33 do_test 100 {
34   db eval {
35     CREATE TABLE t1(a,b);
36     INSERT INTO t1 VALUES(1,2);
37   }
38   set ::pgsz [db one {PRAGMA page_size}]
39   set ::sz1 [expr {$::pgsz*[db one {PRAGMA page_count}]}]
40   set ::db1 [db serialize]
41   expr {[string length $::db1]==$::sz1}
42 } 1
43 set fd [open db1.db wb]
44 puts -nonewline $fd $db1
45 close $fd
47 # Create a new MEMDB and initialize it to the content of $::db1
48 # Verify that the content is the same.
50 db close
51 sqlite3 db
52 db deserialize $db1
53 do_execsql_test 110 {
54   SELECT * FROM t1;
55 } {1 2}
57 # What happens when we try to VACUUM a MEMDB database?
59 do_execsql_test 120 {
60   PRAGMA auto_vacuum = off;
61   VACUUM;
62 } {}
63 do_execsql_test 130 {
64   CREATE TABLE t2(x, y);
65   WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100)
66    INSERT INTO t2(x, y) SELECT x, randomblob(1000) FROM c;
67   DROP TABLE t2;
68   PRAGMA page_count;
69 } {116}
70 do_execsql_test 140 {
71   VACUUM;
72   PRAGMA page_count;
73 } {2}
75 # Build a largish on-disk database and serialize it.  Verify that the
76 # serialization works.
78 db close
79 forcedelete test.db
80 sqlite3 db test.db
81 do_execsql_test 200 {
82   CREATE TABLE t3(x, y);
83   WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<400)
84    INSERT INTO t3(x, y) SELECT x, randomblob(1000) FROM c;
85   PRAGMA quick_check;
86 } {ok}
87 set fd [open test.db rb]
88 unset -nocomplain direct
89 set direct [read $fd]
90 close $fd
91 do_test 210 {
92   string length [db serialize]
93 } [string length $direct]
94 do_test 220 {
95   db eval {ATTACH ':memory:' AS aux1}
96   db deserialize aux1 $::direct
97   db eval {
98      SELECT x, y FROM main.t3 EXCEPT SELECT x, y FROM aux1.t3;
99   }
100 } {}
101 unset -nocomplain direct
103 # Do the same with a :memory: database.
105 db close
106 sqlite3 db :memory:
107 do_execsql_test 300 {
108   CREATE TABLE t3(x, y);
109   WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<400)
110    INSERT INTO t3(x, y) SELECT x, randomblob(1000) FROM c;
111   PRAGMA quick_check;
112 } {ok}
113 do_test 310 {
114   db eval {ATTACH ':memory:' AS aux1}
115   db deserialize aux1 [db serialize main]
116   db eval {
117      SELECT x, y FROM main.t3 EXCEPT SELECT x, y FROM aux1.t3;
118   }
119 } {}
121 # Deserialize an empty database
123 db close
124 sqlite3 db
125 db deserialize {}
126 do_execsql_test 400 {
127   PRAGMA integrity_check;
128 } {ok}
129 do_execsql_test 410 {
130   CREATE TABLE t4(a,b);
131   INSERT INTO t4 VALUES('hello','world!');
132   PRAGMA integrity_check;
133   SELECT * FROM t4;
134 } {ok hello world!}
136 # Deserialize something that is not a database.
138 db close
139 sqlite3 db
140 do_test 500 {
141   set rc [catch {db deserialize not-a-database} msg]
142   lappend rc $msg
143 } {0 {}}
144 do_catchsql_test 510 {
145   PRAGMA integrity_check;
146 } {1 {file is not a database}}
148 # Abuse the serialize and deserialize commands.  Make sure errors are caught.
150 do_test 600 {
151   set rc [catch {db deserialize} msg]
152   lappend rc $msg
153 } {1 {wrong # args: should be "db deserialize ?DATABASE? VALUE"}}
154 do_test 610 {
155   set rc [catch {db deserialize a b c} msg]
156   lappend rc $msg
157 } {1 {wrong # args: should be "db deserialize ?DATABASE? VALUE"}}
158 do_test 620 {
159   set rc [catch {db serialize a b} msg]
160   lappend rc $msg
161 } {1 {wrong # args: should be "db serialize ?DATABASE?"}}
163 finish_test