1#
2# 2001 September 15
3#
4# The author disclaims copyright to this source code.  In place of
5# a legal notice, here is a blessing:
6#
7#    May you do good and not evil.
8#    May you find forgiveness for yourself and forgive others.
9#    May you share freely, never taking more than you give.
10#
11#***********************************************************************
12# This file implements regression tests for SQLite library.  The
13# focus of this script is page cache subsystem.
14#
15# $Id: pager.test,v 1.14 2004/02/25 02:20:42 drh Exp $
16
17
18set testdir [file dirname $argv0]
19source $testdir/tester.tcl
20
21if {[info commands pager_open]!=""} {
22db close
23
24# Basic sanity check.  Open and close a pager.
25#
26do_test pager-1.0 {
27  catch {file delete -force ptf1.db}
28  catch {file delete -force ptf1.db-journal}
29  set v [catch {
30    set ::p1 [pager_open ptf1.db 10]
31  } msg]
32} {0}
33do_test pager-1.1 {
34  pager_stats $::p1
35} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
36do_test pager-1.2 {
37  pager_pagecount $::p1
38} {0}
39do_test pager-1.3 {
40  pager_stats $::p1
41} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
42do_test pager-1.4 {
43  pager_close $::p1
44} {}
45
46# Try to write a few pages.
47#
48do_test pager-2.1 {
49  set v [catch {
50    set ::p1 [pager_open ptf1.db 10]
51  } msg]
52} {0}
53#do_test pager-2.2 {
54#  set v [catch {
55#    set ::g1 [page_get $::p1 0]
56#  } msg]
57#  lappend v $msg
58#} {1 SQLITE_ERROR}
59do_test pager-2.3.1 {
60  set ::gx [page_lookup $::p1 1]
61} {}
62do_test pager-2.3.2 {
63  pager_stats $::p1
64} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
65do_test pager-2.3.3 {
66  set v [catch {
67    set ::g1 [page_get $::p1 1]
68  } msg]
69  if {$v} {lappend v $msg}
70  set v
71} {0}
72do_test pager-2.3.3 {
73  pager_stats $::p1
74} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
75do_test pager-2.3.4 {
76  set ::gx [page_lookup $::p1 1]
77  expr {$::gx!=""}
78} {1}
79do_test pager-2.3.5 {
80  pager_stats $::p1
81} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
82do_test pager-2.3.6 {
83  expr $::g1==$::gx
84} {1}
85do_test pager-2.3.7 {
86  page_unref $::gx
87  pager_stats $::p1
88} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
89do_test pager-2.4 {
90  pager_stats $::p1
91} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
92do_test pager-2.5 {
93  pager_pagecount $::p1
94} {0}
95do_test pager-2.6 {
96  pager_stats $::p1
97} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
98do_test pager-2.7 {
99  page_number $::g1
100} {1}
101do_test pager-2.8 {
102  page_read $::g1
103} {}
104do_test pager-2.9 {
105  page_unref $::g1
106} {}
107do_test pager-2.10 {
108  pager_stats $::p1
109} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 1 ovfl 0}
110do_test pager-2.11 {
111  set ::g1 [page_get $::p1 1]
112  expr {$::g1!=0}
113} {1}
114do_test pager-2.12 {
115  page_number $::g1
116} {1}
117do_test pager-2.13 {
118  pager_stats $::p1
119} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 2 ovfl 0}
120do_test pager-2.14 {
121  set v [catch {
122    page_write $::g1 "Page-One"
123  } msg]
124  lappend v $msg
125} {0 {}}
126do_test pager-2.15 {
127  pager_stats $::p1
128} {ref 1 page 1 max 10 size 1 state 2 err 0 hit 0 miss 2 ovfl 0}
129do_test pager-2.16 {
130  page_read $::g1
131} {Page-One}
132do_test pager-2.17 {
133  set v [catch {
134    pager_commit $::p1
135  } msg]
136  lappend v $msg
137} {0 {}}
138do_test pager-2.20 {
139  pager_stats $::p1
140} {ref 1 page 1 max 10 size -1 state 1 err 0 hit 0 miss 2 ovfl 0}
141do_test pager-2.19 {
142  pager_pagecount $::p1
143} {1}
144do_test pager-2.21 {
145  pager_stats $::p1
146} {ref 1 page 1 max 10 size 1 state 1 err 0 hit 0 miss 2 ovfl 0}
147do_test pager-2.22 {
148  page_unref $::g1
149} {}
150do_test pager-2.23 {
151  pager_stats $::p1
152} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 2 ovfl 0}
153do_test pager-2.24 {
154  set v [catch {
155    page_get $::p1 1
156  } ::g1]
157  if {$v} {lappend v $::g1}
158  set v
159} {0}
160do_test pager-2.25 {
161  page_read $::g1
162} {Page-One}
163do_test pager-2.26 {
164  set v [catch {
165    page_write $::g1 {page-one}
166  } msg]
167  lappend v $msg
168} {0 {}}
169do_test pager-2.27 {
170  page_read $::g1
171} {page-one}
172do_test pager-2.28 {
173  set v [catch {
174    pager_rollback $::p1
175  } msg]
176  lappend v $msg
177} {0 {}}
178do_test pager-2.29 {
179  page_unref $::g1
180  set ::g1 [page_get $::p1 1]
181  page_read $::g1
182} {Page-One}
183do_test pager-2.99 {
184  pager_close $::p1
185} {}
186
187do_test pager-3.1 {
188  set v [catch {
189    set ::p1 [pager_open ptf1.db 15]
190  } msg]
191  if {$v} {lappend v $msg}
192  set v
193} {0}
194do_test pager-3.2 {
195  pager_pagecount $::p1
196} {1}
197do_test pager-3.3 {
198  set v [catch {
199    set ::g(1) [page_get $::p1 1]
200  } msg]
201  if {$v} {lappend v $msg}
202  set v
203} {0}
204do_test pager-3.4 {
205  page_read $::g(1)
206} {Page-One}
207do_test pager-3.5 {
208  for {set i 2} {$i<=20} {incr i} {
209    set gx [page_get $::p1 $i]
210    page_write $gx "Page-$i"
211    page_unref $gx
212  }
213  pager_commit $::p1
214} {}
215for {set i 2} {$i<=20} {incr i} {
216  do_test pager-3.6.[expr {$i-1}] [subst {
217    set gx \[page_get $::p1 $i\]
218    set v \[page_read \$gx\]
219    page_unref \$gx
220    set v
221  }] "Page-$i"
222}
223for {set i 1} {$i<=20} {incr i} {
224  regsub -all CNT {
225    set ::g1 [page_get $::p1 CNT]
226    set ::g2 [page_get $::p1 CNT]
227    set ::vx [page_read $::g2]
228    expr {$::g1==$::g2}
229  } $i body;
230  do_test pager-3.7.$i.1 $body {1}
231  regsub -all CNT {
232    page_unref $::g2
233    set vy [page_read $::g1]
234    expr {$vy==$::vx}
235  } $i body;
236  do_test pager-3.7.$i.2 $body {1}
237  regsub -all CNT {
238    page_unref $::g1
239    set gx [page_get $::p1 CNT]
240    set vy [page_read $gx]
241    page_unref $gx
242    expr {$vy==$::vx}
243  } $i body;
244  do_test pager-3.7.$i.3 $body {1}
245}
246do_test pager-3.99 {
247  pager_close $::p1
248} {}
249
250# tests of the checkpoint mechanism and api
251#
252do_test pager-4.0 {
253  set v [catch {
254    file delete -force ptf1.db
255    set ::p1 [pager_open ptf1.db 15]
256  } msg]
257  if {$v} {lappend v $msg}
258  set v
259} {0}
260do_test pager-4.1 {
261  set g1 [page_get $::p1 1]
262  page_write $g1 "Page-1 v0"
263  for {set i 2} {$i<=20} {incr i} {
264    set gx [page_get $::p1 $i]
265    page_write $gx "Page-$i v0"
266    page_unref $gx
267  }
268  pager_commit $::p1
269} {}
270for {set i 1} {$i<=20} {incr i} {
271  do_test pager-4.2.$i {
272    set gx [page_get $p1 $i]
273    set v [page_read $gx]
274    page_unref $gx
275    set v
276  } "Page-$i v0"
277}
278do_test pager-4.3 {
279  lrange [pager_stats $::p1] 0 1
280} {ref 1}
281do_test pager-4.4 {
282  lrange [pager_stats $::p1] 8 9
283} {state 1}
284
285for {set i 1} {$i<20} {incr i} {
286  do_test pager-4.5.$i.0 {
287    set res {}
288    for {set j 2} {$j<=20} {incr j} {
289      set gx [page_get $p1 $j]
290      set value [page_read $gx]
291      page_unref $gx
292      set shouldbe "Page-$j v[expr {$i-1}]"
293      if {$value!=$shouldbe} {
294        lappend res $value $shouldbe
295      }
296    }
297    set res
298  } {}
299  do_test pager-4.5.$i.1 {
300    page_write $g1 "Page-1 v$i"
301    lrange [pager_stats $p1] 8 9
302  } {state 2}
303  do_test pager-4.5.$i.2 {
304    for {set j 2} {$j<=20} {incr j} {
305      set gx [page_get $p1 $j]
306      page_write $gx "Page-$j v$i"
307      page_unref $gx
308      if {$j==$i} {
309        pager_ckpt_begin $p1
310      }
311    }
312  } {}
313  do_test pager-4.5.$i.3 {
314    set res {}
315    for {set j 2} {$j<=20} {incr j} {
316      set gx [page_get $p1 $j]
317      set value [page_read $gx]
318      page_unref $gx
319      set shouldbe "Page-$j v$i"
320      if {$value!=$shouldbe} {
321        lappend res $value $shouldbe
322      }
323    }
324    set res
325  } {}
326  do_test pager-4.5.$i.4 {
327    pager_rollback $p1
328    set res {}
329    for {set j 2} {$j<=20} {incr j} {
330      set gx [page_get $p1 $j]
331      set value [page_read $gx]
332      page_unref $gx
333      set shouldbe "Page-$j v[expr {$i-1}]"
334      if {$value!=$shouldbe} {
335        lappend res $value $shouldbe
336      }
337    }
338    set res
339  } {}
340  do_test pager-4.5.$i.5 {
341    page_write $g1 "Page-1 v$i"
342    lrange [pager_stats $p1] 8 9
343  } {state 2}
344  do_test pager-4.5.$i.6 {
345    for {set j 2} {$j<=20} {incr j} {
346      set gx [page_get $p1 $j]
347      page_write $gx "Page-$j v$i"
348      page_unref $gx
349      if {$j==$i} {
350        pager_ckpt_begin $p1
351      }
352    }
353  } {}
354  do_test pager-4.5.$i.7 {
355    pager_ckpt_rollback $p1
356    for {set j 2} {$j<=20} {incr j} {
357      set gx [page_get $p1 $j]
358      set value [page_read $gx]
359      page_unref $gx
360      if {$j<=$i || $i==1} {
361        set shouldbe "Page-$j v$i"
362      } else {
363        set shouldbe "Page-$j v[expr {$i-1}]"
364      }
365      if {$value!=$shouldbe} {
366        lappend res $value $shouldbe
367      }
368    }
369    set res
370  } {}
371  do_test pager-4.5.$i.8 {
372    for {set j 2} {$j<=20} {incr j} {
373      set gx [page_get $p1 $j]
374      page_write $gx "Page-$j v$i"
375      page_unref $gx
376      if {$j==$i} {
377        pager_ckpt_begin $p1
378      }
379    }
380  } {}
381  do_test pager-4.5.$i.9 {
382    pager_ckpt_commit $p1
383    for {set j 2} {$j<=20} {incr j} {
384      set gx [page_get $p1 $j]
385      set value [page_read $gx]
386      page_unref $gx
387      set shouldbe "Page-$j v$i"
388      if {$value!=$shouldbe} {
389        lappend res $value $shouldbe
390      }
391    }
392    set res
393  } {}
394  do_test pager-4.5.$i.10 {
395    pager_commit $p1
396    lrange [pager_stats $p1] 8 9
397  } {state 1}
398}
399
400do_test pager-4.99 {
401  pager_close $::p1
402} {}
403
404
405
406  file delete -force ptf1.db
407
408} ;# end if( not mem: and has pager_open command );
409
410# Ticket #615: an assertion fault inside the pager.  It is a benign
411# fault, but we might as well test for it.
412#
413do_test pager-5.1 {
414  sqlite db test.db
415  execsql {
416    BEGIN;
417    CREATE TABLE t1(x);
418    PRAGMA synchronous=off;
419    COMMIT;
420  }
421} {}
422
423
424finish_test
425