1*1da57d55SToomas Soome#
27c478bd9Sstevel@tonic-gate# 2001 September 15
37c478bd9Sstevel@tonic-gate#
47c478bd9Sstevel@tonic-gate# The author disclaims copyright to this source code.  In place of
57c478bd9Sstevel@tonic-gate# a legal notice, here is a blessing:
67c478bd9Sstevel@tonic-gate#
77c478bd9Sstevel@tonic-gate#    May you do good and not evil.
87c478bd9Sstevel@tonic-gate#    May you find forgiveness for yourself and forgive others.
97c478bd9Sstevel@tonic-gate#    May you share freely, never taking more than you give.
107c478bd9Sstevel@tonic-gate#
117c478bd9Sstevel@tonic-gate#***********************************************************************
127c478bd9Sstevel@tonic-gate# This file implements regression tests for SQLite library.  The
137c478bd9Sstevel@tonic-gate# focus of this script is page cache subsystem.
147c478bd9Sstevel@tonic-gate#
157c478bd9Sstevel@tonic-gate# $Id: pager.test,v 1.14 2004/02/25 02:20:42 drh Exp $
167c478bd9Sstevel@tonic-gate
177c478bd9Sstevel@tonic-gate
187c478bd9Sstevel@tonic-gateset testdir [file dirname $argv0]
197c478bd9Sstevel@tonic-gatesource $testdir/tester.tcl
207c478bd9Sstevel@tonic-gate
217c478bd9Sstevel@tonic-gateif {[info commands pager_open]!=""} {
227c478bd9Sstevel@tonic-gatedb close
237c478bd9Sstevel@tonic-gate
247c478bd9Sstevel@tonic-gate# Basic sanity check.  Open and close a pager.
257c478bd9Sstevel@tonic-gate#
267c478bd9Sstevel@tonic-gatedo_test pager-1.0 {
277c478bd9Sstevel@tonic-gate  catch {file delete -force ptf1.db}
287c478bd9Sstevel@tonic-gate  catch {file delete -force ptf1.db-journal}
297c478bd9Sstevel@tonic-gate  set v [catch {
307c478bd9Sstevel@tonic-gate    set ::p1 [pager_open ptf1.db 10]
317c478bd9Sstevel@tonic-gate  } msg]
327c478bd9Sstevel@tonic-gate} {0}
337c478bd9Sstevel@tonic-gatedo_test pager-1.1 {
347c478bd9Sstevel@tonic-gate  pager_stats $::p1
357c478bd9Sstevel@tonic-gate} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
367c478bd9Sstevel@tonic-gatedo_test pager-1.2 {
377c478bd9Sstevel@tonic-gate  pager_pagecount $::p1
387c478bd9Sstevel@tonic-gate} {0}
397c478bd9Sstevel@tonic-gatedo_test pager-1.3 {
407c478bd9Sstevel@tonic-gate  pager_stats $::p1
417c478bd9Sstevel@tonic-gate} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
427c478bd9Sstevel@tonic-gatedo_test pager-1.4 {
437c478bd9Sstevel@tonic-gate  pager_close $::p1
447c478bd9Sstevel@tonic-gate} {}
457c478bd9Sstevel@tonic-gate
467c478bd9Sstevel@tonic-gate# Try to write a few pages.
477c478bd9Sstevel@tonic-gate#
487c478bd9Sstevel@tonic-gatedo_test pager-2.1 {
497c478bd9Sstevel@tonic-gate  set v [catch {
507c478bd9Sstevel@tonic-gate    set ::p1 [pager_open ptf1.db 10]
517c478bd9Sstevel@tonic-gate  } msg]
527c478bd9Sstevel@tonic-gate} {0}
537c478bd9Sstevel@tonic-gate#do_test pager-2.2 {
547c478bd9Sstevel@tonic-gate#  set v [catch {
557c478bd9Sstevel@tonic-gate#    set ::g1 [page_get $::p1 0]
567c478bd9Sstevel@tonic-gate#  } msg]
577c478bd9Sstevel@tonic-gate#  lappend v $msg
587c478bd9Sstevel@tonic-gate#} {1 SQLITE_ERROR}
597c478bd9Sstevel@tonic-gatedo_test pager-2.3.1 {
607c478bd9Sstevel@tonic-gate  set ::gx [page_lookup $::p1 1]
617c478bd9Sstevel@tonic-gate} {}
627c478bd9Sstevel@tonic-gatedo_test pager-2.3.2 {
637c478bd9Sstevel@tonic-gate  pager_stats $::p1
647c478bd9Sstevel@tonic-gate} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
657c478bd9Sstevel@tonic-gatedo_test pager-2.3.3 {
667c478bd9Sstevel@tonic-gate  set v [catch {
677c478bd9Sstevel@tonic-gate    set ::g1 [page_get $::p1 1]
687c478bd9Sstevel@tonic-gate  } msg]
697c478bd9Sstevel@tonic-gate  if {$v} {lappend v $msg}
707c478bd9Sstevel@tonic-gate  set v
717c478bd9Sstevel@tonic-gate} {0}
727c478bd9Sstevel@tonic-gatedo_test pager-2.3.3 {
737c478bd9Sstevel@tonic-gate  pager_stats $::p1
747c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
757c478bd9Sstevel@tonic-gatedo_test pager-2.3.4 {
767c478bd9Sstevel@tonic-gate  set ::gx [page_lookup $::p1 1]
777c478bd9Sstevel@tonic-gate  expr {$::gx!=""}
787c478bd9Sstevel@tonic-gate} {1}
797c478bd9Sstevel@tonic-gatedo_test pager-2.3.5 {
807c478bd9Sstevel@tonic-gate  pager_stats $::p1
817c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
827c478bd9Sstevel@tonic-gatedo_test pager-2.3.6 {
837c478bd9Sstevel@tonic-gate  expr $::g1==$::gx
847c478bd9Sstevel@tonic-gate} {1}
857c478bd9Sstevel@tonic-gatedo_test pager-2.3.7 {
867c478bd9Sstevel@tonic-gate  page_unref $::gx
877c478bd9Sstevel@tonic-gate  pager_stats $::p1
887c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
897c478bd9Sstevel@tonic-gatedo_test pager-2.4 {
907c478bd9Sstevel@tonic-gate  pager_stats $::p1
917c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
927c478bd9Sstevel@tonic-gatedo_test pager-2.5 {
937c478bd9Sstevel@tonic-gate  pager_pagecount $::p1
947c478bd9Sstevel@tonic-gate} {0}
957c478bd9Sstevel@tonic-gatedo_test pager-2.6 {
967c478bd9Sstevel@tonic-gate  pager_stats $::p1
977c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
987c478bd9Sstevel@tonic-gatedo_test pager-2.7 {
997c478bd9Sstevel@tonic-gate  page_number $::g1
1007c478bd9Sstevel@tonic-gate} {1}
1017c478bd9Sstevel@tonic-gatedo_test pager-2.8 {
1027c478bd9Sstevel@tonic-gate  page_read $::g1
1037c478bd9Sstevel@tonic-gate} {}
1047c478bd9Sstevel@tonic-gatedo_test pager-2.9 {
1057c478bd9Sstevel@tonic-gate  page_unref $::g1
1067c478bd9Sstevel@tonic-gate} {}
1077c478bd9Sstevel@tonic-gatedo_test pager-2.10 {
1087c478bd9Sstevel@tonic-gate  pager_stats $::p1
1097c478bd9Sstevel@tonic-gate} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 1 ovfl 0}
1107c478bd9Sstevel@tonic-gatedo_test pager-2.11 {
1117c478bd9Sstevel@tonic-gate  set ::g1 [page_get $::p1 1]
1127c478bd9Sstevel@tonic-gate  expr {$::g1!=0}
1137c478bd9Sstevel@tonic-gate} {1}
1147c478bd9Sstevel@tonic-gatedo_test pager-2.12 {
1157c478bd9Sstevel@tonic-gate  page_number $::g1
1167c478bd9Sstevel@tonic-gate} {1}
1177c478bd9Sstevel@tonic-gatedo_test pager-2.13 {
1187c478bd9Sstevel@tonic-gate  pager_stats $::p1
1197c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 2 ovfl 0}
1207c478bd9Sstevel@tonic-gatedo_test pager-2.14 {
1217c478bd9Sstevel@tonic-gate  set v [catch {
1227c478bd9Sstevel@tonic-gate    page_write $::g1 "Page-One"
1237c478bd9Sstevel@tonic-gate  } msg]
1247c478bd9Sstevel@tonic-gate  lappend v $msg
1257c478bd9Sstevel@tonic-gate} {0 {}}
1267c478bd9Sstevel@tonic-gatedo_test pager-2.15 {
1277c478bd9Sstevel@tonic-gate  pager_stats $::p1
1287c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 1 state 2 err 0 hit 0 miss 2 ovfl 0}
1297c478bd9Sstevel@tonic-gatedo_test pager-2.16 {
1307c478bd9Sstevel@tonic-gate  page_read $::g1
1317c478bd9Sstevel@tonic-gate} {Page-One}
1327c478bd9Sstevel@tonic-gatedo_test pager-2.17 {
1337c478bd9Sstevel@tonic-gate  set v [catch {
1347c478bd9Sstevel@tonic-gate    pager_commit $::p1
1357c478bd9Sstevel@tonic-gate  } msg]
1367c478bd9Sstevel@tonic-gate  lappend v $msg
1377c478bd9Sstevel@tonic-gate} {0 {}}
1387c478bd9Sstevel@tonic-gatedo_test pager-2.20 {
1397c478bd9Sstevel@tonic-gate  pager_stats $::p1
1407c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size -1 state 1 err 0 hit 0 miss 2 ovfl 0}
1417c478bd9Sstevel@tonic-gatedo_test pager-2.19 {
1427c478bd9Sstevel@tonic-gate  pager_pagecount $::p1
1437c478bd9Sstevel@tonic-gate} {1}
1447c478bd9Sstevel@tonic-gatedo_test pager-2.21 {
1457c478bd9Sstevel@tonic-gate  pager_stats $::p1
1467c478bd9Sstevel@tonic-gate} {ref 1 page 1 max 10 size 1 state 1 err 0 hit 0 miss 2 ovfl 0}
1477c478bd9Sstevel@tonic-gatedo_test pager-2.22 {
1487c478bd9Sstevel@tonic-gate  page_unref $::g1
1497c478bd9Sstevel@tonic-gate} {}
1507c478bd9Sstevel@tonic-gatedo_test pager-2.23 {
1517c478bd9Sstevel@tonic-gate  pager_stats $::p1
1527c478bd9Sstevel@tonic-gate} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 2 ovfl 0}
1537c478bd9Sstevel@tonic-gatedo_test pager-2.24 {
1547c478bd9Sstevel@tonic-gate  set v [catch {
1557c478bd9Sstevel@tonic-gate    page_get $::p1 1
1567c478bd9Sstevel@tonic-gate  } ::g1]
1577c478bd9Sstevel@tonic-gate  if {$v} {lappend v $::g1}
1587c478bd9Sstevel@tonic-gate  set v
1597c478bd9Sstevel@tonic-gate} {0}
1607c478bd9Sstevel@tonic-gatedo_test pager-2.25 {
1617c478bd9Sstevel@tonic-gate  page_read $::g1
1627c478bd9Sstevel@tonic-gate} {Page-One}
1637c478bd9Sstevel@tonic-gatedo_test pager-2.26 {
1647c478bd9Sstevel@tonic-gate  set v [catch {
1657c478bd9Sstevel@tonic-gate    page_write $::g1 {page-one}
1667c478bd9Sstevel@tonic-gate  } msg]
1677c478bd9Sstevel@tonic-gate  lappend v $msg
1687c478bd9Sstevel@tonic-gate} {0 {}}
1697c478bd9Sstevel@tonic-gatedo_test pager-2.27 {
1707c478bd9Sstevel@tonic-gate  page_read $::g1
1717c478bd9Sstevel@tonic-gate} {page-one}
1727c478bd9Sstevel@tonic-gatedo_test pager-2.28 {
1737c478bd9Sstevel@tonic-gate  set v [catch {
1747c478bd9Sstevel@tonic-gate    pager_rollback $::p1
1757c478bd9Sstevel@tonic-gate  } msg]
1767c478bd9Sstevel@tonic-gate  lappend v $msg
1777c478bd9Sstevel@tonic-gate} {0 {}}
1787c478bd9Sstevel@tonic-gatedo_test pager-2.29 {
1797c478bd9Sstevel@tonic-gate  page_unref $::g1
1807c478bd9Sstevel@tonic-gate  set ::g1 [page_get $::p1 1]
1817c478bd9Sstevel@tonic-gate  page_read $::g1
1827c478bd9Sstevel@tonic-gate} {Page-One}
1837c478bd9Sstevel@tonic-gatedo_test pager-2.99 {
1847c478bd9Sstevel@tonic-gate  pager_close $::p1
1857c478bd9Sstevel@tonic-gate} {}
1867c478bd9Sstevel@tonic-gate
1877c478bd9Sstevel@tonic-gatedo_test pager-3.1 {
1887c478bd9Sstevel@tonic-gate  set v [catch {
1897c478bd9Sstevel@tonic-gate    set ::p1 [pager_open ptf1.db 15]
1907c478bd9Sstevel@tonic-gate  } msg]
1917c478bd9Sstevel@tonic-gate  if {$v} {lappend v $msg}
1927c478bd9Sstevel@tonic-gate  set v
1937c478bd9Sstevel@tonic-gate} {0}
1947c478bd9Sstevel@tonic-gatedo_test pager-3.2 {
1957c478bd9Sstevel@tonic-gate  pager_pagecount $::p1
1967c478bd9Sstevel@tonic-gate} {1}
1977c478bd9Sstevel@tonic-gatedo_test pager-3.3 {
1987c478bd9Sstevel@tonic-gate  set v [catch {
1997c478bd9Sstevel@tonic-gate    set ::g(1) [page_get $::p1 1]
2007c478bd9Sstevel@tonic-gate  } msg]
2017c478bd9Sstevel@tonic-gate  if {$v} {lappend v $msg}
2027c478bd9Sstevel@tonic-gate  set v
2037c478bd9Sstevel@tonic-gate} {0}
2047c478bd9Sstevel@tonic-gatedo_test pager-3.4 {
2057c478bd9Sstevel@tonic-gate  page_read $::g(1)
2067c478bd9Sstevel@tonic-gate} {Page-One}
2077c478bd9Sstevel@tonic-gatedo_test pager-3.5 {
2087c478bd9Sstevel@tonic-gate  for {set i 2} {$i<=20} {incr i} {
2097c478bd9Sstevel@tonic-gate    set gx [page_get $::p1 $i]
2107c478bd9Sstevel@tonic-gate    page_write $gx "Page-$i"
2117c478bd9Sstevel@tonic-gate    page_unref $gx
2127c478bd9Sstevel@tonic-gate  }
2137c478bd9Sstevel@tonic-gate  pager_commit $::p1
2147c478bd9Sstevel@tonic-gate} {}
2157c478bd9Sstevel@tonic-gatefor {set i 2} {$i<=20} {incr i} {
2167c478bd9Sstevel@tonic-gate  do_test pager-3.6.[expr {$i-1}] [subst {
2177c478bd9Sstevel@tonic-gate    set gx \[page_get $::p1 $i\]
2187c478bd9Sstevel@tonic-gate    set v \[page_read \$gx\]
2197c478bd9Sstevel@tonic-gate    page_unref \$gx
2207c478bd9Sstevel@tonic-gate    set v
2217c478bd9Sstevel@tonic-gate  }] "Page-$i"
2227c478bd9Sstevel@tonic-gate}
2237c478bd9Sstevel@tonic-gatefor {set i 1} {$i<=20} {incr i} {
2247c478bd9Sstevel@tonic-gate  regsub -all CNT {
2257c478bd9Sstevel@tonic-gate    set ::g1 [page_get $::p1 CNT]
2267c478bd9Sstevel@tonic-gate    set ::g2 [page_get $::p1 CNT]
2277c478bd9Sstevel@tonic-gate    set ::vx [page_read $::g2]
2287c478bd9Sstevel@tonic-gate    expr {$::g1==$::g2}
2297c478bd9Sstevel@tonic-gate  } $i body;
2307c478bd9Sstevel@tonic-gate  do_test pager-3.7.$i.1 $body {1}
2317c478bd9Sstevel@tonic-gate  regsub -all CNT {
2327c478bd9Sstevel@tonic-gate    page_unref $::g2
2337c478bd9Sstevel@tonic-gate    set vy [page_read $::g1]
2347c478bd9Sstevel@tonic-gate    expr {$vy==$::vx}
2357c478bd9Sstevel@tonic-gate  } $i body;
2367c478bd9Sstevel@tonic-gate  do_test pager-3.7.$i.2 $body {1}
2377c478bd9Sstevel@tonic-gate  regsub -all CNT {
2387c478bd9Sstevel@tonic-gate    page_unref $::g1
2397c478bd9Sstevel@tonic-gate    set gx [page_get $::p1 CNT]
2407c478bd9Sstevel@tonic-gate    set vy [page_read $gx]
2417c478bd9Sstevel@tonic-gate    page_unref $gx
2427c478bd9Sstevel@tonic-gate    expr {$vy==$::vx}
2437c478bd9Sstevel@tonic-gate  } $i body;
2447c478bd9Sstevel@tonic-gate  do_test pager-3.7.$i.3 $body {1}
2457c478bd9Sstevel@tonic-gate}
2467c478bd9Sstevel@tonic-gatedo_test pager-3.99 {
2477c478bd9Sstevel@tonic-gate  pager_close $::p1
2487c478bd9Sstevel@tonic-gate} {}
2497c478bd9Sstevel@tonic-gate
2507c478bd9Sstevel@tonic-gate# tests of the checkpoint mechanism and api
2517c478bd9Sstevel@tonic-gate#
2527c478bd9Sstevel@tonic-gatedo_test pager-4.0 {
2537c478bd9Sstevel@tonic-gate  set v [catch {
2547c478bd9Sstevel@tonic-gate    file delete -force ptf1.db
2557c478bd9Sstevel@tonic-gate    set ::p1 [pager_open ptf1.db 15]
2567c478bd9Sstevel@tonic-gate  } msg]
2577c478bd9Sstevel@tonic-gate  if {$v} {lappend v $msg}
2587c478bd9Sstevel@tonic-gate  set v
2597c478bd9Sstevel@tonic-gate} {0}
2607c478bd9Sstevel@tonic-gatedo_test pager-4.1 {
2617c478bd9Sstevel@tonic-gate  set g1 [page_get $::p1 1]
2627c478bd9Sstevel@tonic-gate  page_write $g1 "Page-1 v0"
2637c478bd9Sstevel@tonic-gate  for {set i 2} {$i<=20} {incr i} {
2647c478bd9Sstevel@tonic-gate    set gx [page_get $::p1 $i]
2657c478bd9Sstevel@tonic-gate    page_write $gx "Page-$i v0"
2667c478bd9Sstevel@tonic-gate    page_unref $gx
2677c478bd9Sstevel@tonic-gate  }
2687c478bd9Sstevel@tonic-gate  pager_commit $::p1
2697c478bd9Sstevel@tonic-gate} {}
2707c478bd9Sstevel@tonic-gatefor {set i 1} {$i<=20} {incr i} {
2717c478bd9Sstevel@tonic-gate  do_test pager-4.2.$i {
2727c478bd9Sstevel@tonic-gate    set gx [page_get $p1 $i]
2737c478bd9Sstevel@tonic-gate    set v [page_read $gx]
2747c478bd9Sstevel@tonic-gate    page_unref $gx
2757c478bd9Sstevel@tonic-gate    set v
2767c478bd9Sstevel@tonic-gate  } "Page-$i v0"
2777c478bd9Sstevel@tonic-gate}
2787c478bd9Sstevel@tonic-gatedo_test pager-4.3 {
2797c478bd9Sstevel@tonic-gate  lrange [pager_stats $::p1] 0 1
2807c478bd9Sstevel@tonic-gate} {ref 1}
2817c478bd9Sstevel@tonic-gatedo_test pager-4.4 {
2827c478bd9Sstevel@tonic-gate  lrange [pager_stats $::p1] 8 9
2837c478bd9Sstevel@tonic-gate} {state 1}
2847c478bd9Sstevel@tonic-gate
2857c478bd9Sstevel@tonic-gatefor {set i 1} {$i<20} {incr i} {
2867c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.0 {
2877c478bd9Sstevel@tonic-gate    set res {}
2887c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
2897c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
2907c478bd9Sstevel@tonic-gate      set value [page_read $gx]
2917c478bd9Sstevel@tonic-gate      page_unref $gx
2927c478bd9Sstevel@tonic-gate      set shouldbe "Page-$j v[expr {$i-1}]"
2937c478bd9Sstevel@tonic-gate      if {$value!=$shouldbe} {
2947c478bd9Sstevel@tonic-gate        lappend res $value $shouldbe
2957c478bd9Sstevel@tonic-gate      }
2967c478bd9Sstevel@tonic-gate    }
2977c478bd9Sstevel@tonic-gate    set res
2987c478bd9Sstevel@tonic-gate  } {}
2997c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.1 {
3007c478bd9Sstevel@tonic-gate    page_write $g1 "Page-1 v$i"
3017c478bd9Sstevel@tonic-gate    lrange [pager_stats $p1] 8 9
3027c478bd9Sstevel@tonic-gate  } {state 2}
3037c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.2 {
3047c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
3057c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
3067c478bd9Sstevel@tonic-gate      page_write $gx "Page-$j v$i"
3077c478bd9Sstevel@tonic-gate      page_unref $gx
3087c478bd9Sstevel@tonic-gate      if {$j==$i} {
3097c478bd9Sstevel@tonic-gate        pager_ckpt_begin $p1
3107c478bd9Sstevel@tonic-gate      }
3117c478bd9Sstevel@tonic-gate    }
3127c478bd9Sstevel@tonic-gate  } {}
3137c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.3 {
3147c478bd9Sstevel@tonic-gate    set res {}
3157c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
3167c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
3177c478bd9Sstevel@tonic-gate      set value [page_read $gx]
3187c478bd9Sstevel@tonic-gate      page_unref $gx
3197c478bd9Sstevel@tonic-gate      set shouldbe "Page-$j v$i"
3207c478bd9Sstevel@tonic-gate      if {$value!=$shouldbe} {
3217c478bd9Sstevel@tonic-gate        lappend res $value $shouldbe
3227c478bd9Sstevel@tonic-gate      }
3237c478bd9Sstevel@tonic-gate    }
3247c478bd9Sstevel@tonic-gate    set res
3257c478bd9Sstevel@tonic-gate  } {}
3267c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.4 {
3277c478bd9Sstevel@tonic-gate    pager_rollback $p1
3287c478bd9Sstevel@tonic-gate    set res {}
3297c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
3307c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
3317c478bd9Sstevel@tonic-gate      set value [page_read $gx]
3327c478bd9Sstevel@tonic-gate      page_unref $gx
3337c478bd9Sstevel@tonic-gate      set shouldbe "Page-$j v[expr {$i-1}]"
3347c478bd9Sstevel@tonic-gate      if {$value!=$shouldbe} {
3357c478bd9Sstevel@tonic-gate        lappend res $value $shouldbe
3367c478bd9Sstevel@tonic-gate      }
3377c478bd9Sstevel@tonic-gate    }
3387c478bd9Sstevel@tonic-gate    set res
3397c478bd9Sstevel@tonic-gate  } {}
3407c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.5 {
3417c478bd9Sstevel@tonic-gate    page_write $g1 "Page-1 v$i"
3427c478bd9Sstevel@tonic-gate    lrange [pager_stats $p1] 8 9
3437c478bd9Sstevel@tonic-gate  } {state 2}
3447c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.6 {
3457c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
3467c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
3477c478bd9Sstevel@tonic-gate      page_write $gx "Page-$j v$i"
3487c478bd9Sstevel@tonic-gate      page_unref $gx
3497c478bd9Sstevel@tonic-gate      if {$j==$i} {
3507c478bd9Sstevel@tonic-gate        pager_ckpt_begin $p1
3517c478bd9Sstevel@tonic-gate      }
3527c478bd9Sstevel@tonic-gate    }
3537c478bd9Sstevel@tonic-gate  } {}
3547c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.7 {
3557c478bd9Sstevel@tonic-gate    pager_ckpt_rollback $p1
3567c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
3577c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
3587c478bd9Sstevel@tonic-gate      set value [page_read $gx]
3597c478bd9Sstevel@tonic-gate      page_unref $gx
3607c478bd9Sstevel@tonic-gate      if {$j<=$i || $i==1} {
3617c478bd9Sstevel@tonic-gate        set shouldbe "Page-$j v$i"
3627c478bd9Sstevel@tonic-gate      } else {
3637c478bd9Sstevel@tonic-gate        set shouldbe "Page-$j v[expr {$i-1}]"
3647c478bd9Sstevel@tonic-gate      }
3657c478bd9Sstevel@tonic-gate      if {$value!=$shouldbe} {
3667c478bd9Sstevel@tonic-gate        lappend res $value $shouldbe
3677c478bd9Sstevel@tonic-gate      }
3687c478bd9Sstevel@tonic-gate    }
3697c478bd9Sstevel@tonic-gate    set res
3707c478bd9Sstevel@tonic-gate  } {}
3717c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.8 {
3727c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
3737c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
3747c478bd9Sstevel@tonic-gate      page_write $gx "Page-$j v$i"
3757c478bd9Sstevel@tonic-gate      page_unref $gx
3767c478bd9Sstevel@tonic-gate      if {$j==$i} {
3777c478bd9Sstevel@tonic-gate        pager_ckpt_begin $p1
3787c478bd9Sstevel@tonic-gate      }
3797c478bd9Sstevel@tonic-gate    }
3807c478bd9Sstevel@tonic-gate  } {}
3817c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.9 {
3827c478bd9Sstevel@tonic-gate    pager_ckpt_commit $p1
3837c478bd9Sstevel@tonic-gate    for {set j 2} {$j<=20} {incr j} {
3847c478bd9Sstevel@tonic-gate      set gx [page_get $p1 $j]
3857c478bd9Sstevel@tonic-gate      set value [page_read $gx]
3867c478bd9Sstevel@tonic-gate      page_unref $gx
3877c478bd9Sstevel@tonic-gate      set shouldbe "Page-$j v$i"
3887c478bd9Sstevel@tonic-gate      if {$value!=$shouldbe} {
3897c478bd9Sstevel@tonic-gate        lappend res $value $shouldbe
3907c478bd9Sstevel@tonic-gate      }
3917c478bd9Sstevel@tonic-gate    }
3927c478bd9Sstevel@tonic-gate    set res
3937c478bd9Sstevel@tonic-gate  } {}
3947c478bd9Sstevel@tonic-gate  do_test pager-4.5.$i.10 {
3957c478bd9Sstevel@tonic-gate    pager_commit $p1
3967c478bd9Sstevel@tonic-gate    lrange [pager_stats $p1] 8 9
3977c478bd9Sstevel@tonic-gate  } {state 1}
3987c478bd9Sstevel@tonic-gate}
3997c478bd9Sstevel@tonic-gate
4007c478bd9Sstevel@tonic-gatedo_test pager-4.99 {
4017c478bd9Sstevel@tonic-gate  pager_close $::p1
4027c478bd9Sstevel@tonic-gate} {}
4037c478bd9Sstevel@tonic-gate
4047c478bd9Sstevel@tonic-gate
4057c478bd9Sstevel@tonic-gate
4067c478bd9Sstevel@tonic-gate  file delete -force ptf1.db
4077c478bd9Sstevel@tonic-gate
4087c478bd9Sstevel@tonic-gate} ;# end if( not mem: and has pager_open command );
4097c478bd9Sstevel@tonic-gate
4107c478bd9Sstevel@tonic-gate# Ticket #615: an assertion fault inside the pager.  It is a benign
4117c478bd9Sstevel@tonic-gate# fault, but we might as well test for it.
4127c478bd9Sstevel@tonic-gate#
4137c478bd9Sstevel@tonic-gatedo_test pager-5.1 {
4147c478bd9Sstevel@tonic-gate  sqlite db test.db
4157c478bd9Sstevel@tonic-gate  execsql {
4167c478bd9Sstevel@tonic-gate    BEGIN;
4177c478bd9Sstevel@tonic-gate    CREATE TABLE t1(x);
4187c478bd9Sstevel@tonic-gate    PRAGMA synchronous=off;
4197c478bd9Sstevel@tonic-gate    COMMIT;
4207c478bd9Sstevel@tonic-gate  }
4217c478bd9Sstevel@tonic-gate} {}
4227c478bd9Sstevel@tonic-gate
4237c478bd9Sstevel@tonic-gate
4247c478bd9Sstevel@tonic-gatefinish_test
425