Same fix as r45172 for classes/iconimage:
[AROS-Contrib.git] / sqlite3 / test / pager.test
bloba7331675d77e8c3160aeb8c1c50e7bad4909fa78
1 # 2001 September 15
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 script is page cache subsystem.
14 # $Id: pager.test,v 1.23 2005/01/22 03:39:39 danielk1977 Exp $
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
20 if {[info commands pager_open]!=""} {
21 db close
23 # Basic sanity check.  Open and close a pager.
25 do_test pager-1.0 {
26   catch {file delete -force ptf1.db}
27   catch {file delete -force ptf1.db-journal}
28   set v [catch {
29     set ::p1 [pager_open ptf1.db 10]
30   } msg]
31 } {0}
32 do_test pager-1.1 {
33   pager_stats $::p1
34 } {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
35 do_test pager-1.2 {
36   pager_pagecount $::p1
37 } {0}
38 do_test pager-1.3 {
39   pager_stats $::p1
40 } {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
41 do_test pager-1.4 {
42   pager_close $::p1
43 } {}
45 # Try to write a few pages.
47 do_test pager-2.1 {
48   set v [catch {
49     set ::p1 [pager_open ptf1.db 10]
50   } msg]
51 } {0}
52 #do_test pager-2.2 {
53 #  set v [catch {
54 #    set ::g1 [page_get $::p1 0]
55 #  } msg]
56 #  lappend v $msg
57 #} {1 SQLITE_ERROR}
58 do_test pager-2.3.1 {
59   set ::gx [page_lookup $::p1 1]
60 } {}
61 do_test pager-2.3.2 {
62   pager_stats $::p1
63 } {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
64 do_test pager-2.3.3 {
65   set v [catch {
66     set ::g1 [page_get $::p1 1]
67   } msg]
68   if {$v} {lappend v $msg}
69   set v
70 } {0}
71 do_test pager-2.3.3 {
72   pager_stats $::p1
73 } {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
74 do_test pager-2.3.4 {
75   set ::gx [page_lookup $::p1 1]
76   expr {$::gx!=""}
77 } {1}
78 do_test pager-2.3.5 {
79   pager_stats $::p1
80 } {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
81 do_test pager-2.3.6 {
82   expr {$::g1==$::gx}
83 } {1}
84 do_test pager-2.3.7 {
85   page_unref $::gx
86   pager_stats $::p1
87 } {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
88 do_test pager-2.4 {
89   pager_stats $::p1
90 } {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
91 do_test pager-2.5 {
92   pager_pagecount $::p1
93 } {0}
94 do_test pager-2.6 {
95   pager_stats $::p1
96 } {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
97 do_test pager-2.7 {
98   page_number $::g1
99 } {1}
100 do_test pager-2.8 {
101   page_read $::g1
102 } {}
103 do_test pager-2.9 {
104   page_unref $::g1
105 } {}
106 do_test pager-2.10 {
107   pager_stats $::p1
108 } {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 1 ovfl 0}
109 do_test pager-2.11 {
110   set ::g1 [page_get $::p1 1]
111   expr {$::g1!=0}
112 } {1}
113 do_test pager-2.12 {
114   page_number $::g1
115 } {1}
116 do_test pager-2.13 {
117   pager_stats $::p1
118 } {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 2 ovfl 0}
119 do_test pager-2.14 {
120   set v [catch {
121     page_write $::g1 "Page-One"
122   } msg]
123   lappend v $msg
124 } {0 {}}
125 do_test pager-2.15 {
126   pager_stats $::p1
127 } {ref 1 page 1 max 10 size 1 state 2 err 0 hit 0 miss 2 ovfl 0}
128 do_test pager-2.16 {
129   page_read $::g1
130 } {Page-One}
131 do_test pager-2.17 {
132   set v [catch {
133     pager_commit $::p1
134   } msg]
135   lappend v $msg
136 } {0 {}}
137 do_test pager-2.20 {
138   pager_stats $::p1
139 } {ref 1 page 1 max 10 size -1 state 1 err 0 hit 1 miss 2 ovfl 0}
140 do_test pager-2.19 {
141   pager_pagecount $::p1
142 } {1}
143 do_test pager-2.21 {
144   pager_stats $::p1
145 } {ref 1 page 1 max 10 size 1 state 1 err 0 hit 1 miss 2 ovfl 0}
146 do_test pager-2.22 {
147   page_unref $::g1
148 } {}
149 do_test pager-2.23 {
150   pager_stats $::p1
151 } {ref 0 page 0 max 10 size -1 state 0 err 0 hit 1 miss 2 ovfl 0}
152 do_test pager-2.24 {
153   set v [catch {
154     page_get $::p1 1
155   } ::g1]
156   if {$v} {lappend v $::g1}
157   set v
158 } {0}
159 do_test pager-2.25 {
160   page_read $::g1
161 } {Page-One}
162 do_test pager-2.26 {
163   set v [catch {
164     page_write $::g1 {page-one}
165   } msg]
166   lappend v $msg
167 } {0 {}}
168 do_test pager-2.27 {
169   page_read $::g1
170 } {page-one}
171 do_test pager-2.28 {
172   set v [catch {
173     pager_rollback $::p1
174   } msg]
175   lappend v $msg
176 } {0 {}}
177 do_test pager-2.29 {
178   page_unref $::g1
179   set ::g1 [page_get $::p1 1]
180   page_read $::g1
181 } {Page-One}
182 do_test pager-2.99 {
183   pager_close $::p1
184 } {}
186 do_test pager-3.1 {
187   set v [catch {
188     set ::p1 [pager_open ptf1.db 15]
189   } msg]
190   if {$v} {lappend v $msg}
191   set v
192 } {0}
193 do_test pager-3.2 {
194   pager_pagecount $::p1
195 } {1}
196 do_test pager-3.3 {
197   set v [catch {
198     set ::g(1) [page_get $::p1 1]
199   } msg]
200   if {$v} {lappend v $msg}
201   set v
202 } {0}
203 do_test pager-3.4 {
204   page_read $::g(1)
205 } {Page-One}
206 do_test pager-3.5 {
207   for {set i 2} {$i<=20} {incr i} {
208     set gx [page_get $::p1 $i]
209     page_write $gx "Page-$i"
210     page_unref $gx
211   }
212   pager_commit $::p1
213 } {}
214 for {set i 2} {$i<=20} {incr i} {
215   do_test pager-3.6.[expr {$i-1}] [subst {
216     set gx \[page_get $::p1 $i\]
217     set v \[page_read \$gx\]
218     page_unref \$gx
219     set v
220   }] "Page-$i"
222 for {set i 1} {$i<=20} {incr i} {
223   regsub -all CNT {
224     set ::g1 [page_get $::p1 CNT]
225     set ::g2 [page_get $::p1 CNT]
226     set ::vx [page_read $::g2]
227     expr {$::g1==$::g2}
228   } $i body;
229   do_test pager-3.7.$i.1 $body {1}
230   regsub -all CNT {
231     page_unref $::g2
232     set vy [page_read $::g1]
233     expr {$vy==$::vx}
234   } $i body;
235   do_test pager-3.7.$i.2 $body {1}
236   regsub -all CNT {
237     page_unref $::g1
238     set gx [page_get $::p1 CNT]
239     set vy [page_read $gx]
240     page_unref $gx
241     expr {$vy==$::vx}
242   } $i body;
243   do_test pager-3.7.$i.3 $body {1}
245 do_test pager-3.99 {
246   pager_close $::p1
247 } {}
249 # tests of the checkpoint mechanism and api
251 do_test pager-4.0 {
252   set v [catch {
253     file delete -force ptf1.db
254     set ::p1 [pager_open ptf1.db 15]
255   } msg]
256   if {$v} {lappend v $msg}
257   set v
258 } {0}
259 do_test pager-4.1 {
260   set g1 [page_get $::p1 1]
261   page_write $g1 "Page-1 v0"
262   for {set i 2} {$i<=20} {incr i} {
263     set gx [page_get $::p1 $i]
264     page_write $gx "Page-$i v0"
265     page_unref $gx
266   }
267   pager_commit $::p1
268 } {}
269 for {set i 1} {$i<=20} {incr i} {
270   do_test pager-4.2.$i {
271     set gx [page_get $p1 $i]
272     set v [page_read $gx]
273     page_unref $gx
274     set v
275   } "Page-$i v0"
277 do_test pager-4.3 {
278   lrange [pager_stats $::p1] 0 1
279 } {ref 1}
280 do_test pager-4.4 {
281   lrange [pager_stats $::p1] 8 9
282 } {state 1}
284 for {set i 1} {$i<20} {incr i} {
285   do_test pager-4.5.$i.0 {
286     set res {}
287     for {set j 2} {$j<=20} {incr j} {
288       set gx [page_get $p1 $j]
289       set value [page_read $gx]
290       page_unref $gx
291       set shouldbe "Page-$j v[expr {$i-1}]"
292       if {$value!=$shouldbe} {
293         lappend res $value $shouldbe
294       }
295     }
296     set res
297   } {}
298   do_test pager-4.5.$i.1 {
299     page_write $g1 "Page-1 v$i"
300     lrange [pager_stats $p1] 8 9
301   } {state 2}
302   do_test pager-4.5.$i.2 {
303     for {set j 2} {$j<=20} {incr j} {
304       set gx [page_get $p1 $j]
305       page_write $gx "Page-$j v$i"
306       page_unref $gx
307       if {$j==$i} {
308         pager_stmt_begin $p1
309       }
310     }
311   } {}
312   do_test pager-4.5.$i.3 {
313     set res {}
314     for {set j 2} {$j<=20} {incr j} {
315       set gx [page_get $p1 $j]
316       set value [page_read $gx]
317       page_unref $gx
318       set shouldbe "Page-$j v$i"
319       if {$value!=$shouldbe} {
320         lappend res $value $shouldbe
321       }
322     }
323     set res
324   } {}
325   do_test pager-4.5.$i.4 {
326     pager_rollback $p1
327     set res {}
328     for {set j 2} {$j<=20} {incr j} {
329       set gx [page_get $p1 $j]
330       set value [page_read $gx]
331       page_unref $gx
332       set shouldbe "Page-$j v[expr {$i-1}]"
333       if {$value!=$shouldbe} {
334         lappend res $value $shouldbe
335       }
336     }
337     set res
338   } {}
339   do_test pager-4.5.$i.5 {
340     page_write $g1 "Page-1 v$i"
341     lrange [pager_stats $p1] 8 9
342   } {state 2}
343   do_test pager-4.5.$i.6 {
344     for {set j 2} {$j<=20} {incr j} {
345       set gx [page_get $p1 $j]
346       page_write $gx "Page-$j v$i"
347       page_unref $gx
348       if {$j==$i} {
349         pager_stmt_begin $p1
350       }
351     }
352   } {}
353   do_test pager-4.5.$i.7 {
354     pager_stmt_rollback $p1
355     for {set j 2} {$j<=20} {incr j} {
356       set gx [page_get $p1 $j]
357       set value [page_read $gx]
358       page_unref $gx
359       if {$j<=$i || $i==1} {
360         set shouldbe "Page-$j v$i"
361       } else {
362         set shouldbe "Page-$j v[expr {$i-1}]"
363       }
364       if {$value!=$shouldbe} {
365         lappend res $value $shouldbe
366       }
367     }
368     set res
369   } {}
370   do_test pager-4.5.$i.8 {
371     for {set j 2} {$j<=20} {incr j} {
372       set gx [page_get $p1 $j]
373       page_write $gx "Page-$j v$i"
374       page_unref $gx
375       if {$j==$i} {
376         pager_stmt_begin $p1
377       }
378     }
379   } {}
380   do_test pager-4.5.$i.9 {
381     pager_stmt_commit $p1
382     for {set j 2} {$j<=20} {incr j} {
383       set gx [page_get $p1 $j]
384       set value [page_read $gx]
385       page_unref $gx
386       set shouldbe "Page-$j v$i"
387       if {$value!=$shouldbe} {
388         lappend res $value $shouldbe
389       }
390     }
391     set res
392   } {}
393   do_test pager-4.5.$i.10 {
394     pager_commit $p1
395     lrange [pager_stats $p1] 8 9
396   } {state 1}
399 # Test that nothing bad happens when sqlite3pager_set_cachesize() is
400 # called with a negative argument.
401 do_test pager-4.6.1 {
402   pager_close [pager_open ptf2.db -15]
403 } {}
405 # Test truncate on an in-memory database is Ok.
406 ifcapable memorydb {
407   do_test pager-4.6.2 {
408     set ::p2 [pager_open :memory: 10]
409     pager_truncate $::p2 5
410   } {}
411   do_test pager-4.6.3 {
412     for {set i 1} {$i<5} {incr i} {
413       set p [page_get $::p2 $i]
414       page_write $p "Page $i"
415       page_unref $p
416       pager_commit $::p2
417     }
418     pager_truncate $::p2 3
419   } {}
420   do_test pager-4.6.4 {
421     pager_close $::p2
422   } {}
425 do_test pager-4.99 {
426   pager_close $::p1
427 } {}
431   file delete -force ptf1.db
433 } ;# end if( not mem: and has pager_open command );
435 if 0 {
436 # Ticket #615: an assertion fault inside the pager.  It is a benign
437 # fault, but we might as well test for it.
439 do_test pager-5.1 {
440   sqlite3 db test.db
441   execsql {
442     BEGIN;
443     CREATE TABLE t1(x);
444     PRAGMA synchronous=off;
445     COMMIT;
446   }
447 } {}
450 # The following tests cover rolling back hot journal files. 
451 # They can't be run on windows because the windows version of 
452 # SQLite holds a mandatory exclusive lock on journal files it has open.
454 if {$tcl_platform(platform)!="windows"} {
455 do_test pager-6.1 {
456   file delete -force test2.db
457   file delete -force test2.db-journal
458   sqlite3 db2 test2.db
459   execsql {
460     PRAGMA synchronous = 0;
461     CREATE TABLE abc(a, b, c);
462     INSERT INTO abc VALUES(1, 2, randstr(200,200));
463     INSERT INTO abc VALUES(1, 2, randstr(200,200));
464     INSERT INTO abc VALUES(1, 2, randstr(200,200));
465     INSERT INTO abc VALUES(1, 2, randstr(200,200));
466     INSERT INTO abc VALUES(1, 2, randstr(200,200));
467     INSERT INTO abc VALUES(1, 2, randstr(200,200));
468     INSERT INTO abc VALUES(1, 2, randstr(200,200));
469     INSERT INTO abc VALUES(1, 2, randstr(200,200));
470     INSERT INTO abc VALUES(1, 2, randstr(200,200));
471     BEGIN;
472     UPDATE abc SET c = randstr(200,200);
473   } db2
474   copy_file test2.db test.db
475   copy_file test2.db-journal test.db-journal
477   set f [open test.db-journal a]
478   fconfigure $f -encoding binary
479   seek $f [expr [file size test.db-journal] - 1032] start
480   puts -nonewline $f "\00\00\00\00"
481   close $f
483   sqlite3 db test.db
484   execsql {
485     SELECT sql FROM sqlite_master
486   }
487 } {{CREATE TABLE abc(a, b, c)}}
489 do_test pager-6.2 {
490   copy_file test2.db test.db
491   copy_file test2.db-journal test.db-journal
493   set f [open test.db-journal a]
494   fconfigure $f -encoding binary
495   seek $f [expr [file size test.db-journal] - 1032] start
496   puts -nonewline $f "\00\00\00\FF"
497   close $f
499   sqlite3 db test.db
500   execsql {
501     SELECT sql FROM sqlite_master
502   }
503 } {{CREATE TABLE abc(a, b, c)}}
505 do_test pager-6.3 {
506   copy_file test2.db test.db
507   copy_file test2.db-journal test.db-journal
509   set f [open test.db-journal a]
510   fconfigure $f -encoding binary
511   seek $f [expr [file size test.db-journal] - 4] start
512   puts -nonewline $f "\00\00\00\00"
513   close $f
515   sqlite3 db test.db
516   execsql {
517     SELECT sql FROM sqlite_master
518   }
519 } {{CREATE TABLE abc(a, b, c)}}
521 do_test pager-6.4 {
522   db2 close
523 } {}
525 finish_test