os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/pager.test
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200 (2012-06-15)
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
 # 2001 September 15
sl@0
     2
#
sl@0
     3
# Portions Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiaries. All rights reserved.
sl@0
     4
#
sl@0
     5
# The author disclaims copyright to this source code.  In place of
sl@0
     6
# a legal notice, here is a blessing:
sl@0
     7
#
sl@0
     8
#    May you do good and not evil.
sl@0
     9
#    May you find forgiveness for yourself and forgive others.
sl@0
    10
#    May you share freely, never taking more than you give.
sl@0
    11
#
sl@0
    12
#***********************************************************************
sl@0
    13
# This file implements regression tests for SQLite library.  The
sl@0
    14
# focus of this script is page cache subsystem.
sl@0
    15
#
sl@0
    16
# $Id: pager.test,v 1.31 2008/08/20 14:49:25 danielk1977 Exp $
sl@0
    17
sl@0
    18
sl@0
    19
set testdir [file dirname $argv0]
sl@0
    20
source $testdir/tester.tcl
sl@0
    21
sl@0
    22
if {[info commands pager_open]!=""} {
sl@0
    23
db close
sl@0
    24
sl@0
    25
# Basic sanity check.  Open and close a pager.
sl@0
    26
#
sl@0
    27
do_test pager-1.0 {
sl@0
    28
  catch {file delete -force ptf1.db}
sl@0
    29
  catch {file delete -force ptf1.db-journal}
sl@0
    30
  set v [catch {
sl@0
    31
    set ::p1 [pager_open ptf1.db 10]
sl@0
    32
  } msg]
sl@0
    33
} {0}
sl@0
    34
do_test pager-1.1 {
sl@0
    35
  pager_stats $::p1
sl@0
    36
} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
sl@0
    37
do_test pager-1.2 {
sl@0
    38
  pager_pagecount $::p1
sl@0
    39
} {0}
sl@0
    40
do_test pager-1.3 {
sl@0
    41
  pager_stats $::p1
sl@0
    42
} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
sl@0
    43
do_test pager-1.4 {
sl@0
    44
  pager_close $::p1
sl@0
    45
} {}
sl@0
    46
sl@0
    47
# Try to write a few pages.
sl@0
    48
#
sl@0
    49
do_test pager-2.1 {
sl@0
    50
  set v [catch {
sl@0
    51
    set ::p1 [pager_open ptf1.db 10]
sl@0
    52
  } msg]
sl@0
    53
} {0}
sl@0
    54
#do_test pager-2.2 {
sl@0
    55
#  set v [catch {
sl@0
    56
#    set ::g1 [page_get $::p1 0]
sl@0
    57
#  } msg]
sl@0
    58
#  lappend v $msg
sl@0
    59
#} {1 SQLITE_ERROR}
sl@0
    60
do_test pager-2.3.1 {
sl@0
    61
  set ::gx [page_lookup $::p1 1]
sl@0
    62
} {}
sl@0
    63
do_test pager-2.3.2 {
sl@0
    64
  pager_stats $::p1
sl@0
    65
} {ref 0 page 0 max 10 size -1 state 0 err 0 hit 0 miss 0 ovfl 0}
sl@0
    66
do_test pager-2.3.3 {
sl@0
    67
  set v [catch {
sl@0
    68
    set ::g1 [page_get $::p1 1]
sl@0
    69
  } msg]
sl@0
    70
  if {$v} {lappend v $msg}
sl@0
    71
  set v
sl@0
    72
} {0}
sl@0
    73
do_test pager-2.3.3 {
sl@0
    74
  pager_stats $::p1
sl@0
    75
} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
sl@0
    76
do_test pager-2.3.4 {
sl@0
    77
  set ::gx [page_lookup $::p1 1]
sl@0
    78
  expr {$::gx!=""}
sl@0
    79
} {1}
sl@0
    80
do_test pager-2.3.5 {
sl@0
    81
  page_unref $::gx
sl@0
    82
  pager_stats $::p1
sl@0
    83
} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
sl@0
    84
do_test pager-2.3.6 {
sl@0
    85
  expr {$::g1==$::gx}
sl@0
    86
} {1}
sl@0
    87
do_test pager-2.3.7 {
sl@0
    88
  pager_stats $::p1
sl@0
    89
} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
sl@0
    90
do_test pager-2.4 {
sl@0
    91
  pager_stats $::p1
sl@0
    92
} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
sl@0
    93
do_test pager-2.5 {
sl@0
    94
  pager_pagecount $::p1
sl@0
    95
} {0}
sl@0
    96
do_test pager-2.6 {
sl@0
    97
  pager_stats $::p1
sl@0
    98
} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 0 miss 1 ovfl 0}
sl@0
    99
