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