1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/pager.test Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,576 @@
1.4 + # 2001 September 15
1.5 +#
1.6 +# Portions Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiaries. All rights reserved.
1.7 +#
1.8 +# The author disclaims copyright to this source code. In place of
1.9 +# a legal notice, here is a blessing:
1.10 +#
1.11 +# May you do good and not evil.
1.12 +# May you find forgiveness for yourself and forgive others.
1.13 +# May you share freely, never taking more than you give.
1.14 +#
1.15 +#***********************************************************************
1.16 +# This file implements regression tests for SQLite library. The
1.17 +# focus of this script is page cache subsystem.
1.18 +#
1.19 +# $Id: pager.test,v 1.31 2008/08/20 14:49:25 danielk1977 Exp $
1.20 +
1.21 +
1.22 +set testdir [file dirname $argv0]
1.23 +source $testdir/tester.tcl
1.24 +
1.25 +if {[info commands pager_open]!=""} {
1.26 +db close
1.27 +
1.28 +# Basic sanity check. Open and close a pager.
1.29 +#
1.30 +do_test pager-1.0 {
1.31 + catch {file delete -force ptf1.db}
1.32 + catch {file delete -force ptf1.db-journal}
1.33 + set v [catch {
1.34 + set ::p1 [pager_open ptf1.db 10]
1.35 + } msg]
1.36 +} {0}
1.37 +do_test pager-1.1 {
1.38 + pager_stats $::p1
1.39 +} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
1.40 +do_test pager-1.2 {
1.41 + pager_pagecount $::p1
1.42 +} {0}
1.43 +do_test pager-1.3 {
1.44 + pager_stats $::p1
1.45 +} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
1.46 +do_test pager-1.4 {
1.47 + pager_close $::p1
1.48 +} {}
1.49 +
1.50 +# Try to write a few pages.
1.51 +#
1.52 +do_test pager-2.1 {
1.53 + set v [catch {
1.54 + set ::p1 [pager_open ptf1.db 10]
1.55 + } msg]
1.56 +} {0}
1.57 +#do_test pager-2.2 {
1.58 +# set v [catch {
1.59 +# set ::g1 [page_get $::p1 0]
1.60 +# } msg]
1.61 +# lappend v $msg
1.62 +#} {1 SQLITE_ERROR}
1.63 +do_test pager-2.3.1 {
1.64 + set ::gx [page_lookup $::p1 1]
1.65 +} {}
1.66 +do_test pager-2.3.2 {
1.67 + pager_stats $::p1
1.68 +} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
1.69 +do_test pager-2.3.3 {
1.70 + set v [catch {
1.71 + set ::g1 [page_get $::p1 1]
1.72 + } msg]
1.73 + if {$v} {lappend v $msg}
1.74 + set v
1.75 +} {0}
1.76 +do_test pager-2.3.3 {
1.77 + pager_stats $::p1
1.78 +} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
1.79 +do_test pager-2.3.4 {
1.80 + set ::gx [page_lookup $::p1 1]
1.81 + expr {$::gx!=""}
1.82 +} {1}
1.83 +do_test pager-2.3.5 {
1.84 + page_unref $::gx
1.85 + pager_stats $::p1
1.86 +} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
1.87 +do_test pager-2.3.6 {
1.88 + expr {$::g1==$::gx}
1.89 +} {1}
1.90 +do_test pager-2.3.7 {
1.91 + pager_stats $::p1
1.92 +} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
1.93 +do_test pager-2.4 {
1.94 + pager_stats $::p1
1.95 +} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
1.96 +do_test pager-2.5 {
1.97 + pager_pagecount $::p1
1.98 +} {0}
1.99 +do_test pager-2.6 {
1.100 + pager_stats $::p1
1.101 +} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
1.102 +do_test pager-2.7 {
1.103 + page_number $::g1
1.104 +} {1}
1.105 +do_test pager-2.8 {
1.106 + page_read $::g1
1.107 +} {}
1.108 +do_test pager-2.9 {
1.109 + page_unref $::g1
1.110 +} {}
1.111 +
1.112 +# Update 24/03/2007: Even though the ref-count has dropped to zero, the
1.113 +# pager-cache still contains some pages. Previously, it was always true
1.114 +# that if there were no references to a pager it was empty.
1.115 +do_test pager-2.10 {
1.116 + pager_stats $::p1
1.117 +} {ref 0 page 1 max 10 size -1 state 0 err 0 hit 0 miss 1 ovfl 0}
1.118 +do_test pager-2.11 {
1.119 + set ::g1 [page_get $::p1 1]
1.120 + expr {$::g1!=0}
1.121 +} {1}
1.122 +do_test pager-2.12 {
1.123 + page_number $::g1
1.124 +} {1}
1.125 +do_test pager-2.13 {
1.126 + pager_stats $::p1
1.127 +} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 1 miss 1 ovfl 0}
1.128 +do_test pager-2.14 {
1.129 + set v [catch {
1.130 + page_write $::g1 "Page-One"
1.131 + } msg]
1.132 + lappend v $msg
1.133 +} {0 {}}
1.134 +do_test pager-2.15 {
1.135 + pager_stats $::p1
1.136 +} {ref 1 page 1 max 10 size 1 state 2 err 0 hit 1 miss 1 ovfl 0}
1.137 +do_test pager-2.16 {
1.138 + page_read $::g1
1.139 +} {Page-One}
1.140 +do_test pager-2.17 {
1.141 + set v [catch {
1.142 + pager_commit $::p1
1.143 + } msg]
1.144 + lappend v $msg
1.145 +} {0 {}}
1.146 +do_test pager-2.20 {
1.147 + pager_stats $::p1
1.148 +} {ref 1 page 1 max 10 size -1 state 1 err 0 hit 2 miss 1 ovfl 0}
1.149 +do_test pager-2.19 {
1.150 + pager_pagecount $::p1
1.151 +} {1}
1.152 +do_test pager-2.21 {
1.153 + pager_stats $::p1
1.154 +} {ref 1 page 1 max 10 size 1 state 1 err 0 hit 2 miss 1 ovfl 0}
1.155 +do_test pager-2.22 {
1.156 + page_unref $::g1
1.157 +} {}
1.158 +do_test pager-2.23 {
1.159 + pager_stats $::p1
1.160 +} {ref 0 page 1 max 10 size -1 state 0 err 0 hit 2 miss 1 ovfl 0}
1.161 +do_test pager-2.24 {
1.162 + set v [catch {
1.163 + page_get $::p1 1
1.164 + } ::g1]
1.165 + if {$v} {lappend v $::g1}
1.166 + set v
1.167 +} {0}
1.168 +do_test pager-2.25 {
1.169 + page_read $::g1
1.170 +} {Page-One}
1.171 +do_test pager-2.26 {
1.172 + set v [catch {
1.173 + page_write $::g1 {page-one}
1.174 + } msg]
1.175 + lappend v $msg
1.176 +} {0 {}}
1.177 +do_test pager-2.27 {
1.178 + page_read $::g1
1.179 +} {page-one}
1.180 +do_test pager-2.28 {
1.181 + set v [catch {
1.182 + pager_rollback $::p1
1.183 + } msg]
1.184 + lappend v $msg
1.185 +} {0 {}}
1.186 +do_test pager-2.29 {
1.187 + page_unref $::g1
1.188 + set ::g1 [page_get $::p1 1]
1.189 + page_read $::g1
1.190 +} {Page-One}
1.191 +do_test pager-2.99 {
1.192 + page_unref $::g1
1.193 + pager_close $::p1
1.194 +} {}
1.195 +
1.196 +do_test pager-3.1 {
1.197 + set v [catch {
1.198 + set ::p1 [pager_open ptf1.db 15]
1.199 + } msg]
1.200 + if {$v} {lappend v $msg}
1.201 + set v
1.202 +} {0}
1.203 +do_test pager-3.2 {
1.204 + pager_pagecount $::p1
1.205 +} {1}
1.206 +do_test pager-3.3 {
1.207 + set v [catch {
1.208 + set ::g(1) [page_get $::p1 1]
1.209 + } msg]
1.210 + if {$v} {lappend v $msg}
1.211 + set v
1.212 +} {0}
1.213 +do_test pager-3.4 {
1.214 + page_read $::g(1)
1.215 +} {Page-One}
1.216 +do_test pager-3.5 {
1.217 + for {set i 2} {$i<=20} {incr i} {
1.218 + set gx [page_get $::p1 $i]
1.219 + page_write $gx "Page-$i"
1.220 + page_unref $gx
1.221 + }
1.222 + pager_commit $::p1
1.223 + page_unref $::g(1)
1.224 +} {}
1.225 +for {set i 2} {$i<=20} {incr i} {
1.226 + do_test pager-3.6.[expr {$i-1}] [subst {
1.227 + set gx \[page_get $::p1 $i\]
1.228 + set v \[page_read \$gx\]
1.229 + page_unref \$gx
1.230 + set v
1.231 + }] "Page-$i"
1.232 +}
1.233 +for {set i 1} {$i<=20} {incr i} {
1.234 + regsub -all CNT {
1.235 + set ::g1 [page_get $::p1 CNT]
1.236 + set ::g2 [page_get $::p1 CNT]
1.237 + set ::vx [page_read $::g2]
1.238 + expr {$::g1==$::g2}
1.239 + } $i body;
1.240 + do_test pager-3.7.$i.1 $body {1}
1.241 + regsub -all CNT {
1.242 + page_unref $::g2
1.243 + set vy [page_read $::g1]
1.244 + expr {$vy==$::vx}
1.245 + } $i body;
1.246 + do_test pager-3.7.$i.2 $body {1}
1.247 + regsub -all CNT {
1.248 + page_unref $::g1
1.249 + set gx [page_get $::p1 CNT]
1.250 + set vy [page_read $gx]
1.251 + page_unref $gx
1.252 + expr {$vy==$::vx}
1.253 + } $i body;
1.254 + do_test pager-3.7.$i.3 $body {1}
1.255 +}
1.256 +do_test pager-3.99 {
1.257 + pager_close $::p1
1.258 +} {}
1.259 +
1.260 +# tests of the checkpoint mechanism and api
1.261 +#
1.262 +do_test pager-4.0 {
1.263 + set v [catch {
1.264 + file delete -force ptf1.db
1.265 + set ::p1 [pager_open ptf1.db 15]
1.266 + } msg]
1.267 + if {$v} {lappend v $msg}
1.268 + set v
1.269 +} {0}
1.270 +do_test pager-4.1 {
1.271 + set g1 [page_get $::p1 1]
1.272 + page_write $g1 "Page-1 v0"
1.273 + for {set i 2} {$i<=20} {incr i} {
1.274 + set gx [page_get $::p1 $i]
1.275 + page_write $gx "Page-$i v0"
1.276 + page_unref $gx
1.277 + }
1.278 + pager_commit $::p1
1.279 +} {}
1.280 +for {set i 1} {$i<=20} {incr i} {
1.281 + do_test pager-4.2.$i {
1.282 + set gx [page_get $p1 $i]
1.283 + set v [page_read $gx]
1.284 + page_unref $gx
1.285 + set v
1.286 + } "Page-$i v0"
1.287 +}
1.288 +do_test pager-4.3 {
1.289 + lrange [pager_stats $::p1] 0 1
1.290 +} {ref 1}
1.291 +do_test pager-4.4 {
1.292 + lrange [pager_stats $::p1] 8 9
1.293 +} {state 1}
1.294 +
1.295 +for {set i 1} {$i<20} {incr i} {
1.296 + do_test pager-4.5.$i.0 {
1.297 + set res {}
1.298 + for {set j 2} {$j<=20} {incr j} {
1.299 + set gx [page_get $p1 $j]
1.300 + set value [page_read $gx]
1.301 + page_unref $gx
1.302 + set shouldbe "Page-$j v[expr {$i-1}]"
1.303 + if {$value!=$shouldbe} {
1.304 + lappend res $value $shouldbe
1.305 + }
1.306 + }
1.307 + set res
1.308 + } {}
1.309 + do_test pager-4.5.$i.1 {
1.310 + page_write $g1 "Page-1 v$i"
1.311 + lrange [pager_stats $p1] 8 9
1.312 + } {state 2}
1.313 + do_test pager-4.5.$i.2 {
1.314 + for {set j 2} {$j<=20} {incr j} {
1.315 + set gx [page_get $p1 $j]
1.316 + page_write $gx "Page-$j v$i"
1.317 + page_unref $gx
1.318 + if {$j==$i} {
1.319 + pager_stmt_begin $p1
1.320 + }
1.321 + }
1.322 + } {}
1.323 + do_test pager-4.5.$i.3 {
1.324 + set res {}
1.325 + for {set j 2} {$j<=20} {incr j} {
1.326 + set gx [page_get $p1 $j]
1.327 + set value [page_read $gx]
1.328 + page_unref $gx
1.329 + set shouldbe "Page-$j v$i"
1.330 + if {$value!=$shouldbe} {
1.331 + lappend res $value $shouldbe
1.332 + }
1.333 + }
1.334 + set res
1.335 + } {}
1.336 + do_test pager-4.5.$i.4 {
1.337 + pager_rollback $p1
1.338 + set res {}
1.339 + for {set j 2} {$j<=20} {incr j} {
1.340 + set gx [page_get $p1 $j]
1.341 + set value [page_read $gx]
1.342 + page_unref $gx
1.343 + set shouldbe "Page-$j v[expr {$i-1}]"
1.344 + if {$value!=$shouldbe} {
1.345 + lappend res $value $shouldbe
1.346 + }
1.347 + }
1.348 + set res
1.349 + } {}
1.350 + do_test pager-4.5.$i.5 {
1.351 + page_write $g1 "Page-1 v$i"
1.352 + lrange [pager_stats $p1] 8 9
1.353 + } {state 2}
1.354 + do_test pager-4.5.$i.6 {
1.355 + for {set j 2} {$j<=20} {incr j} {
1.356 + set gx [page_get $p1 $j]
1.357 + page_write $gx "Page-$j v$i"
1.358 + page_unref $gx
1.359 + if {$j==$i} {
1.360 + pager_stmt_begin $p1
1.361 + }
1.362 + }
1.363 + } {}
1.364 + do_test pager-4.5.$i.7 {
1.365 + pager_stmt_rollback $p1
1.366 + for {set j 2} {$j<=20} {incr j} {
1.367 + set gx [page_get $p1 $j]
1.368 + set value [page_read $gx]
1.369 + page_unref $gx
1.370 + if {$j<=$i || $i==1} {
1.371 + set shouldbe "Page-$j v$i"
1.372 + } else {
1.373 + set shouldbe "Page-$j v[expr {$i-1}]"
1.374 + }
1.375 + if {$value!=$shouldbe} {
1.376 + lappend res $value $shouldbe
1.377 + }
1.378 + }
1.379 + set res
1.380 + } {}
1.381 + do_test pager-4.5.$i.8 {
1.382 + for {set j 2} {$j<=20} {incr j} {
1.383 + set gx [page_get $p1 $j]
1.384 + page_write $gx "Page-$j v$i"
1.385 + page_unref $gx
1.386 + if {$j==$i} {
1.387 + pager_stmt_begin $p1
1.388 + }
1.389 + }
1.390 + } {}
1.391 + do_test pager-4.5.$i.9 {
1.392 + pager_stmt_commit $p1
1.393 + for {set j 2} {$j<=20} {incr j} {
1.394 + set gx [page_get $p1 $j]
1.395 + set value [page_read $gx]
1.396 + page_unref $gx
1.397 + set shouldbe "Page-$j v$i"
1.398 + if {$value!=$shouldbe} {
1.399 + lappend res $value $shouldbe
1.400 + }
1.401 + }
1.402 + set res
1.403 + } {}
1.404 + do_test pager-4.5.$i.10 {
1.405 + pager_commit $p1
1.406 + lrange [pager_stats $p1] 8 9
1.407 + } {state 1}
1.408 +}
1.409 +
1.410 +# Test that nothing bad happens when sqlite3pager_set_cachesize() is
1.411 +# called with a negative argument.
1.412 +do_test pager-4.6.1 {
1.413 + pager_close [pager_open ptf2.db -15]
1.414 +} {}
1.415 +
1.416 +# Test truncate on an in-memory database is Ok.
1.417 +ifcapable memorydb {
1.418 + do_test pager-4.6.2 {
1.419 + set ::p2 [pager_open :memory: 10]
1.420 + pager_truncate $::p2 5
1.421 + } {}
1.422 + do_test pager-4.6.3 {
1.423 + for {set i 1} {$i<5} {incr i} {
1.424 + set p [page_get $::p2 $i]
1.425 + page_write $p "Page $i"
1.426 + pager_commit $::p2
1.427 + page_unref $p
1.428 + }
1.429 + # pager_truncate $::p2 3
1.430 + } {}
1.431 + do_test pager-4.6.4 {
1.432 + pager_close $::p2
1.433 + } {}
1.434 +}
1.435 +
1.436 +do_test pager-4.99 {
1.437 + page_unref $::g1
1.438 + pager_close $::p1
1.439 +} {}
1.440 +
1.441 +
1.442 +
1.443 + file delete -force ptf1.db
1.444 +
1.445 +} ;# end if( not mem: and has pager_open command );
1.446 +
1.447 +if 0 {
1.448 +# Ticket #615: an assertion fault inside the pager. It is a benign
1.449 +# fault, but we might as well test for it.
1.450 +#
1.451 +do_test pager-5.1 {
1.452 + sqlite3 db test.db
1.453 + execsql {
1.454 + BEGIN;
1.455 + CREATE TABLE t1(x);
1.456 + PRAGMA synchronous=off;
1.457 + COMMIT;
1.458 + }
1.459 +} {}
1.460 +}
1.461 +
1.462 +# The following tests cover rolling back hot journal files.
1.463 +# They can't be run on windows because the windows version of
1.464 +# SQLite holds a mandatory exclusive lock on journal files it has open.
1.465 +#
1.466 +if {$tcl_platform(platform)!="windows" && $tcl_platform(platform)!="symbian"} {
1.467 +do_test pager-6.1 {
1.468 + file delete -force test2.db
1.469 + file delete -force test2.db-journal
1.470 + sqlite3 db2 test2.db
1.471 + execsql {
1.472 + PRAGMA synchronous = 0;
1.473 + CREATE TABLE abc(a, b, c);
1.474 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.475 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.476 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.477 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.478 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.479 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.480 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.481 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.482 + INSERT INTO abc VALUES(1, 2, randstr(200,200));
1.483 + BEGIN;
1.484 + UPDATE abc SET c = randstr(200,200);
1.485 + } db2
1.486 + copy_file test2.db test.db
1.487 + copy_file test2.db-journal test.db-journal
1.488 +
1.489 + set f [open test.db-journal a]
1.490 + fconfigure $f -encoding binary
1.491 + seek $f [expr [file size test.db-journal] - 1032] start
1.492 + puts -nonewline $f "\00\00\00\00"
1.493 + close $f
1.494 +
1.495 + sqlite3 db test.db
1.496 + execsql {
1.497 + SELECT sql FROM sqlite_master
1.498 + }
1.499 +} {{CREATE TABLE abc(a, b, c)}}
1.500 +
1.501 +do_test pager-6.2 {
1.502 + copy_file test2.db test.db
1.503 + copy_file test2.db-journal test.db-journal
1.504 +
1.505 + set f [open test.db-journal a]
1.506 + fconfigure $f -encoding binary
1.507 + seek $f [expr [file size test.db-journal] - 1032] start
1.508 + puts -nonewline $f "\00\00\00\FF"
1.509 + close $f
1.510 +
1.511 + sqlite3 db test.db
1.512 + execsql {
1.513 + SELECT sql FROM sqlite_master
1.514 + }
1.515 +} {{CREATE TABLE abc(a, b, c)}}
1.516 +
1.517 +do_test pager-6.3 {
1.518 + copy_file test2.db test.db
1.519 + copy_file test2.db-journal test.db-journal
1.520 +
1.521 + set f [open test.db-journal a]
1.522 + fconfigure $f -encoding binary
1.523 + seek $f [expr [file size test.db-journal] - 4] start
1.524 + puts -nonewline $f "\00\00\00\00"
1.525 + close $f
1.526 +
1.527 + sqlite3 db test.db
1.528 + execsql {
1.529 + SELECT sql FROM sqlite_master
1.530 + }
1.531 +} {{CREATE TABLE abc(a, b, c)}}
1.532 +
1.533 +do_test pager-6.4.1 {
1.534 + execsql {
1.535 + BEGIN;
1.536 + SELECT sql FROM sqlite_master;
1.537 + }
1.538 + copy_file test2.db-journal test.db-journal;
1.539 + sqlite3 db3 test.db
1.540 + catchsql {
1.541 + BEGIN;
1.542 + SELECT sql FROM sqlite_master;
1.543 + } db3;
1.544 +} {1 {database is locked}}
1.545 +do_test pager-6.4.2 {
1.546 + file delete -force test.db-journal
1.547 + catchsql {
1.548 + SELECT sql FROM sqlite_master;
1.549 + } db3;
1.550 +} {0 {{CREATE TABLE abc(a, b, c)}}}
1.551 +do_test pager-6.4.3 {
1.552 + db3 close
1.553 + execsql {
1.554 + COMMIT;
1.555 + }
1.556 +} {}
1.557 +
1.558 +do_test pager-6.5 {
1.559 + copy_file test2.db test.db
1.560 + copy_file test2.db-journal test.db-journal
1.561 +
1.562 + set f [open test.db-journal a]
1.563 + fconfigure $f -encoding binary
1.564 + puts -nonewline $f "hello"
1.565 + puts -nonewline $f "\x00\x00\x00\x05\x01\x02\x03\x04"
1.566 + puts -nonewline $f "\xd9\xd5\x05\xf9\x20\xa1\x63\xd7"
1.567 + close $f
1.568 +
1.569 + sqlite3 db test.db
1.570 + execsql {
1.571 + SELECT sql FROM sqlite_master
1.572 + }
1.573 +} {{CREATE TABLE abc(a, b, c)}}
1.574 +
1.575 +do_test pager-6.5 {
1.576 + db2 close
1.577 +} {}
1.578 +}
1.579 +finish_test