/ Hex Artifact Content
Login

Artifact 95be9c32d79be25cf643b4e41a0aa0e53aa21621:


0000: 23 20 32 30 30 38 20 4a 75 6e 65 20 32 38 0a 23  # 2008 June 28.#
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: 64 61 74 61 62 61 73 65 20 70 72 6f 78 79 20 6c  database proxy l
01d0: 6f 63 6b 73 2e 0a 23 0a 23 20 24 49 64 24 0a 0a  ocks..#.# $Id$..
01e0: 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c  set testdir [fil
01f0: 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30  e dirname $argv0
0200: 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69  ].source $testdi
0210: 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20  r/tester.tcl..# 
0220: 54 68 69 73 20 66 69 6c 65 20 69 73 20 6f 6e 6c  This file is onl
0230: 79 20 72 75 6e 20 69 66 20 75 73 69 6e 67 20 74  y run if using t
0240: 68 65 20 75 6e 69 78 20 62 61 63 6b 65 6e 64 20  he unix backend 
0250: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
0260: 65 0a 23 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  e.# SQLITE_ENABL
0270: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0280: 6d 61 63 72 6f 2e 0a 64 62 20 63 6c 6f 73 65 0a  macro..db close.
0290: 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 69  if {[catch {sqli
02a0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
02b0: 76 66 73 20 75 6e 69 78 2d 6e 6f 6e 65 7d 20 6d  vfs unix-none} m
02c0: 73 67 5d 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f  sg]} {.  finish_
02d0: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
02e0: 64 62 20 63 6c 6f 73 65 0a 66 69 6c 65 20 64 65  db close.file de
02f0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
0300: 2e 64 62 2e 6c 6f 63 6b 0a 0a 23 23 23 23 23 23  .db.lock..######
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
0350: 69 66 63 61 70 61 62 6c 65 20 6c 6f 63 6b 5f 70  ifcapable lock_p
0360: 72 6f 78 79 5f 70 72 61 67 6d 61 73 26 26 70 72  roxy_pragmas&&pr
0370: 65 66 65 72 5f 70 72 6f 78 79 5f 6c 6f 63 6b 69  efer_proxy_locki
0380: 6e 67 20 7b 0a 20 20 73 65 74 20 3a 3a 75 73 69  ng {.  set ::usi
0390: 6e 67 5f 70 72 6f 78 79 20 30 0a 20 20 66 6f 72  ng_proxy 0.  for
03a0: 65 61 63 68 20 7b 6e 61 6d 65 20 76 61 6c 75 65  each {name value
03b0: 7d 20 5b 61 72 72 61 79 20 67 65 74 20 65 6e 76  } [array get env
03c0: 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
03d0: 4f 58 59 5f 4c 4f 43 4b 49 4e 47 5d 20 7b 0a 20  OXY_LOCKING] {. 
03e0: 20 20 20 73 65 74 20 3a 3a 75 73 69 6e 67 5f 70     set ::using_p
03f0: 72 6f 78 79 20 24 76 61 6c 75 65 0a 20 20 7d 0a  roxy $value.  }.
0400: 0a 20 20 23 20 65 6e 61 62 6c 65 20 74 68 65 20  .  # enable the 
0410: 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 66 6f  proxy locking fo
0420: 72 20 74 68 65 73 65 20 74 65 73 74 73 0a 20 20  r these tests.  
0430: 73 65 74 20 65 6e 76 28 53 51 4c 49 54 45 5f 46  set env(SQLITE_F
0440: 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
0450: 4e 47 29 20 22 31 22 0a 0a 20 20 23 20 74 65 73  NG) "1"..  # tes
0460: 74 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 72 65  t conch file cre
0470: 61 74 69 6f 6e 0a 20 20 23 0a 0a 20 20 63 61 74  ation.  #..  cat
0480: 63 68 20 7b 20 66 69 6c 65 20 64 65 6c 65 74 65  ch { file delete
0490: 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 74 65 73 74   lock_proxy_test
04a0: 2e 64 62 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  .db }.  catch { 
04b0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2e 6c 6f 63  file delete .loc
04c0: 6b 5f 70 72 6f 78 79 5f 74 65 73 74 2e 64 62 2d  k_proxy_test.db-
04d0: 63 6f 6e 63 68 20 7d 0a 20 20 23 20 74 65 73 74  conch }.  # test
04e0: 20 74 68 61 74 20 70 72 6f 78 79 20 6c 6f 63 6b   that proxy lock
04f0: 69 6e 67 20 6d 6f 64 65 20 63 72 65 61 74 65 73  ing mode creates
0500: 20 63 6f 6e 63 68 20 66 69 6c 65 73 0a 20 20 64   conch files.  d
0510: 6f 5f 74 65 73 74 20 6c 6f 63 6b 5f 70 72 6f 78  o_test lock_prox
0520: 79 31 2e 30 20 7b 0a 20 20 20 20 73 71 6c 69 74  y1.0 {.    sqlit
0530: 65 33 20 64 62 32 20 6c 6f 63 6b 5f 70 72 6f 78  e3 db2 lock_prox
0540: 79 5f 74 65 73 74 2e 64 62 0a 20 20 20 20 63 61  y_test.db.    ca
0550: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 63  tchsql {.      c
0560: 72 65 61 74 65 20 74 61 62 6c 65 20 78 28 79 29  reate table x(y)
0570: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 20 20  ;.    } db2.    
0580: 66 69 6c 65 20 65 78 69 73 74 73 20 2e 6c 6f 63  file exists .loc
0590: 6b 5f 70 72 6f 78 79 5f 74 65 73 74 2e 64 62 2d  k_proxy_test.db-
05a0: 63 6f 6e 63 68 0a 20 20 7d 20 7b 31 7d 0a 20 20  conch.  } {1}.  
05b0: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
05c0: 65 20 7d 0a 0a 0a 20 20 23 20 74 65 73 74 20 70  e }...  # test p
05d0: 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 72 65 61  roxy locking rea
05e0: 64 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65  donly file syste
05f0: 6d 20 68 61 6e 64 6c 69 6e 67 0a 20 20 23 0a 0a  m handling.  #..
0600: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
0610: 74 73 20 2f 75 73 72 2f 62 69 6e 2f 68 64 69 75  ts /usr/bin/hdiu
0620: 74 69 6c 5d 7d 20 7b 0a 0a 20 20 20 20 70 75 74  til]} {..    put
0630: 73 20 22 43 72 65 61 74 69 6e 67 20 72 65 61 64  s "Creating read
0640: 6f 6e 6c 79 20 66 69 6c 65 20 73 79 73 74 65 6d  only file system
0650: 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
0660: 6e 67 20 74 65 73 74 73 2e 2e 2e 22 0a 20 20 20  ng tests...".   
0670: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
0680: 73 20 2f 56 6f 6c 75 6d 65 73 2f 72 65 61 64 6f  s /Volumes/reado
0690: 6e 6c 79 5d 7d 20 7b 0a 20 20 20 20 20 20 65 78  nly]} {.      ex
06a0: 65 63 20 68 64 69 75 74 69 6c 20 64 65 74 61 63  ec hdiutil detac
06b0: 68 20 2f 56 6f 6c 75 6d 65 73 2f 72 65 61 64 6f  h /Volumes/reado
06c0: 6e 6c 79 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nly.    }.    if
06d0: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 72   {[file exists r
06e0: 65 61 64 6f 6e 6c 79 2e 64 6d 67 5d 7d 20 7b 0a  eadonly.dmg]} {.
06f0: 20 20 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74        file delet
0700: 65 20 72 65 61 64 6f 6e 6c 79 2e 64 6d 67 0a 20  e readonly.dmg. 
0710: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 20 68 64     }.    exec hd
0720: 69 75 74 69 6c 20 63 72 65 61 74 65 20 2d 6d 65  iutil create -me
0730: 67 61 62 79 74 65 73 20 31 20 2d 66 73 20 48 46  gabytes 1 -fs HF
0740: 53 2b 20 72 65 61 64 6f 6e 6c 79 2e 64 6d 67 20  S+ readonly.dmg 
0750: 2d 76 6f 6c 6e 61 6d 65 20 72 65 61 64 6f 6e 6c  -volname readonl
0760: 79 0a 20 20 20 20 65 78 65 63 20 68 64 69 75 74  y.    exec hdiut
0770: 69 6c 20 61 74 74 61 63 68 20 72 65 61 64 6f 6e  il attach readon
0780: 6c 79 2e 64 6d 67 0a 0a 20 20 20 20 23 20 63 72  ly.dmg..    # cr
0790: 65 61 74 65 20 74 65 73 74 31 2e 64 62 20 61 6e  eate test1.db an
07a0: 64 20 61 20 2e 74 65 73 74 31 2e 64 62 2d 63 6f  d a .test1.db-co
07b0: 6e 63 68 20 66 6f 72 20 68 6f 73 74 34 0a 20 20  nch for host4.  
07c0: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 68 6f 73    set sqlite_hos
07d0: 74 69 64 5f 6e 75 6d 20 34 0a 20 20 20 20 73 71  tid_num 4.    sq
07e0: 6c 69 74 65 33 20 64 62 32 20 2f 56 6f 6c 75 6d  lite3 db2 /Volum
07f0: 65 73 2f 72 65 61 64 6f 6e 6c 79 2f 74 65 73 74  es/readonly/test
0800: 31 2e 64 62 20 0a 20 20 20 20 65 78 65 63 73 71  1.db .    execsq
0810: 6c 20 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65  l {.      create
0820: 20 74 61 62 6c 65 20 78 28 79 29 3b 0a 20 20 20   table x(y);.   
0830: 20 7d 20 64 62 32 0a 20 20 20 20 64 62 32 20 63   } db2.    db2 c
0840: 6c 6f 73 65 0a 0a 20 20 20 20 23 20 63 72 65 61  lose..    # crea
0850: 74 65 20 74 65 73 74 32 2e 64 62 20 61 6e 64 20  te test2.db and 
0860: 61 20 2e 74 65 73 74 32 2e 64 62 2d 63 6f 6e 63  a .test2.db-conc
0870: 68 20 66 6f 72 20 68 6f 73 74 35 0a 20 20 20 20  h for host5.    
0880: 73 65 74 20 73 71 6c 69 74 65 5f 68 6f 73 74 69  set sqlite_hosti
0890: 64 5f 6e 75 6d 20 35 0a 20 20 20 20 73 71 6c 69  d_num 5.    sqli
08a0: 74 65 33 20 64 62 32 20 2f 56 6f 6c 75 6d 65 73  te3 db2 /Volumes
08b0: 2f 72 65 61 64 6f 6e 6c 79 2f 74 65 73 74 32 2e  /readonly/test2.
08c0: 64 62 20 0a 20 20 20 20 65 78 65 63 73 71 6c 20  db .    execsql 
08d0: 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65 20 74  {.      create t
08e0: 61 62 6c 65 20 78 28 79 29 3b 0a 20 20 20 20 7d  able x(y);.    }
08f0: 20 64 62 32 0a 20 20 20 20 64 62 32 20 63 6c 6f   db2.    db2 clo
0900: 73 65 0a 0a 20 20 20 20 23 20 63 72 65 61 74 65  se..    # create
0910: 20 74 65 73 74 33 2e 64 62 20 77 69 74 68 6f 75   test3.db withou
0920: 74 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20  t a conch file. 
0930: 20 20 20 73 65 74 20 65 6e 76 28 53 51 4c 49 54     set env(SQLIT
0940: 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
0950: 43 4b 49 4e 47 29 20 22 30 22 0a 20 20 20 20 73  CKING) "0".    s
0960: 71 6c 69 74 65 33 20 64 62 32 20 2f 56 6f 6c 75  qlite3 db2 /Volu
0970: 6d 65 73 2f 72 65 61 64 6f 6e 6c 79 2f 74 65 73  mes/readonly/tes
0980: 74 33 2e 64 62 20 0a 20 20 20 20 65 78 65 63 73  t3.db .    execs
0990: 71 6c 20 7b 0a 20 20 20 20 20 20 63 72 65 61 74  ql {.      creat
09a0: 65 20 74 61 62 6c 65 20 78 28 79 29 3b 0a 20 20  e table x(y);.  
09b0: 20 20 7d 20 64 62 32 0a 20 20 20 20 64 62 32 20    } db2.    db2 
09c0: 63 6c 6f 73 65 0a 20 20 20 20 65 78 65 63 20 68  close.    exec h
09d0: 64 69 75 74 69 6c 20 64 65 74 61 63 68 20 2f 56  diutil detach /V
09e0: 6f 6c 75 6d 65 73 2f 72 65 61 64 6f 6e 6c 79 0a  olumes/readonly.
09f0: 20 20 20 20 65 78 65 63 20 68 64 69 75 74 69 6c      exec hdiutil
0a00: 20 61 74 74 61 63 68 20 2d 72 65 61 64 6f 6e 6c   attach -readonl
0a10: 79 20 72 65 61 64 6f 6e 6c 79 2e 64 6d 67 0a 0a  y readonly.dmg..
0a20: 20 20 20 20 23 20 74 65 73 74 20 74 68 61 74 20      # test that 
0a30: 61 6e 20 75 6e 77 72 69 74 61 62 6c 65 2c 20 68  an unwritable, h
0a40: 6f 73 74 2d 6d 69 73 6d 61 74 63 68 65 64 20 63  ost-mismatched c
0a50: 6f 6e 63 68 20 66 69 6c 65 20 70 72 65 76 65 6e  onch file preven
0a60: 74 73 20 0a 20 20 20 20 23 20 72 65 61 64 20 6f  ts .    # read o
0a70: 6e 6c 79 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  nly proxy-lockin
0a80: 67 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 20  g mode database 
0a90: 61 63 63 65 73 73 0a 20 20 20 20 73 65 74 20 65  access.    set e
0aa0: 6e 76 28 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  nv(SQLITE_FORCE_
0ab0: 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 20 22  PROXY_LOCKING) "
0ac0: 31 22 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 6c  1".    do_test l
0ad0: 6f 63 6b 5f 70 72 6f 78 79 32 2e 30 20 7b 0a 20  ock_proxy2.0 {. 
0ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32       sqlite3 db2
0af0: 20 2f 56 6f 6c 75 6d 65 73 2f 72 65 61 64 6f 6e   /Volumes/readon
0b00: 6c 79 2f 74 65 73 74 31 2e 64 62 0a 20 20 20 20  ly/test1.db.    
0b10: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0b20: 20 20 20 20 20 73 65 6c 65 63 74 20 2a 20 66 72       select * fr
0b30: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
0b40: 3b 0a 20 20 20 20 20 20 7d 20 64 62 32 0a 20 20  ;.      } db2.  
0b50: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
0b60: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 20   is locked}}.   
0b70: 20 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f   catch { db2 clo
0b80: 73 65 20 7d 0a 20 20 20 20 0a 20 20 20 20 23 20  se }.    .    # 
0b90: 74 65 73 74 20 74 68 61 74 20 61 6e 20 75 6e 77  test that an unw
0ba0: 72 69 74 61 62 6c 65 2c 20 68 6f 73 74 2d 6d 61  ritable, host-ma
0bb0: 74 63 68 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c  tching conch fil
0bc0: 65 20 61 6c 6c 6f 77 73 0a 20 20 20 20 23 20 72  e allows.    # r
0bd0: 65 61 64 20 6f 6e 6c 79 20 70 72 6f 78 79 2d 6c  ead only proxy-l
0be0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 64 61 74 61  ocking mode data
0bf0: 62 61 73 65 20 61 63 63 65 73 73 0a 20 20 20 20  base access.    
0c00: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 5f 70 72 6f  do_test lock_pro
0c10: 78 79 32 2e 31 20 7b 0a 20 20 20 20 20 20 73 71  xy2.1 {.      sq
0c20: 6c 69 74 65 33 20 64 62 32 20 2f 56 6f 6c 75 6d  lite3 db2 /Volum
0c30: 65 73 2f 72 65 61 64 6f 6e 6c 79 2f 74 65 73 74  es/readonly/test
0c40: 32 2e 64 62 0a 20 20 20 20 20 20 63 61 74 63 68  2.db.      catch
0c50: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65  sql {.        se
0c60: 6c 65 63 74 20 2a 20 66 72 6f 6d 20 73 71 6c 69  lect * from sqli
0c70: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20  te_master;.     
0c80: 20 7d 20 64 62 32 0a 20 20 20 20 7d 20 7b 30 20   } db2.    } {0 
0c90: 7b 74 61 62 6c 65 20 78 20 78 20 32 20 7b 43 52  {table x x 2 {CR
0ca0: 45 41 54 45 20 54 41 42 4c 45 20 78 28 79 29 7d  EATE TABLE x(y)}
0cb0: 7d 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 64  }}.    catch { d
0cc0: 62 32 20 63 6c 6f 73 65 20 7d 0a 0a 20 20 20 20  b2 close }..    
0cd0: 23 20 74 65 73 74 20 74 68 61 74 20 61 6e 20 75  # test that an u
0ce0: 6e 77 72 69 74 61 62 6c 65 2c 20 6e 6f 6e 65 78  nwritable, nonex
0cf0: 69 73 74 61 6e 74 20 63 6f 6e 63 68 20 66 69 6c  istant conch fil
0d00: 65 20 61 6c 6c 6f 77 73 0a 20 20 20 20 23 20 72  e allows.    # r
0d10: 65 61 64 20 6f 6e 6c 79 20 70 72 6f 78 79 2d 6c  ead only proxy-l
0d20: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 64 61 74 61  ocking mode data
0d30: 62 61 73 65 20 61 63 63 65 73 73 0a 20 20 20 20  base access.    
0d40: 64 6f 5f 74 65 73 74 20 6c 6f 63 6b 5f 70 72 6f  do_test lock_pro
0d50: 78 79 32 2e 32 20 7b 0a 20 20 20 20 20 20 73 71  xy2.2 {.      sq
0d60: 6c 69 74 65 33 20 64 62 32 20 2f 56 6f 6c 75 6d  lite3 db2 /Volum
0d70: 65 73 2f 72 65 61 64 6f 6e 6c 79 2f 74 65 73 74  es/readonly/test
0d80: 33 2e 64 62 0a 20 20 20 20 20 20 63 61 74 63 68  3.db.      catch
0d90: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65  sql {.        se
0da0: 6c 65 63 74 20 2a 20 66 72 6f 6d 20 73 71 6c 69  lect * from sqli
0db0: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20  te_master;.     
0dc0: 20 7d 20 64 62 32 0a 20 20 20 20 7d 20 7b 30 20   } db2.    } {0 
0dd0: 7b 74 61 62 6c 65 20 78 20 78 20 32 20 7b 43 52  {table x x 2 {CR
0de0: 45 41 54 45 20 54 41 42 4c 45 20 78 28 79 29 7d  EATE TABLE x(y)}
0df0: 7d 7d 0a 20 20 20 20 63 61 74 63 68 20 7b 20 64  }}.    catch { d
0e00: 62 32 20 63 6c 6f 73 65 20 7d 0a 0a 20 20 20 20  b2 close }..    
0e10: 65 78 65 63 20 68 64 69 75 74 69 6c 20 64 65 74  exec hdiutil det
0e20: 61 63 68 20 2f 56 6f 6c 75 6d 65 73 2f 72 65 61  ach /Volumes/rea
0e30: 64 6f 6e 6c 79 0a 20 20 20 20 66 69 6c 65 20 64  donly.    file d
0e40: 65 6c 65 74 65 20 72 65 61 64 6f 6e 6c 79 2e 64  elete readonly.d
0e50: 6d 67 0a 20 20 7d 0a 20 20 73 65 74 20 65 6e 76  mg.  }.  set env
0e60: 28 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  (SQLITE_FORCE_PR
0e70: 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 20 22 30 22  OXY_LOCKING) "0"
0e80: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 68 6f  .  set sqlite_ho
0e90: 73 74 69 64 5f 6e 75 6d 20 30 0a 7d 0a 0a 23 23  stid_num 0.}..##
0ea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0ee0: 23 23 23 0a 0a 66 69 6c 65 20 64 65 6c 65 74 65  ###..file delete
0ef0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a   -force test.db.
0f00: 0a 69 66 63 61 70 61 62 6c 65 20 6c 6f 63 6b 5f  .ifcapable lock_
0f10: 70 72 6f 78 79 5f 70 72 61 67 6d 61 73 26 26 70  proxy_pragmas&&p
0f20: 72 65 66 65 72 5f 70 72 6f 78 79 5f 6c 6f 63 6b  refer_proxy_lock
0f30: 69 6e 67 20 7b 0a 20 20 73 65 74 20 65 6e 76 28  ing {.  set env(
0f40: 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
0f50: 58 59 5f 4c 4f 43 4b 49 4e 47 29 20 24 3a 3a 75  XY_LOCKING) $::u
0f60: 73 69 6e 67 5f 70 72 6f 78 79 0a 7d 0a 0a 66 69  sing_proxy.}..fi
0f70: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.