do_test pager-2.7 {
sl@0
   100
  page_number $::g1
sl@0
   101
} {1}
sl@0
   102
do_test pager-2.8 {
sl@0
   103
  page_read $::g1
sl@0
   104
} {}
sl@0
   105
do_test pager-2.9 {
sl@0
   106
  page_unref $::g1
sl@0
   107
} {}
sl@0
   108
sl@0
   109
# Update 24/03/2007: Even though the ref-count has dropped to zero, the
sl@0
   110
# pager-cache still contains some pages. Previously, it was always true
sl@0
   111
# that if there were no references to a pager it was empty.
sl@0
   112
do_test pager-2.10 {
sl@0
   113
  pager_stats $::p1
sl@0
   114
} {ref 0 page 1 max 10 size -1 state 0 err 0 hit 0 miss 1 ovfl 0}
sl@0
   115
do_test pager-2.11 {
sl@0
   116
  set ::g1 [page_get $::p1 1]
sl@0
   117
  expr {$::g1!=0}
sl@0
   118
} {1}
sl@0
   119
do_test pager-2.12 {
sl@0
   120
  page_number $::g1
sl@0
   121
} {1}
sl@0
   122
do_test pager-2.13 {
sl@0
   123
  pager_stats $::p1
sl@0
   124
} {ref 1 page 1 max 10 size 0 state 1 err 0 hit 1 miss 1 ovfl 0}
sl@0
   125
do_test pager-2.14 {
sl@0
   126
  set v [catch {
sl@0
   127
    page_write $::g1 "Page-One"
sl@0
   128
  } msg]
sl@0
   129
  lappend v $msg
sl@0
   130
} {0 {}}
sl@0
   131
do_test pager-2.15 {
sl@0
   132
  pager_stats $::p1
sl@0
   133
} {ref 1 page 1 max 10 size 1 state 2 err 0 hit 1 miss 1 ovfl 0}
sl@0
   134
do_test pager-2.16 {
sl@0
   135
  page_read $::g1
sl@0
   136
} {Page-One}
sl@0
   137
do_test pager-2.17 {
sl@0
   138
  set v [catch {
sl@0
   139
    pager_commit $::p1
sl@0
   140
  } msg]
sl@0
   141
  lappend v $msg
sl@0
   142
} {0 {}}
sl@0
   143
do_test pager-2.20 {
sl@0
   144
  pager_stats $::p1
sl@0
   145
} {ref 1 page 1 max 10 size -1 state 1 err 0 hit 2 miss 1 ovfl 0}
sl@0
   146
do_test pager-2.19 {
sl@0
   147
  pager_pagecount $::p1
sl@0
   148
} {1}
sl@0
   149
do_test pager-2.21 {
sl@0
   150
  pager_stats $::p1
sl@0
   151
} {ref 1 page 1 max 10 size 1 state 1 err 0 hit 2 miss 1 ovfl 0}
sl@0
   152
do_test pager-2.22 {
sl@0
   153
  page_unref $::g1
sl@0
   154
} {}
sl@0
   155
do_test pager-2.23 {
sl@0
   156
  pager_stats $::p1
sl@0
   157
} {ref 0 page 1 max 10 size -1 state 0 err 0 hit 2 miss 1 ovfl 0}
sl@0
   158
