/ Hex Artifact Content
Login

Artifact fbf107c91d8f5512be5a5b87c4c42ab9fdd54972:


0000: 23 20 32 30 31 31 20 4a 75 6c 79 20 31 31 0a 23  # 2011 July 11.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 73 63 72 69 70 74 20 69 73 20   this script is 
01c0: 72 65 63 6f 76 65 72 79 20 66 72 6f 6d 20 74 72  recovery from tr
01d0: 61 6e 73 69 65 6e 74 20 6d 61 6e 64 69 74 6f 72  ansient manditor
01e0: 79 20 6c 6f 63 6b 73 0a 23 20 74 68 61 74 20 73  y locks.# that s
01f0: 6f 6d 65 74 69 6d 65 73 20 61 70 70 65 61 72 20  ometimes appear 
0200: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
0210: 73 20 64 75 65 20 74 6f 20 61 6e 74 69 2d 76 69  s due to anti-vi
0220: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 0a 23 0a  rus software..#.
0230: 0a 69 66 20 7b 24 74 63 6c 5f 70 6c 61 74 66 6f  .if {$tcl_platfo
0240: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 21 3d 22 77  rm(platform)!="w
0250: 69 6e 64 6f 77 73 22 7d 20 72 65 74 75 72 6e 0a  indows"} return.
0260: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0270: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0280: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0290: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 73  ir/tester.tcl..s
02a0: 65 74 20 74 65 73 74 70 72 65 66 69 78 20 77 69  et testprefix wi
02b0: 6e 33 32 6c 6f 63 6b 0a 0a 64 62 20 63 6c 6f 73  n32lock..db clos
02c0: 65 0a 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  e.sqlite3_shutdo
02d0: 77 6e 0a 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  wn.test_sqlite3_
02e0: 6c 6f 67 20 78 4c 6f 67 0a 70 72 6f 63 20 78 4c  log xLog.proc xL
02f0: 6f 67 20 7b 65 72 72 6f 72 5f 63 6f 64 65 20 6d  og {error_code m
0300: 73 67 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20  sg} {.  lappend 
0310: 3a 3a 6c 6f 67 20 24 6d 73 67 0a 7d 0a 73 71 6c  ::log $msg.}.sql
0320: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
0330: 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20  db eval {PRAGMA 
0340: 6d 6d 61 70 5f 73 69 7a 65 3d 30 7d 0a 0a 64 6f  mmap_size=0}..do
0350: 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f 63 6b 2d  _test win32lock-
0360: 31 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  1.1 {.  db eval 
0370: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
0380: 68 65 5f 73 69 7a 65 3d 31 30 3b 0a 20 20 20 20  he_size=10;.    
0390: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03a0: 78 2c 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  x,y);.    INSERT
03b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
03c0: 31 2c 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  1,randomblob(100
03d0: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
03e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
03f0: 28 32 2c 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30  (2,randomblob(50
0400: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
0410: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0420: 28 33 2c 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 35  (3,randomblob(25
0430: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
0440: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0450: 28 34 2c 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 32  (4,randomblob(12
0460: 35 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43  500));.    SELEC
0470: 54 20 78 2c 20 6c 65 6e 67 74 68 28 79 29 20 46  T x, length(y) F
0480: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
0490: 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20  rowid;.  }.} {1 
04a0: 31 30 30 30 30 30 20 32 20 35 30 30 30 30 20 33  100000 2 50000 3
04b0: 20 32 35 30 30 30 20 34 20 31 32 35 30 30 7d 0a   25000 4 12500}.
04c0: 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61  .unset -nocompla
04d0: 69 6e 20 64 65 6c 61 79 31 20 72 63 20 6d 73 67  in delay1 rc msg
04e0: 0a 73 65 74 20 6f 6c 64 5f 70 65 6e 64 69 6e 67  .set old_pending
04f0: 5f 62 79 74 65 20 5b 73 71 6c 69 74 65 33 5f 74  _byte [sqlite3_t
0500: 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64  est_control_pend
0510: 69 6e 67 5f 62 79 74 65 20 30 78 34 30 30 30 30  ing_byte 0x40000
0520: 30 30 30 5d 0a 0a 73 65 74 20 77 69 6e 33 32 5f  000]..set win32_
0530: 6c 6f 63 6b 5f 6f 6b 20 5b 6c 69 73 74 5d 0a 73  lock_ok [list].s
0540: 65 74 20 77 69 6e 33 32 5f 6c 6f 63 6b 5f 65 72  et win32_lock_er
0550: 72 6f 72 20 5b 6c 69 73 74 5d 0a 73 65 74 20 64  ror [list].set d
0560: 65 6c 61 79 31 20 32 35 0a 77 68 69 6c 65 20 7b  elay1 25.while {
0570: 31 7d 20 7b 0a 20 20 6c 6f 63 6b 5f 77 69 6e 33  1} {.  lock_win3
0580: 32 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 30  2_file test.db 0
0590: 20 24 3a 3a 64 65 6c 61 79 31 0a 20 20 73 65 74   $::delay1.  set
05a0: 20 3a 3a 6c 6f 67 20 7b 7d 0a 20 20 73 65 74 20   ::log {}.  set 
05b0: 72 63 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76  rc [catch {db ev
05c0: 61 6c 20 7b 53 45 4c 45 43 54 20 78 2c 20 6c 65  al {SELECT x, le
05d0: 6e 67 74 68 28 79 29 20 46 52 4f 4d 20 74 31 20  ngth(y) FROM t1 
05e0: 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 7d 7d  ORDER BY rowid}}
05f0: 20 6d 73 67 5d 0a 20 20 69 66 20 7b 24 72 63 7d   msg].  if {$rc}
0600: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 77   {.    lappend w
0610: 69 6e 33 32 5f 6c 6f 63 6b 5f 65 72 72 6f 72 20  in32_lock_error 
0620: 24 3a 3a 64 65 6c 61 79 31 0a 20 20 20 20 64 6f  $::delay1.    do
0630: 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f 63 6b 2d  _test win32lock-
0640: 31 2e 32 2d 24 64 65 6c 61 79 31 2d 65 72 72 6f  1.2-$delay1-erro
0650: 72 20 7b 0a 20 20 20 20 20 20 20 73 65 74 20 3a  r {.       set :
0660: 3a 6d 73 67 0a 20 20 20 20 7d 20 7b 64 69 73 6b  :msg.    } {disk
0670: 20 49 2f 4f 20 65 72 72 6f 72 7d 0a 20 20 7d 20   I/O error}.  } 
0680: 65 6c 73 65 20 7b 0a 20 20 20 20 6c 61 70 70 65  else {.    lappe
0690: 6e 64 20 77 69 6e 33 32 5f 6c 6f 63 6b 5f 6f 6b  nd win32_lock_ok
06a0: 20 24 3a 3a 64 65 6c 61 79 31 0a 20 20 20 20 64   $::delay1.    d
06b0: 6f 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f 63 6b  o_test win32lock
06c0: 2d 31 2e 32 2d 24 64 65 6c 61 79 31 2d 6f 6b 20  -1.2-$delay1-ok 
06d0: 7b 0a 20 20 20 20 20 20 20 73 65 74 20 3a 3a 6d  {.       set ::m
06e0: 73 67 0a 20 20 20 20 7d 20 7b 31 20 31 30 30 30  sg.    } {1 1000
06f0: 30 30 20 32 20 35 30 30 30 30 20 33 20 32 35 30  00 2 50000 3 250
0700: 30 30 20 34 20 31 32 35 30 30 7d 0a 20 20 20 20  00 4 12500}.    
0710: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
0720: 20 3a 3a 6c 6f 67 5d 20 26 26 20 24 3a 3a 6c 6f   ::log] && $::lo
0730: 67 21 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 64  g!=""} {.      d
0740: 6f 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f 63 6b  o_test win32lock
0750: 2d 31 2e 32 2d 24 64 65 6c 61 79 31 2d 6c 6f 67  -1.2-$delay1-log
0760: 31 20 7b 0a 20 20 20 20 20 20 20 20 72 65 67 73  1 {.        regs
0770: 75 62 20 7b 5c 64 2b 7d 20 24 3a 3a 6c 6f 67 20  ub {\d+} $::log 
0780: 23 20 78 0a 20 20 20 20 20 20 20 20 72 65 67 73  # x.        regs
0790: 75 62 20 7b 20 61 74 20 6c 69 6e 65 20 5c 64 2b  ub { at line \d+
07a0: 7d 20 24 78 20 22 22 20 78 0a 20 20 20 20 20 20  } $x "" x.      
07b0: 20 20 73 65 74 20 78 0a 20 20 20 20 20 20 7d 20    set x.      } 
07c0: 7b 7b 64 65 6c 61 79 65 64 20 23 6d 73 20 66 6f  {{delayed #ms fo
07d0: 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63  r lock/sharing c
07e0: 6f 6e 66 6c 69 63 74 7d 7d 0a 20 20 20 20 7d 0a  onflict}}.    }.
07f0: 20 20 7d 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e 67    }.  if {[lleng
0800: 74 68 20 24 77 69 6e 33 32 5f 6c 6f 63 6b 5f 6f  th $win32_lock_o
0810: 6b 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24  k] && [llength $
0820: 77 69 6e 33 32 5f 6c 6f 63 6b 5f 65 72 72 6f 72  win32_lock_error
0830: 5d 7d 20 62 72 65 61 6b 0a 20 20 69 6e 63 72 20  ]} break.  incr 
0840: 64 65 6c 61 79 31 20 32 35 0a 20 20 69 66 20 7b  delay1 25.  if {
0850: 24 64 65 6c 61 79 31 20 3e 20 31 32 35 30 30 7d  $delay1 > 12500}
0860: 20 7b 0a 20 20 20 20 70 75 74 73 20 22 54 69 6d   {.    puts "Tim
0870: 65 64 20 6f 75 74 20 77 61 69 74 69 6e 67 20 66  ed out waiting f
0880: 6f 72 20 5c 22 6f 6b 5c 22 20 61 6e 64 20 5c 22  or \"ok\" and \"
0890: 65 72 72 6f 72 5c 22 20 72 65 73 75 6c 74 73 2e  error\" results.
08a0: 22 0a 20 20 20 20 62 72 65 61 6b 0a 20 20 7d 0a  ".    break.  }.
08b0: 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20    sqlite3_sleep 
08c0: 31 30 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 69  10.}..do_test wi
08d0: 6e 33 32 6c 6f 63 6b 2d 32 2e 30 20 7b 0a 20 20  n32lock-2.0 {.  
08e0: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
08f0: 33 32 5f 61 76 5f 72 65 74 72 79 20 64 62 20 2d  32_av_retry db -
0900: 31 20 2d 31 0a 7d 20 7b 30 20 31 30 20 32 35 7d  1 -1.} {0 10 25}
0910: 0a 64 6f 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f  .do_test win32lo
0920: 63 6b 2d 32 2e 31 20 7b 0a 20 20 66 69 6c 65 5f  ck-2.1 {.  file_
0930: 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76  control_win32_av
0940: 5f 72 65 74 72 79 20 64 62 20 31 20 31 0a 7d 20  _retry db 1 1.} 
0950: 7b 30 20 31 20 31 7d 0a 0a 23 0a 23 20 4e 4f 54  {0 1 1}..#.# NOT
0960: 45 3a 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74  E: It is known t
0970: 68 61 74 20 74 68 65 20 77 69 6e 33 32 6c 6f 63  hat the win32loc
0980: 6b 2d 32 2e 32 2d 2a 20 74 65 73 74 73 20 6d 61  k-2.2-* tests ma
0990: 79 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 79  y fail if the sy
09a0: 73 74 65 6d 20 69 73 0a 23 20 20 20 20 20 20 20  stem is.#       
09b0: 65 78 70 65 72 69 65 6e 63 69 6e 67 20 68 65 61  experiencing hea
09c0: 76 79 20 6c 6f 61 64 20 28 69 2e 65 2e 20 74 68  vy load (i.e. th
09d0: 65 79 20 61 72 65 20 76 65 72 79 20 74 69 6d 69  ey are very timi
09e0: 6e 67 20 73 65 6e 73 69 74 69 76 65 29 2e 20 20  ng sensitive).  
09f0: 54 68 69 73 20 69 73 0a 23 20 20 20 20 20 20 20  This is.#       
0a00: 70 72 69 6d 61 72 69 6c 79 20 64 75 65 20 74 6f  primarily due to
0a10: 20 74 68 65 20 41 56 20 72 65 74 72 79 20 64 65   the AV retry de
0a20: 6c 61 79 20 62 65 69 6e 67 20 73 65 74 20 74 6f  lay being set to
0a30: 20 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 69   1 millisecond i
0a40: 6e 20 74 68 65 0a 23 20 20 20 20 20 20 20 77 69  n the.#       wi
0a50: 6e 33 32 6c 6f 63 6b 2d 32 2e 31 20 74 65 73 74  n32lock-2.1 test
0a60: 20 28 61 62 6f 76 65 29 2e 20 20 57 68 69 6c 65   (above).  While
0a70: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
0a80: 20 74 6f 20 74 65 73 74 20 74 68 69 73 20 63 6f   to test this co
0a90: 72 6e 65 72 0a 23 20 20 20 20 20 20 20 63 61 73  rner.#       cas
0aa0: 65 20 66 6f 72 20 74 68 65 20 41 56 20 72 65 74  e for the AV ret
0ab0: 72 79 20 6c 6f 67 69 63 2c 20 61 20 66 61 69 6c  ry logic, a fail
0ac0: 75 72 65 20 6f 66 20 74 68 69 73 20 74 65 73 74  ure of this test
0ad0: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
0ae0: 20 6e 6f 74 0a 23 20 20 20 20 20 20 20 62 65 20   not.#       be 
0af0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
0b00: 20 62 75 67 20 69 6e 20 53 51 4c 69 74 65 20 6f   bug in SQLite o
0b10: 72 20 74 68 65 73 65 20 74 65 73 74 20 63 61 73  r these test cas
0b20: 65 73 2e 0a 23 0a 73 65 74 20 77 69 6e 33 32 5f  es..#.set win32_
0b30: 6c 6f 63 6b 5f 6f 6b 20 5b 6c 69 73 74 5d 0a 73  lock_ok [list].s
0b40: 65 74 20 77 69 6e 33 32 5f 6c 6f 63 6b 5f 65 72  et win32_lock_er
0b50: 72 6f 72 20 5b 6c 69 73 74 5d 0a 73 65 74 20 64  ror [list].set d
0b60: 65 6c 61 79 31 20 31 0a 77 68 69 6c 65 20 7b 31  elay1 1.while {1
0b70: 7d 20 7b 0a 20 20 6c 6f 63 6b 5f 77 69 6e 33 32  } {.  lock_win32
0b80: 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20 30 20  _file test.db 0 
0b90: 24 3a 3a 64 65 6c 61 79 31 0a 20 20 73 65 74 20  $::delay1.  set 
0ba0: 3a 3a 6c 6f 67 20 7b 7d 0a 20 20 73 65 74 20 72  ::log {}.  set r
0bb0: 63 20 5b 63 61 74 63 68 20 7b 64 62 20 65 76 61  c [catch {db eva
0bc0: 6c 20 7b 53 45 4c 45 43 54 20 78 2c 20 6c 65 6e  l {SELECT x, len
0bd0: 67 74 68 28 79 29 20 46 52 4f 4d 20 74 31 20 4f  gth(y) FROM t1 O
0be0: 52 44 45 52 20 42 59 20 72 6f 77 69 64 7d 7d 20  RDER BY rowid}} 
0bf0: 6d 73 67 5d 0a 20 20 69 66 20 7b 24 72 63 7d 20  msg].  if {$rc} 
0c00: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 77 69  {.    lappend wi
0c10: 6e 33 32 5f 6c 6f 63 6b 5f 65 72 72 6f 72 20 24  n32_lock_error $
0c20: 3a 3a 64 65 6c 61 79 31 0a 20 20 20 20 64 6f 5f  ::delay1.    do_
0c30: 74 65 73 74 20 77 69 6e 33 32 6c 6f 63 6b 2d 32  test win32lock-2
0c40: 2e 32 2d 24 64 65 6c 61 79 31 2d 65 72 72 6f 72  .2-$delay1-error
0c50: 20 7b 0a 20 20 20 20 20 20 20 73 65 74 20 3a 3a   {.       set ::
0c60: 6d 73 67 0a 20 20 20 20 7d 20 7b 64 69 73 6b 20  msg.    } {disk 
0c70: 49 2f 4f 20 65 72 72 6f 72 7d 0a 20 20 7d 20 65  I/O error}.  } e
0c80: 6c 73 65 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e  lse {.    lappen
0c90: 64 20 77 69 6e 33 32 5f 6c 6f 63 6b 5f 6f 6b 20  d win32_lock_ok 
0ca0: 24 3a 3a 64 65 6c 61 79 31 0a 20 20 20 20 64 6f  $::delay1.    do
0cb0: 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f 63 6b 2d  _test win32lock-
0cc0: 32 2e 32 2d 24 64 65 6c 61 79 31 2d 6f 6b 20 7b  2.2-$delay1-ok {
0cd0: 0a 20 20 20 20 20 20 20 73 65 74 20 3a 3a 6d 73  .       set ::ms
0ce0: 67 0a 20 20 20 20 7d 20 7b 31 20 31 30 30 30 30  g.    } {1 10000
0cf0: 30 20 32 20 35 30 30 30 30 20 33 20 32 35 30 30  0 2 50000 3 2500
0d00: 30 20 34 20 31 32 35 30 30 7d 0a 20 20 20 20 69  0 4 12500}.    i
0d10: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0d20: 3a 3a 6c 6f 67 5d 20 26 26 20 24 3a 3a 6c 6f 67  ::log] && $::log
0d30: 21 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 64 6f  !=""} {.      do
0d40: 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f 63 6b 2d  _test win32lock-
0d50: 32 2e 32 2d 24 64 65 6c 61 79 31 2d 6c 6f 67 31  2.2-$delay1-log1
0d60: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 67 73 75   {.        regsu
0d70: 62 20 7b 5c 64 2b 7d 20 24 3a 3a 6c 6f 67 20 23  b {\d+} $::log #
0d80: 20 78 0a 20 20 20 20 20 20 20 20 72 65 67 73 75   x.        regsu
0d90: 62 20 7b 20 61 74 20 6c 69 6e 65 20 5c 64 2b 7d  b { at line \d+}
0da0: 20 24 78 20 22 22 20 78 0a 20 20 20 20 20 20 20   $x "" x.       
0db0: 20 73 65 74 20 78 0a 20 20 20 20 20 20 7d 20 7b   set x.      } {
0dc0: 7b 64 65 6c 61 79 65 64 20 23 6d 73 20 66 6f 72  {delayed #ms for
0dd0: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
0de0: 6e 66 6c 69 63 74 7d 7d 0a 20 20 20 20 7d 0a 20  nflict}}.    }. 
0df0: 20 7d 0a 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74   }.  if {[llengt
0e00: 68 20 24 77 69 6e 33 32 5f 6c 6f 63 6b 5f 6f 6b  h $win32_lock_ok
0e10: 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 77  ] && [llength $w
0e20: 69 6e 33 32 5f 6c 6f 63 6b 5f 65 72 72 6f 72 5d  in32_lock_error]
0e30: 7d 20 62 72 65 61 6b 0a 20 20 69 6e 63 72 20 64  } break.  incr d
0e40: 65 6c 61 79 31 20 31 0a 20 20 69 66 20 7b 24 64  elay1 1.  if {$d
0e50: 65 6c 61 79 31 20 3e 20 35 30 30 7d 20 7b 0a 20  elay1 > 500} {. 
0e60: 20 20 20 70 75 74 73 20 22 54 69 6d 65 64 20 6f     puts "Timed o
0e70: 75 74 20 77 61 69 74 69 6e 67 20 66 6f 72 20 5c  ut waiting for \
0e80: 22 6f 6b 5c 22 20 61 6e 64 20 5c 22 65 72 72 6f  "ok\" and \"erro
0e90: 72 5c 22 20 72 65 73 75 6c 74 73 2e 22 0a 20 20  r\" results.".  
0ea0: 20 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 73 71    break.  }.  sq
0eb0: 6c 69 74 65 33 5f 73 6c 65 65 70 20 31 30 0a 7d  lite3_sleep 10.}
0ec0: 0a 0a 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77  ..file_control_w
0ed0: 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 64 62  in32_av_retry db
0ee0: 20 31 30 20 32 35 0a 73 71 6c 69 74 65 33 5f 74   10 25.sqlite3_t
0ef0: 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64  est_control_pend
0f00: 69 6e 67 5f 62 79 74 65 20 24 6f 6c 64 5f 70 65  ing_byte $old_pe
0f10: 6e 64 69 6e 67 5f 62 79 74 65 0a 64 62 20 63 6c  nding_byte.db cl
0f20: 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  ose.forcedelete 
0f30: 74 65 73 74 2e 64 62 0a 0a 73 71 6c 69 74 65 33  test.db..sqlite3
0f40: 20 64 62 20 74 65 73 74 2e 64 62 0a 73 71 6c 69   db test.db.sqli
0f50: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
0f60: 0a 64 6f 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f  .do_test win32lo
0f70: 63 6b 2d 33 2e 30 20 7b 0a 20 20 64 62 20 65 76  ck-3.0 {.  db ev
0f80: 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  al {.    CREATE 
0f90: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
0fa0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0fb0: 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 49  VALUES(1);.    I
0fc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0fd0: 4c 55 45 53 28 32 29 3b 0a 20 20 20 20 49 4e 53  LUES(2);.    INS
0fe0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0ff0: 45 53 28 33 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  ES(3);.  }.} {}.
1000: 0a 64 6f 5f 74 65 73 74 20 77 69 6e 33 32 6c 6f  .do_test win32lo
1010: 63 6b 2d 33 2e 31 20 7b 0a 20 20 64 62 20 65 76  ck-3.1 {.  db ev
1020: 61 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 20 45  al {.    BEGIN E
1030: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 49 4e  XCLUSIVE;.    IN
1040: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1050: 55 45 53 28 34 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  UES(4);.  }.} {}
1060: 0a 0a 64 6f 5f 74 65 73 74 20 77 69 6e 33 32 6c  ..do_test win32l
1070: 6f 63 6b 2d 33 2e 32 20 7b 0a 20 20 63 61 74 63  ock-3.2 {.  catc
1080: 68 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  hsql {.    BEGIN
1090: 20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20   EXCLUSIVE;.    
10a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
10b0: 41 4c 55 45 53 28 35 29 3b 0a 20 20 20 20 43 4f  ALUES(5);.    CO
10c0: 4d 4d 49 54 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  MMIT;.  } db2.} 
10d0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
10e0: 6c 6f 63 6b 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73  locked}}..do_tes
10f0: 74 20 77 69 6e 33 32 6c 6f 63 6b 2d 33 2e 33 20  t win32lock-3.3 
1100: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  {.  db eval {.  
1110: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 7d 20    COMMIT;.  }.} 
1120: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 69 6e 33  {}..do_test win3
1130: 32 6c 6f 63 6b 2d 33 2e 34 20 7b 0a 20 20 73 65  2lock-3.4 {.  se
1140: 74 20 68 61 6e 64 6c 65 20 5b 6c 69 6e 64 65 78  t handle [lindex
1150: 20 5b 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77   [file_control_w
1160: 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 20  in32_set_handle 
1170: 64 62 20 30 5d 20 65 6e 64 5d 0a 20 20 6c 69 73  db 0] end].  lis
1180: 74 20 5b 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  t [catchsql {.  
1190: 20 20 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56    BEGIN EXCLUSIV
11a0: 45 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  E;.    INSERT IN
11b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 29 3b  TO t1 VALUES(6);
11c0: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
11d0: 5d 20 5b 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ] [file_control_
11e0: 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
11f0: 20 64 62 20 24 68 61 6e 64 6c 65 5d 20 5b 73 71   db $handle] [sq
1200: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1210: 72 72 63 6f 64 65 20 64 62 5d 0a 7d 20 7b 7b 31  rrcode db].} {{1
1220: 20 7b 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   {disk I/O error
1230: 7d 7d 20 7b 30 20 30 7d 20 53 51 4c 49 54 45 5f  }} {0 0} SQLITE_
1240: 49 4f 45 52 52 5f 4c 4f 43 4b 7d 0a 0a 64 62 32  IOERR_LOCK}..db2
1250: 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65 0a   close.db close.
1260: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1270: 0a 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f  .test_sqlite3_lo
1280: 67 0a 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  g.sqlite3_initia
1290: 6c 69 7a 65 0a 66 69 6e 69 73 68 5f 74 65 73 74  lize.finish_test
12a0: 0a                                               .