xref: /sqlite-3.40.0/test/pager2.test (revision 4dcbdbff)
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.5 2004/11/22 05:26:28 danielk1977 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 0 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 0 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 0 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 1 err 0 hit 0 miss 1 ovfl 0}
76do_test pager2-2.3.4 {
77  set ::gx [page_lookup $::p1 1]
78  expr {$::gx!=""}
79} {1}
80do_test pager2-2.3.5 {
81  pager_stats $::p1
82} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
83do_test pager2-2.3.6 {
84  expr {$::g1==$::gx}
85} {1}
86do_test pager2-2.3.7 {
87  page_unref $::gx
88  pager_stats $::p1
89} {ref 1 page 1 max 10 size 0 state 1 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 1 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 1 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 1 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 1 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 1 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 1 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 1 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}
184#do_test pager2-2.99 {
185#  pager_close $::p1
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} {}
216for {set i 2} {$i<=20} {incr i} {
217  do_test pager2-3.6.[expr {$i-1}] [subst {
218    set gx \[page_get $::p1 $i\]
219    set v \[page_read \$gx\]
220    page_unref \$gx
221    set v
222  }] "Page-$i"
223}
224for {set i 1} {$i<=20} {incr i} {
225  regsub -all CNT {
226    set ::g1 [page_get $::p1 CNT]
227    set ::g2 [page_get $::p1 CNT]
228    set ::vx [page_read $::g2]
229    expr {$::g1==$::g2}
230  } $i body;
231  do_test pager2-3.7.$i.1 $body {1}
232  regsub -all CNT {
233    page_unref $::g2
234    set vy [page_read $::g1]
235    expr {$vy==$::vx}
236  } $i body;
237  do_test pager2-3.7.$i.2 $body {1}
238  regsub -all CNT {
239    page_unref $::g1
240    set gx [page_get $::p1 CNT]
241    set vy [page_read $gx]
242    page_unref $gx
243    expr {$vy==$::vx}
244  } $i body;
245  do_test pager2-3.7.$i.3 $body {1}
246}
247do_test pager2-3.99 {
248  pager_close $::p1
249} {}
250
251# tests of the checkpoint mechanism and api
252#
253do_test pager2-4.0 {
254  set v [catch {
255    set ::p1 [pager_open :memory: 15]
256  } msg]
257  if {$v} {lappend v $msg}
258  set v
259} {0}
260do_test pager2-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 pager2-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 pager2-4.3 {
279  lrange [pager_stats $::p1] 0 1
280} {ref 1}
281do_test pager2-4.4 {
282  lrange [pager_stats $::p1] 8 9
283} {state 1}
284
285for {set i 1} {$i<20} {incr i} {
286  do_test pager2-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 pager2-4.5.$i.1 {
300    page_write $g1 "Page-1 v$i"
301    lrange [pager_stats $p1] 8 9
302  } {state 4}
303  do_test pager2-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_stmt_begin $p1
310      }
311    }
312  } {}
313  do_test pager2-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 pager2-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 pager2-4.5.$i.5 {
341    page_write $g1 "Page-1 v$i"
342    lrange [pager_stats $p1] 8 9
343  } {state 4}
344  do_test pager2-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_stmt_begin $p1
351      }
352    }
353  } {}
354  do_test pager2-4.5.$i.7 {
355    pager_stmt_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 pager2-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_stmt_begin $p1
378      }
379    }
380  } {}
381  do_test pager2-4.5.$i.9 {
382    pager_stmt_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 pager2-4.5.$i.10 {
395    pager_commit $p1
396    lrange [pager_stats $p1] 8 9
397  } {state 1}
398}
399
400do_test pager2-4.99 {
401  pager_close $::p1
402} {}
403
404} ;# ifcapable inmemory
405} ;# end if( has pager_open command );
406
407
408finish_test
409