do_test pager-2.24 {
sl@0
   159
  set v [catch {
sl@0
   160
    page_get $::p1 1
sl@0
   161
  } ::g1]
sl@0
   162
  if {$v} {lappend v $::g1}
sl@0
   163
  set v
sl@0
   164
} {0}
sl@0
   165
do_test pager-2.25 {
sl@0
   166
  page_read $::g1
sl@0
   167
} {Page-One}
sl@0
   168
do_test pager-2.26 {
sl@0
   169
  set v [catch {
sl@0
   170
    page_write $::g1 {page-one}
sl@0
   171
  } msg]
sl@0
   172
  lappend v $msg
sl@0
   173
} {0 {}}
sl@0
   174
do_test pager-2.27 {
sl@0
   175
  page_read $::g1
sl@0
   176
} {page-one}
sl@0
   177
do_test pager-2.28 {
sl@0
   178
  set v [catch {
sl@0
   179
    pager_rollback $::p1
sl@0
   180
  } msg]
sl@0
   181
  lappend v $msg
sl@0
   182
} {0 {}}
sl@0
   183
do_test pager-2.29 {
sl@0
   184
  page_unref $::g1
sl@0
   185
  set ::g1 [page_get $::p1 1]
sl@0
   186
  page_read $::g1
sl@0
   187
} {Page-One}
sl@0
   188
do_test pager-2.99 {
sl@0
   189
  page_unref $::g1
sl@0
   190
  pager_close $::p1
sl@0
   191
} {}
sl@0
   192
sl@0
   193
do_test pager-3.1 {
sl@0
   194
  set v [catch {
sl@0
   195
    set ::p1 [pager_open ptf1.db 15]
sl@0
   196
  } msg]
sl@0
   197
  if {$v} {lappend v $msg}
sl@0
   198
  set v
sl@0
   199
} {0}
sl@0
   200
do_test pager-3.2 {
sl@0
   201
  pager_pagecount $::p1
sl@0
   202
} {1}
sl@0
   203
do_test pager-3.3 {
sl@0
   204
  set v [catch {
sl@0
   205
    set ::g(1) [page_get $::p1 1]
sl@0
   206
  } msg]
sl@0
   207
  if {$v} {lappend v $msg}
sl@0
   208
  set v
sl@0
   209
} {0}
sl@0
   210
do_test pager-3.4 {
sl@0
   211
  page_read $::g(1)
sl@0
   212
} {Page-One}
sl@0
   213
do_test pager-3.5 {
sl@0
   214
  for {set i 2} {$i<=20} {incr i} {
sl@0
   215
    set gx [page_get $::p1 $i]
sl@0
   216
    page_write $gx "Page-$i"
sl@0
   217
    page_unref $gx
sl@0
   218
  }
sl@0
   219
  pager_commit $::p1
sl@0
   220
  page_unref $::g(1)
sl@0
   221
} {}
sl@0
   222
for {set i 2} {$i<=20} {incr i} {
sl@0
   223
  do_test pager-3.6.[expr {$i-1}] [subst {
sl@0
   224
    set gx \[page_get $::p1 $i\]
sl@0
   225
    set v \[page_read \$gx\]
sl@0
   226
    page_unref \$gx
sl@0
   227
    set v
sl@0
   228
  }] "Page-$i"
sl@0
   229
}
sl@0
   230
for {set i 1} {$i<=20} {incr i} {
sl@0
   231
  regsub -all CNT {
sl@0
   232
    set ::g1 [page_get $::p1 CNT]
sl@0
   233
    set ::g2 [page_get $::p1 CNT]
sl@0
   234
    set ::vx [page_read $::g2]
sl@0
   235
    expr {$::g1==$::g2}
sl@0
   236
  } $i body;
sl@0
   237
  do_test pager-3.7.$i.1 $body {1}
sl@0
   238
  regsub -all CNT {
sl@0
   239
    page_unref $::g2
sl@0
   240
    set vy [page_read $::g1]
sl@0
   241
    expr {$vy==$::vx}
sl@0
   242
  } $i body;
sl@0
   243
  do_test pager-3.7.$i.2 $body {1}
sl@0
   244
  regsub -all CNT {
sl@0
   245
    page_unref $::g1
sl@0
   246
    set gx [page_get $::p1 CNT]
sl@0
   247
    set vy [page_read $gx]
sl@0
   248
    page_unref $gx
sl@0
   249
    expr {$vy==$::vx}
sl@0
   250
  } $i body;
sl@0
   251
  do_test pager-3.7.$i.3 $body {1}
sl@0
   252
}
sl@0
   253
