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