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