do_test pager-3.99 {
sl@0
   254
  pager_close $::p1
sl@0
   255
} {}
sl@0
   256
sl@0
   257
# tests of the checkpoint mechanism and api
sl@0
   258
#
sl@0
   259
do_test pager-4.0 {
sl@0
   260
  set v [catch {
sl@0
   261
    file delete -force ptf1.db
sl@0
   262
    set ::p1 [pager_open ptf1.db 15]
sl@0
   263
  } msg]
sl@0
   264
  if {$v} {lappend v $msg}
sl@0
   265
  set v
sl@0
   266
} {0}
sl@0
   267
do_test pager-4.1 {
sl@0
   268
  set g1 [page_get $::p1 1]
sl@0
   269
  page_write $g1 "Page-1 v0"
sl@0
   270
  for {set i 2} {$i<=20} {incr i} {
sl@0
   271
    set gx [page_get $::p1 $i]
sl@0
   272
    page_write $gx "Page-$i v0"
sl@0
   273
    page_unref $gx
sl@0
   274
  }
sl@0
   275
  pager_commit $::p1
sl@0
   276
} {}
sl@0
   277
for {set i 1} {$i<=20} {incr i} {
sl@0
   278
  do_test pager-4.2.$i {
sl@0
   279
    set gx [page_get $p1 $i]
sl@0
   280
    set v [page_read $gx]
sl@0
   281
    page_unref $gx
sl@0
   282
    set v
sl@0
   283
  } "Page-$i v0"
sl@0
   284
}
sl@0
   285
do_test pager-4.3 {
sl@0
   286
  lrange [pager_stats $::p1] 0 1
sl@0
   287
} {ref 1}
sl@0
   288
do_test pager-4.4 {
sl@0
   289
  lrange [pager_stats $::p1] 8 9
sl@0
   290
} {state 1}
sl@0
   291
sl@0
   292
