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