for {set i 1} {$i<20} {incr i} {
sl@0
   293
  do_test pager-4.5.$i.0 {
sl@0
   294
    set res {}
sl@0
   295
    for {set j 2} {$j<=20} {incr j} {
sl@0
   296
      set gx [page_get $p1 $j]
sl@0
   297
      set value [page_read $gx]
sl@0
   298
      page_unref $gx
sl@0
   299
      set shouldbe "Page-$j v[expr {$i-1}]"
sl@0
   300
      if {$value!=$shouldbe} {
sl@0
   301
        lappend res $value $shouldbe
sl@0
   302
      }
sl@0
   303
    }
sl@0
   304
    set res
sl@0
   305
  } {}
sl@0
   306
  do_test pager-4.5.$i.1 {
sl@0
   307
    page_write $g1 "Page-1 v$i"
sl@0
   308
    lrange [pager_stats $p1] 8 9
sl@0
   309
  } {state 2}
sl@0
   310
  do_test pager-4.5.$i.2 {
sl@0
   311
    for {set j 2} {$j<=20} {incr j} {
sl@0
   312
      set gx [page_get $p1 $j]
sl@0
   313
      page_write $gx "Page-$j v$i"
sl@0
   314
      page_unref $gx
sl@0
   315
      if {$j==$i} {
sl@0
   316
        pager_stmt_begin $p1
sl@0
   317
      }
sl@0
   318
    }
sl@0
   319
  } {}
sl@0
   320
  do_test pager-4.5.$i.3 {
sl@0
   321
    set res {}
sl@0
   322
    for {set j 2} {$j<=20} {incr j} {
sl@0
   323
      set gx [page_get $p1 $j]
sl@0
   324
      set value [page_read $gx]
sl@0
   325
      page_unref $gx
sl@0
   326
      set shouldbe "Page-$j v$i"
sl@0
   327
      if {$value!=$shouldbe} {
sl@0
   328
        lappend res $value $shouldbe
sl@0
   329
      }
sl@0
   330
    }
sl@0
   331
    set res
sl@0
   332
  } {}
sl@0
   333
  do_test pager-4.5.$i.4 {
sl@0
   334
    pager_rollback $p1
sl@0
   335
    set res {}
sl@0
   336
    for {set j 2} {$j<=20} {incr j} {
sl@0
   337
      set gx [page_get $p1 $j]
sl@0
   338
      set value [page_read $gx]
sl@0
   339
      page_unref $gx
sl@0
   340
      set shouldbe "Page-$j v[expr {$i-1}]"
sl@0
   341
      if {$value!=$shouldbe} {
sl@0
   342
        lappend res $value $shouldbe
sl@0
   343
      }
sl@0
   344
    }
sl@0
   345
    set res
sl@0
   346
  } {}
sl@0
   347
  do_test pager-4.5.$i.5 {
sl@0
   348
    page_write $g1 "Page-1 v$i"
sl@0
   349
    lrange [pager_stats $p1] 8 9
sl@0
   350
  } {state 2}
sl@0
   351
  do_test pager-4.5.$i.6 {
sl@0
   352
    for {set j 2} {$j<=20} {incr j} {
sl@0
   353
      set gx [page_get $p1 $j]
sl@0
   354
      page_write $gx "Page-$j v$i"
sl@0
   355
      page_unref $gx
sl@0
   356
      if {$j==$i} {
sl@0
   357
        pager_stmt_begin $p1
sl@0
   358
      }
sl@0
   359
    }
sl@0
   360
  } {}
sl@0
   361
  do_test pager-4.5.$i.7 {
sl@0
   362
    pager_stmt_rollback $p1
sl@0
   363
    for {set j 2} {$j<=20} {incr j} {
sl@0
   364
      set gx [page_get $p1 $j]
sl@0
   365
      set value [page_read $gx]
sl@0
   366
      page_unref $gx
sl@0
   367
      if {$j<=$i || $i==1} {
sl@0
   368
        set shouldbe "Page-$j v$i"
sl@0
   369
      } else {
sl@0
   370
        set shouldbe "Page-$j v[expr {$i-1}]"
sl@0
   371
      }
sl@0
   372
      if {$value!=$shouldbe} {
sl@0
   373
        lappend res $value $shouldbe
sl@0
   374
      }
sl@0
   375
    }
sl@0
   376
    set res
sl@0
   377
  } {}
sl@0
   378
  do_test pager-4.5.$i.8 {
sl@0
   379
    for {set j 2} {$j<=20} {incr j} {
sl@0
   380
      set gx [page_get $p1 $j]
sl@0
   381
      page_write $gx "Page-$j v$i"
sl@0
   382
      page_unref $gx
sl@0
   383
      if {$j==$i} {
sl@0
   384
        pager_stmt_begin $p1
sl@0
   385
      }
sl@0
   386
    }
sl@0
   387
  } {}
sl@0
   388
  do_test pager-4.5.$i.9 {
sl@0
   389
    pager_stmt_commit $p1
sl@0
   390
    for {set j 2} {$j<=20} {incr j} {
sl@0
   391
      set gx [page_get $p1 $j]
sl@0
   392
      set value [page_read $gx]
sl@0
   393
      page_unref $gx
sl@0
   394
      set shouldbe "Page-$j v$i"
sl@0
   395
      if {$value!=$shouldbe} {
sl@0
   396
        lappend res $value $shouldbe
sl@0
   397
      }
sl@0
   398
    }
sl@0
   399
    set res
sl@0
   400
  } {}
sl@0
   401
  do_test pager-4.5.$i.10 {
sl@0
   402
    pager_commit $p1
sl@0
   403
    lrange [pager_stats $p1] 8 9
sl@0
   404
  } {state 1}
sl@0
   405
}
sl@0
   406
sl@0
   407
# Test that nothing bad happens when sqlite3pager_set_cachesize() is
sl@0
   408
# called with a negative argument.
sl@0
   409
do_test pager-4.6.1 {
sl@0
   410
  pager_close [pager_open ptf2.db -15]
sl@0
   411
} {}
sl@0
   412
sl@0
   413
# Test truncate on an in-memory database is Ok.
sl@0
   414
ifcapable memorydb {
sl@0
   415
  do_test pager-4.6.2 {
sl@0
   416
    set ::p2 [pager_open :memory: 10]
sl@0
   417
    pager_truncate $::p2 5
sl@0
   418
  } {}
sl@0
   419
  do_test pager-4.6.3 {
sl@0
   420
    for {set i 1} {$i<5} {incr i} {
sl@0
   421
      set p [page_get $::p2 $i]
sl@0
   422
      page_write $p "Page $i"
sl@0
   423
      pager_commit $::p2
sl@0
   424
      page_unref $p
sl@0
   425
    }
sl@0
   426
    # pager_truncate $::p2 3
sl@0
   427
  } {}
sl@0
   428
  do_test pager-4.6.4 {
sl@0
   429
    pager_close $::p2
sl@0
   430
  } {}
sl@0
   431
}
sl@0
   432
sl@0
   433
do_test pager-4.99 {
sl@0
   434
  page_unref $::g1
sl@0
   435
  pager_close $::p1
sl@0
   436
} {}
sl@0
   437
sl@0
   438
sl@0
   439
sl@0
   440
  file delete -force ptf1.db
sl@0
   441
sl@0
   442
} ;# end if( not mem: and has pager_open command );
sl@0
   443
sl@0
   444
if 0 {
sl@0
   445
# Ticket #615: an assertion fault inside the pager.  It is a benign
sl@0
   446
# fault, but we might as well test for it.
sl@0
   447
#
sl@0
   448
do_test pager-5.1 {
sl@0
   449
  sqlite3 db test.db
sl@0
   450
  execsql {
sl@0
   451
    BEGIN;
sl@0
   452
    CREATE TABLE t1(x);
sl@0
   453
    PRAGMA synchronous=off;
sl@0
   454
    COMMIT;
sl@0
   455
  }
sl@0
   456
} {}
sl@0
   457
}
sl@0
   458
sl@0
   459
# The following tests cover rolling back hot journal files. 
sl@0
   460
# They can't be run on windows because the windows version of 
sl@0
   461
# SQLite holds a mandatory exclusive lock on journal files it has open.
sl@0
   462
#
sl@0
   463
if {$tcl_platform(platform)!="windows" && $tcl_platform(platform)!="symbian"} {
sl@0
   464
do_test pager-6.1 {
sl@0
   465
  file delete -force test2.db
sl@0
   466
  file delete -force test2.db-journal
sl@0
   467
  sqlite3 db2 test2.db
sl@0
   468
  execsql {
sl@0
   469
    PRAGMA synchronous = 0;
sl@0
   470
    CREATE TABLE abc(a, b, c);
sl@0
   471
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   472
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   473
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   474
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   475
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   476
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   477
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   478
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   479
    INSERT INTO abc VALUES(1, 2, randstr(200,200));
sl@0
   480
    BEGIN;
sl@0
   481
    UPDATE abc SET c = randstr(200,200);
sl@0
   482
  } db2
sl@0
   483
  copy_file test2.db test.db
sl@0
   484
  copy_file test2.db-journal test.db-journal
sl@0
   485
sl@0
   486
  set f [open test.db-journal a]
sl@0
   487
  fconfigure $f -encoding binary
sl@0
   488
  seek $f [expr [file size test.db-journal] - 1032] start
sl@0
   489
  puts -nonewline $f "\00\00\00\00"
sl@0
   490
  close $f
sl@0
   491
sl@0
   492
  sqlite3 db test.db
sl@0
   493
  execsql {
sl@0
   494
    SELECT sql FROM sqlite_master
sl@0
   495
  }
sl@0
   496
} {{CREATE TABLE abc(a, b, c)}}
sl@0
   497
sl@0
   498
do_test pager-6.2 {
sl@0
   499
  copy_file test2.db test.db
sl@0
   500
  copy_file test2.db-journal test.db-journal
sl@0
   501
sl@0
   502
  set f [open test.db-journal a]
sl@0
   503
  fconfigure $f -encoding binary
sl@0
   504
  seek $f [expr [file size test.db-journal] - 1032] start
sl@0
   505
  puts -nonewline $f "\00\00\00\FF"
sl@0
   506
  close $f
sl@0
   507
sl@0
   508
  sqlite3 db test.db
sl@0
   509
  execsql {
sl@0
   510
    SELECT sql FROM sqlite_master
sl@0
   511
  }
sl@0
   512
} {{CREATE TABLE abc(a, b, c)}}
sl@0
   513
sl@0
   514
do_test pager-6.3 {
sl@0
   515
  copy_file test2.db test.db
sl@0
   516
  copy_file test2.db-journal test.db-journal
sl@0
   517
sl@0
   518
  set f [open test.db-journal a]
sl@0
   519
  fconfigure $f -encoding binary
sl@0
   520
  seek $f [expr [file size test.db-journal] - 4] start
sl@0
   521
  puts -nonewline $f "\00\00\00\00"
sl@0
   522
  close $f
sl@0
   523
sl@0
   524
  sqlite3 db test.db
sl@0
   525
  execsql {
sl@0
   526
    SELECT sql FROM sqlite_master
sl@0
   527
  }
sl@0
   528
} {{CREATE TABLE abc(a, b, c)}}
sl@0
   529
sl@0
   530
do_test pager-6.4.1 {
sl@0
   531
  execsql {
sl@0
   532
    BEGIN;
sl@0
   533
    SELECT sql FROM sqlite_master;
sl@0
   534
  }
sl@0
   535
  copy_file test2.db-journal test.db-journal;
sl@0
   536
  sqlite3 db3 test.db
sl@0
   537
  catchsql {
sl@0
   538
    BEGIN;
sl@0
   539
    SELECT sql FROM sqlite_master;
sl@0
   540
  } db3;
sl@0
   541
} {1 {database is locked}}
sl@0
   542
do_test pager-6.4.2 {
sl@0
   543
  file delete -force test.db-journal
sl@0
   544
  catchsql {
sl@0
   545
    SELECT sql FROM sqlite_master;
sl@0
   546
  } db3;
sl@0
   547
} {0 {{CREATE TABLE abc(a, b, c)}}}
sl@0
   548
do_test pager-6.4.3 {
sl@0
   549
  db3 close
sl@0
   550
  execsql {
sl@0
   551
    COMMIT;
sl@0
   552
  }
sl@0
   553
} {}
sl@0
   554
sl@0
   555
do_test pager-6.5 {
sl@0
   556
  copy_file test2.db test.db
sl@0
   557
  copy_file test2.db-journal test.db-journal
sl@0
   558
sl@0
   559
  set f [open test.db-journal a]
sl@0
   560
  fconfigure $f -encoding binary
sl@0
   561
  puts -nonewline $f "hello"
sl@0
   562
  puts -nonewline $f "\x00\x00\x00\x05\x01\x02\x03\x04"
sl@0
   563
  puts -nonewline $f "\xd9\xd5\x05\xf9\x20\xa1\x63\xd7"
sl@0
   564
  close $f
sl@0
   565
sl@0
   566
  sqlite3 db test.db
sl@0
   567
  execsql {
sl@0
   568
    SELECT sql FROM sqlite_master
sl@0
   569
  }
sl@0
   570
} {{CREATE TABLE abc(a, b, c)}}
sl@0
   571
sl@0
   572
do_test pager-6.5 {
sl@0
   573
  db2 close
sl@0
   574
} {}
sl@0
   575
}
sl@0
   576
finish_test