/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20:


0000: 23 20 32 30 31 31 20 4d 61 79 20 30 39 0a 23 0a  # 2011 May 09.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 0a 23 20 54 68 69 73 20 66 69 6c  ***.#.# This fil
0170: 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 73 74 73  e contains tests
0180: 20 66 6f 72 20 75 73 69 6e 67 20 57 41 4c 20 64   for using WAL d
0190: 61 74 61 62 61 73 65 73 20 69 6e 20 72 65 61 64  atabases in read
01a0: 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 23 0a 0a 73  -only mode..#..s
01b0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01c0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
01d0: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
01e0: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
01f0: 63 65 20 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b  ce $testdir/lock
0200: 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 65 74 20  _common.tcl.set 
0210: 3a 3a 74 65 73 74 70 72 65 66 69 78 20 77 61 6c  ::testprefix wal
0220: 72 6f 0a 0a 23 20 54 68 65 73 65 20 74 65 73 74  ro..# These test
0230: 73 20 61 72 65 20 6f 6e 6c 79 20 67 6f 69 6e 67  s are only going
0240: 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 75 6e 69 78   to work on unix
0250: 2e 0a 23 0a 69 66 20 7b 24 3a 3a 74 63 6c 5f 70  ..#.if {$::tcl_p
0260: 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d  latform(platform
0270: 29 20 21 3d 20 22 75 6e 69 78 22 7d 20 7b 0a 20  ) != "unix"} {. 
0280: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
0290: 65 74 75 72 6e 0a 7d 0a 0a 23 20 41 6e 64 20 6f  eturn.}..# And o
02a0: 6e 6c 79 20 69 66 20 74 68 65 20 62 75 69 6c 64  nly if the build
02b0: 20 69 73 20 57 41 4c 2d 63 61 70 61 62 6c 65 2e   is WAL-capable.
02c0: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 21 77 61  .#.ifcapable !wa
02d0: 6c 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73  l {.  finish_tes
02e0: 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 6f  t.  return.}..do
02f0: 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73  _multiclient_tes
0300: 74 20 74 6e 20 7b 0a 20 20 0a 20 20 23 20 43 6c  t tn {.  .  # Cl
0310: 6f 73 65 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69  ose all connecti
0320: 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ons and delete t
0330: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 23  he database..  #
0340: 0a 20 20 63 6f 64 65 31 20 7b 20 64 62 20 63 6c  .  code1 { db cl
0350: 6f 73 65 20 20 7d 0a 20 20 63 6f 64 65 32 20 7b  ose  }.  code2 {
0360: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 63   db2 close }.  c
0370: 6f 64 65 33 20 7b 20 64 62 33 20 63 6c 6f 73 65  ode3 { db3 close
0380: 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65   }.  forcedelete
0390: 20 74 65 73 74 2e 64 62 0a 20 20 66 6f 72 63 65   test.db.  force
03a0: 64 65 6c 65 74 65 20 77 61 6c 72 6f 0a 20 20 0a  delete walro.  .
03b0: 20 20 23 20 44 6f 20 6e 6f 74 20 72 75 6e 20 74    # Do not run t
03c0: 65 73 74 73 20 77 69 74 68 20 74 68 65 20 63 6f  ests with the co
03d0: 6e 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  nnections in the
03e0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 20   same process.. 
03f0: 20 23 0a 20 20 69 66 20 7b 24 74 6e 3d 3d 32 7d   #.  if {$tn==2}
0400: 20 63 6f 6e 74 69 6e 75 65 0a 0a 20 20 66 6f 72   continue..  for
0410: 65 61 63 68 20 63 20 7b 63 6f 64 65 31 20 63 6f  each c {code1 co
0420: 64 65 32 20 63 6f 64 65 33 7d 20 7b 0a 20 20 20  de2 code3} {.   
0430: 20 24 63 20 7b 0a 20 20 20 20 20 20 73 71 6c 69   $c {.      sqli
0440: 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20 20  te3_shutdown.   
0450: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69     sqlite3_confi
0460: 67 5f 75 72 69 20 31 0a 20 20 20 20 7d 0a 20 20  g_uri 1.    }.  
0470: 7d 0a 0a 20 20 66 69 6c 65 20 6d 6b 64 69 72 20  }..  file mkdir 
0480: 77 61 6c 72 6f 0a 0a 20 20 64 6f 5f 74 65 73 74  walro..  do_test
0490: 20 31 2e 31 2e 31 20 7b 0a 20 20 20 20 63 6f 64   1.1.1 {.    cod
04a0: 65 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62 32  e2 { sqlite3 db2
04b0: 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 73   test.db }.    s
04c0: 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 50 52 41  ql2 { .      PRA
04d0: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
04e0: 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  = 0;.      PRAGM
04f0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
0500: 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41   WAL;.      CREA
0510: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
0520: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
0530: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
0540: 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 7d 0a  a', 'b');.    }.
0550: 20 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 20      file exists 
0560: 74 65 73 74 2e 64 62 2d 73 68 6d 0a 20 20 7d 20  test.db-shm.  } 
0570: 7b 31 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31  {1}..  do_test 1
0580: 2e 31 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65 20  .1.2 {.    file 
0590: 61 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e  attributes test.
05a0: 64 62 2d 73 68 6d 20 2d 70 65 72 6d 69 73 73 69  db-shm -permissi
05b0: 6f 6e 73 20 72 2d 2d 72 2d 2d 72 2d 2d 0a 20 20  ons r--r--r--.  
05c0: 20 20 63 6f 64 65 31 20 7b 20 73 71 6c 69 74 65    code1 { sqlite
05d0: 33 20 64 62 20 66 69 6c 65 3a 74 65 73 74 2e 64  3 db file:test.d
05e0: 62 3f 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31  b?readonly_shm=1
05f0: 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f   }.  } {}..  do_
0600: 74 65 73 74 20 31 2e 31 2e 33 20 7b 20 73 71 6c  test 1.1.3 { sql
0610: 31 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  1 "SELECT * FROM
0620: 20 74 31 22 20 7d 20 20 20 20 20 20 20 20 20 20   t1" }          
0630: 20 20 20 20 20 20 7b 61 20 62 7d 0a 20 20 64 6f        {a b}.  do
0640: 5f 74 65 73 74 20 31 2e 31 2e 34 20 7b 20 73 71  _test 1.1.4 { sq
0650: 6c 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  l2 "INSERT INTO 
0660: 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  t1 VALUES('c', '
0670: 64 27 29 22 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  d')" } {}.  do_t
0680: 65 73 74 20 31 2e 31 2e 35 20 7b 20 73 71 6c 31  est 1.1.5 { sql1
0690: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
06a0: 74 31 22 20 7d 20 20 20 20 20 20 20 20 20 20 20  t1" }           
06b0: 20 20 20 20 20 7b 61 20 62 20 63 20 64 7d 0a 0a       {a b c d}..
06c0: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74    # Check that t
06d0: 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 63 6f 6e  he read-only con
06e0: 6e 65 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 77  nection cannot w
06f0: 72 69 74 65 20 6f 72 20 63 68 65 63 6b 70 6f 69  rite or checkpoi
0700: 6e 74 20 74 68 65 20 64 62 2e 0a 20 20 23 0a 20  nt the db..  #. 
0710: 20 64 6f 5f 74 65 73 74 20 31 2e 31 2e 36 20 7b   do_test 1.1.6 {
0720: 20 0a 20 20 20 20 63 73 71 6c 31 20 22 49 4e 53   .    csql1 "INS
0730: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0740: 45 53 28 27 65 27 2c 20 27 66 27 29 22 20 0a 20  ES('e', 'f')" . 
0750: 20 7d 20 7b 31 20 7b 61 74 74 65 6d 70 74 20 74   } {1 {attempt t
0760: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
0770: 6c 79 20 64 61 74 61 62 61 73 65 7d 7d 0a 20 20  ly database}}.  
0780: 64 6f 5f 74 65 73 74 20 31 2e 31 2e 37 20 7b 20  do_test 1.1.7 { 
0790: 0a 20 20 20 20 63 73 71 6c 31 20 22 50 52 41 47  .    csql1 "PRAG
07a0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
07b0: 74 22 0a 20 20 7d 20 7b 31 20 7b 61 74 74 65 6d  t".  } {1 {attem
07c0: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
07d0: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 7d  adonly database}
07e0: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 31  }..  do_test 1.1
07f0: 2e 39 20 20 7b 20 73 71 6c 32 20 22 49 4e 53 45  .9  { sql2 "INSE
0800: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0810: 53 28 27 65 27 2c 20 27 66 27 29 22 20 7d 20 7b  S('e', 'f')" } {
0820: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 31 2e  }.  do_test 1.1.
0830: 31 30 20 7b 20 73 71 6c 31 20 22 53 45 4c 45 43  10 { sql1 "SELEC
0840: 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 7d 20 20  T * FROM t1" }  
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 61                {a
0860: 20 62 20 63 20 64 20 65 20 66 7d 0a 0a 20 20 64   b c d e f}..  d
0870: 6f 5f 74 65 73 74 20 31 2e 31 2e 31 31 20 7b 20  o_test 1.1.11 { 
0880: 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20 20  .    sql2 {.    
0890: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
08a0: 20 56 41 4c 55 45 53 28 27 67 27 2c 20 27 68 27   VALUES('g', 'h'
08b0: 29 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  );.      PRAGMA 
08c0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
08d0: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 7b 7d      }.    set {}
08e0: 20 7b 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f   {}.  } {}.  do_
08f0: 74 65 73 74 20 31 2e 31 2e 31 32 20 7b 20 73 71  test 1.1.12 { sq
0900: 6c 31 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  l1 "SELECT * FRO
0910: 4d 20 74 31 22 20 7d 20 20 20 20 20 20 20 20 20  M t1" }         
0920: 20 20 20 20 20 20 20 7b 61 20 62 20 63 20 64 20         {a b c d 
0930: 65 20 66 20 67 20 68 7d 0a 20 20 64 6f 5f 74 65  e f g h}.  do_te
0940: 73 74 20 31 2e 31 2e 31 33 20 20 7b 20 73 71 6c  st 1.1.13  { sql
0950: 32 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  2 "INSERT INTO t
0960: 31 20 56 41 4c 55 45 53 28 27 69 27 2c 20 27 6a  1 VALUES('i', 'j
0970: 27 29 22 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74  ')" } {}..  do_t
0980: 65 73 74 20 31 2e 32 2e 31 20 7b 0a 20 20 20 20  est 1.2.1 {.    
0990: 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73  code2 { db2 clos
09a0: 65 20 7d 0a 20 20 20 20 63 6f 64 65 31 20 7b 20  e }.    code1 { 
09b0: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 20 20 6c  db close }.    l
09c0: 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73  ist [file exists
09d0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 5b 66   test.db-wal] [f
09e0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
09f0: 64 62 2d 73 68 6d 5d 0a 20 20 7d 20 7b 31 20 31  db-shm].  } {1 1
0a00: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 32  }..  do_test 1.2
0a10: 2e 32 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b  .2 {.    code1 {
0a20: 20 73 71 6c 69 74 65 33 20 64 62 20 66 69 6c 65   sqlite3 db file
0a30: 3a 74 65 73 74 2e 64 62 3f 72 65 61 64 6f 6e 6c  :test.db?readonl
0a40: 79 5f 73 68 6d 3d 31 20 7d 0a 20 20 20 20 6c 69  y_shm=1 }.    li
0a50: 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 31  st [catch { sql1
0a60: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0a70: 20 74 31 20 7d 20 7d 20 6d 73 67 5d 20 24 6d 73   t1 } } msg] $ms
0a80: 67 0a 20 20 7d 20 7b 30 20 7b 61 20 62 20 63 20  g.  } {0 {a b c 
0a90: 64 20 65 20 66 20 67 20 68 20 69 20 6a 7d 7d 0a  d e f g h i j}}.
0aa0: 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 32 2e 33  .  do_test 1.2.3
0ab0: 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20 64   {.    code1 { d
0ac0: 62 20 63 6c 6f 73 65 20 7d 0a 20 20 20 20 66 69  b close }.    fi
0ad0: 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65  le attributes te
0ae0: 73 74 2e 64 62 2d 73 68 6d 20 2d 70 65 72 6d 69  st.db-shm -permi
0af0: 73 73 69 6f 6e 73 20 72 77 2d 72 2d 2d 72 2d 2d  ssions rw-r--r--
0b00: 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65  .    hexio_write
0b10: 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 30 20 30   test.db-shm 0 0
0b20: 31 30 32 30 33 30 34 20 0a 20 20 20 20 66 69 6c  1020304 .    fil
0b30: 65 20 61 74 74 72 69 62 75 74 65 73 20 74 65 73  e attributes tes
0b40: 74 2e 64 62 2d 73 68 6d 20 2d 70 65 72 6d 69 73  t.db-shm -permis
0b50: 73 69 6f 6e 73 20 72 2d 2d 72 2d 2d 72 2d 2d 0a  sions r--r--r--.
0b60: 20 20 20 20 63 6f 64 65 31 20 7b 20 73 71 6c 69      code1 { sqli
0b70: 74 65 33 20 64 62 20 66 69 6c 65 3a 74 65 73 74  te3 db file:test
0b80: 2e 64 62 3f 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  .db?readonly_shm
0b90: 3d 31 20 7d 0a 20 20 20 20 63 73 71 6c 31 20 7b  =1 }.    csql1 {
0ba0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0bb0: 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 61 20 62 20  1 }.  } {0 {a b 
0bc0: 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a 7d  c d e f g h i j}
0bd0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 32 2e  }.  do_test 1.2.
0be0: 34 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20  4 {.    code1 { 
0bf0: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
0c00: 5f 65 72 72 63 6f 64 65 20 64 62 20 7d 20 0a 20  _errcode db } . 
0c10: 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a   } {SQLITE_OK}..
0c20: 20 20 64 6f 5f 74 65 73 74 20 31 2e 32 2e 35 20    do_test 1.2.5 
0c30: 7b 0a 20 20 20 20 66 69 6c 65 20 61 74 74 72 69  {.    file attri
0c40: 62 75 74 65 73 20 74 65 73 74 2e 64 62 2d 73 68  butes test.db-sh
0c50: 6d 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72  m -permissions r
0c60: 77 2d 72 2d 2d 72 2d 2d 0a 20 20 20 20 63 6f 64  w-r--r--.    cod
0c70: 65 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62 32  e2 { sqlite3 db2
0c80: 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 73   test.db }.    s
0c90: 71 6c 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52  ql2 "SELECT * FR
0ca0: 4f 4d 20 74 31 22 20 0a 20 20 7d 20 7b 61 20 62  OM t1" .  } {a b
0cb0: 20 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a   c d e f g h i j
0cc0: 7d 0a 20 20 66 69 6c 65 20 61 74 74 72 69 62 75  }.  file attribu
0cd0: 74 65 73 20 74 65 73 74 2e 64 62 2d 73 68 6d 20  tes test.db-shm 
0ce0: 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 72 2d 2d  -permissions r--
0cf0: 72 2d 2d 72 2d 2d 0a 20 20 64 6f 5f 74 65 73 74  r--r--.  do_test
0d00: 20 31 2e 32 2e 36 20 7b 20 73 71 6c 31 20 22 53   1.2.6 { sql1 "S
0d10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
0d20: 20 7d 20 7b 61 20 62 20 63 20 64 20 65 20 66 20   } {a b c d e f 
0d30: 67 20 68 20 69 20 6a 7d 0a 0a 20 20 64 6f 5f 74  g h i j}..  do_t
0d40: 65 73 74 20 31 2e 32 2e 37 20 7b 20 0a 20 20 20  est 1.2.7 { .   
0d50: 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 50 52   sql2 {.      PR
0d60: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
0d70: 69 6e 74 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  int;.      INSER
0d80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0d90: 28 27 6b 27 2c 20 27 6c 27 29 3b 0a 20 20 20 20  ('k', 'l');.    
0da0: 7d 0a 20 20 20 20 73 65 74 20 7b 7d 20 7b 7d 0a  }.    set {} {}.
0db0: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
0dc0: 20 31 2e 32 2e 38 20 7b 20 73 71 6c 31 20 22 53   1.2.8 { sql1 "S
0dd0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
0de0: 20 7d 20 7b 61 20 62 20 63 20 64 20 65 20 66 20   } {a b c d e f 
0df0: 67 20 68 20 69 20 6a 20 6b 20 6c 7d 0a 0a 20 20  g h i j k l}..  
0e00: 23 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  # Now check that
0e10: 20 69 66 20 74 68 65 20 72 65 61 64 6f 6e 6c 79   if the readonly
0e20: 5f 73 68 6d 20 6f 70 74 69 6f 6e 20 69 73 20 6e  _shm option is n
0e30: 6f 74 20 73 75 70 70 6c 69 65 64 2c 20 6f 72 20  ot supplied, or 
0e40: 69 66 20 69 74 0a 20 20 23 20 69 73 20 73 65 74  if it.  # is set
0e50: 20 74 6f 20 7a 65 72 6f 2c 20 69 74 20 69 73 20   to zero, it is 
0e60: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0e70: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 64  connect to the d
0e80: 61 74 61 62 61 73 65 20 77 69 74 68 6f 75 74 0a  atabase without.
0e90: 20 20 23 20 72 65 61 64 2d 77 72 69 74 65 20 61    # read-write a
0ea0: 63 63 65 73 73 20 74 6f 20 74 68 65 20 73 68 6d  ccess to the shm
0eb0: 2e 0a 20 20 23 20 0a 20 20 23 20 55 50 44 41 54  ..  # .  # UPDAT
0ec0: 45 3a 20 6f 73 5f 75 6e 69 78 2e 63 20 6e 6f 77  E: os_unix.c now
0ed0: 20 6f 70 65 6e 73 20 74 68 65 20 2a 2d 73 68 6d   opens the *-shm
0ee0: 20 66 69 6c 65 20 69 6e 20 72 65 61 64 6f 6e 6c   file in readonl
0ef0: 79 20 6d 6f 64 65 20 0a 20 20 23 20 61 75 74 6f  y mode .  # auto
0f00: 6d 61 74 69 63 61 6c 6c 79 2e 0a 20 20 23 0a 20  matically..  #. 
0f10: 20 64 6f 5f 74 65 73 74 20 31 2e 33 2e 31 20 7b   do_test 1.3.1 {
0f20: 0a 20 20 20 20 63 6f 64 65 31 20 7b 20 64 62 20  .    code1 { db 
0f30: 63 6c 6f 73 65 20 7d 0a 20 20 20 20 63 6f 64 65  close }.    code
0f40: 31 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74  1 { sqlite3 db t
0f50: 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 63 73 71  est.db }.    csq
0f60: 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l1 { SELECT * FR
0f70: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b  OM t1 }.  } {0 {
0f80: 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68 20  a b c d e f g h 
0f90: 69 20 6a 20 6b 20 6c 7d 7d 0a 0a 20 20 23 20 41  i j k l}}..  # A
0fa0: 6c 73 6f 20 74 65 73 74 20 74 68 61 74 20 69 66  lso test that if
0fb0: 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20 63   the -shm file c
0fc0: 61 6e 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72  an be opened for
0fd0: 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
0fe0: 73 73 2c 0a 20 20 23 20 69 74 20 69 73 20 6e 6f  ss,.  # it is no
0ff0: 74 20 69 66 20 72 65 61 64 6f 6e 6c 79 5f 73 68  t if readonly_sh
1000: 6d 3d 31 20 69 73 20 70 72 65 73 65 6e 74 20 69  m=1 is present i
1010: 6e 20 74 68 65 20 55 52 49 2e 0a 20 20 64 6f 5f  n the URI..  do_
1020: 74 65 73 74 20 31 2e 33 2e 32 2e 31 20 7b 0a 20  test 1.3.2.1 {. 
1030: 20 20 20 63 6f 64 65 31 20 7b 20 64 62 20 63 6c     code1 { db cl
1040: 6f 73 65 20 7d 0a 20 20 20 20 63 6f 64 65 32 20  ose }.    code2 
1050: 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20  { db2 close }.  
1060: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
1070: 73 74 2e 64 62 2d 73 68 6d 0a 20 20 7d 20 7b 30  st.db-shm.  } {0
1080: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 33 2e  }.  do_test 1.3.
1090: 32 2e 32 20 7b 0a 20 20 20 20 63 6f 64 65 31 20  2.2 {.    code1 
10a0: 7b 20 73 71 6c 69 74 65 33 20 64 62 20 66 69 6c  { sqlite3 db fil
10b0: 65 3a 74 65 73 74 2e 64 62 3f 72 65 61 64 6f 6e  e:test.db?readon
10c0: 6c 79 5f 73 68 6d 3d 31 20 7d 0a 20 20 20 20 63  ly_shm=1 }.    c
10d0: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  sql1 { SELECT * 
10e0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
10f0: 65 72 20 7d 0a 20 20 7d 20 7b 31 20 7b 75 6e 61  er }.  } {1 {una
1100: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
1110: 62 61 73 65 20 66 69 6c 65 7d 7d 0a 20 20 64 6f  base file}}.  do
1120: 5f 74 65 73 74 20 31 2e 33 2e 32 2e 33 20 7b 0a  _test 1.3.2.3 {.
1130: 20 20 20 20 63 6f 64 65 31 20 7b 20 64 62 20 63      code1 { db c
1140: 6c 6f 73 65 20 7d 0a 20 20 20 20 63 6c 6f 73 65  lose }.    close
1150: 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 73   [open test.db-s
1160: 68 6d 20 77 5d 0a 20 20 20 20 66 69 6c 65 20 61  hm w].    file a
1170: 74 74 72 69 62 75 74 65 73 20 74 65 73 74 2e 64  ttributes test.d
1180: 62 2d 73 68 6d 20 2d 70 65 72 6d 69 73 73 69 6f  b-shm -permissio
1190: 6e 73 20 72 2d 2d 72 2d 2d 72 2d 2d 0a 20 20 20  ns r--r--r--.   
11a0: 20 63 6f 64 65 31 20 7b 20 73 71 6c 69 74 65 33   code1 { sqlite3
11b0: 20 64 62 20 66 69 6c 65 3a 74 65 73 74 2e 64 62   db file:test.db
11c0: 3f 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20  ?readonly_shm=1 
11d0: 7d 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 53 45  }.    csql1 { SE
11e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
11f0: 0a 20 20 7d 20 7b 30 20 7b 61 20 62 20 63 20 64  .  } {0 {a b c d
1200: 20 65 20 66 20 67 20 68 20 69 20 6a 20 6b 20 6c   e f g h i j k l
1210: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 33  }}.  do_test 1.3
1220: 2e 32 2e 34 20 7b 0a 20 20 20 20 63 6f 64 65 31  .2.4 {.    code1
1230: 20 7b 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e   { sqlite3_exten
1240: 64 65 64 5f 65 72 72 63 6f 64 65 20 64 62 20 7d  ded_errcode db }
1250: 20 0a 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   .  } {SQLITE_OK
1260: 7d 0a 0a 20 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..  #----------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
12b0: 23 20 54 65 73 74 20 63 61 73 65 73 20 31 2e 34  # Test cases 1.4
12c0: 2e 2a 20 63 68 65 63 6b 20 74 68 61 74 20 63 68  .* check that ch
12d0: 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20 6c 6f  eckpoints and lo
12e0: 67 20 77 72 61 70 73 20 64 6f 6e 27 74 20 70 72  g wraps don't pr
12f0: 65 76 65 6e 74 0a 20 20 23 20 72 65 61 64 2d 6f  event.  # read-o
1300: 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  nly connections 
1310: 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 74 68 65  from reading the
1320: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 64 6f 5f   database..  do_
1330: 74 65 73 74 20 31 2e 34 2e 31 20 7b 0a 20 20 20  test 1.4.1 {.   
1340: 20 63 6f 64 65 31 20 7b 20 64 62 20 63 6c 6f 73   code1 { db clos
1350: 65 20 7d 0a 20 20 20 20 66 6f 72 63 65 64 65 6c  e }.    forcedel
1360: 65 74 65 20 74 65 73 74 2e 64 62 2d 73 68 6d 0a  ete test.db-shm.
1370: 20 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 20      file exists 
1380: 74 65 73 74 2e 64 62 2d 73 68 6d 0a 20 20 7d 20  test.db-shm.  } 
1390: 7b 30 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 6f 6e  {0}..  # Open on
13a0: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  e read-only and 
13b0: 6f 6e 65 20 72 65 61 64 2d 77 72 69 74 65 20 63  one read-write c
13c0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 57 72 69 74 65  onnection. Write
13d0: 20 73 6f 6d 65 20 64 61 74 61 0a 20 20 23 20 61   some data.  # a
13e0: 6e 64 20 74 68 65 6e 20 72 75 6e 20 61 20 63 68  nd then run a ch
13f0: 65 63 6b 70 6f 69 6e 74 20 75 73 69 6e 67 20 74  eckpoint using t
1400: 68 65 20 72 65 61 64 2d 77 72 69 74 65 20 63 6f  he read-write co
1410: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 6e 0a 20  nnection. Then. 
1420: 20 23 20 63 68 65 63 6b 20 74 68 65 20 72 65 61   # check the rea
1430: 64 2d 6f 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f  d-only connectio
1440: 6e 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64  n can still read
1450: 2e 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 34 2e  ..  do_test 1.4.
1460: 32 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20  2 {.    code1 { 
1470: 73 71 6c 69 74 65 33 20 64 62 20 66 69 6c 65 3a  sqlite3 db file:
1480: 74 65 73 74 2e 64 62 3f 72 65 61 64 6f 6e 6c 79  test.db?readonly
1490: 5f 73 68 6d 3d 31 20 7d 0a 20 20 20 20 63 6f 64  _shm=1 }.    cod
14a0: 65 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62 32  e2 { sqlite3 db2
14b0: 20 74 65 73 74 2e 64 62 20 7d 0a 20 20 20 20 63   test.db }.    c
14c0: 73 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 49 4e  sql2 { .      IN
14d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
14e0: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20  UES(1, 2);.     
14f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1500: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
1510: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1520: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
1530: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 77 61  .      PRAGMA wa
1540: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
1550: 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 33 20    }.  } {0 {0 3 
1560: 33 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e  3}}.  do_test 1.
1570: 34 2e 33 20 7b 0a 20 20 20 20 63 73 71 6c 31 20  4.3 {.    csql1 
1580: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1590: 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 61 20 62  t1 }.  } {0 {a b
15a0: 20 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a   c d e f g h i j
15b0: 20 6b 20 6c 20 31 20 32 20 33 20 34 20 35 20 36   k l 1 2 3 4 5 6
15c0: 7d 7d 0a 20 20 0a 20 20 23 20 55 73 69 6e 67 20  }}.  .  # Using 
15d0: 74 68 65 20 72 65 61 64 2d 77 72 69 74 65 20 63  the read-write c
15e0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 6f 70 65 6e 20  onnection, open 
15f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
1600: 64 20 77 72 69 74 65 20 6c 6f 74 73 0a 20 20 23  d write lots.  #
1610: 20 6f 66 20 64 61 74 61 20 2d 20 63 61 75 73 69   of data - causi
1620: 6e 67 20 61 20 63 61 63 68 65 20 73 70 69 6c 6c  ng a cache spill
1630: 20 61 6e 64 20 61 20 6c 6f 67 20 77 72 61 70 2e   and a log wrap.
1640: 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74   Then check that
1650: 20 74 68 65 20 0a 20 20 23 20 72 65 61 64 2d 6f   the .  # read-o
1660: 6e 6c 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  nly connection c
1670: 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 74 68  an still read th
1680: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 64 6f  e database..  do
1690: 5f 74 65 73 74 20 31 2e 34 2e 34 2e 31 20 7b 0a  _test 1.4.4.1 {.
16a0: 20 20 20 20 63 73 71 6c 32 20 7b 0a 20 20 20 20      csql2 {.    
16b0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
16c0: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 20 20  ize = 10;.      
16d0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45  BEGIN;.      CRE
16e0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20  ATE TABLE t2(x, 
16f0: 79 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  y);.      INSERT
1700: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1710: 27 61 62 63 27 2c 20 27 78 79 7a 27 29 3b 0a 20  'abc', 'xyz');. 
1720: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1730: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
1740: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
1750: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1760: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
1770: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
1780: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1790: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
17a0: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
17b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
17c0: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
17d0: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
17e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
17f0: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
1800: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
1810: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1820: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
1830: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
1840: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1850: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
1860: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
1870: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1880: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
1890: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
18a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
18b0: 20 74 32 20 53 45 4c 45 43 54 20 78 7c 7c 79 2c   t2 SELECT x||y,
18c0: 20 79 7c 7c 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y||x FROM t2;. 
18d0: 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69     }.    file si
18e0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  ze test.db-wal. 
18f0: 20 7d 20 5b 65 78 70 72 20 7b 5b 6e 6f 6e 7a 65   } [expr {[nonze
1900: 72 6f 5f 72 65 73 65 72 76 65 64 5f 62 79 74 65  ro_reserved_byte
1910: 73 5d 3f 31 34 38 38 34 38 3a 31 34 37 38 30 30  s]?148848:147800
1920: 7d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 34  }].  do_test 1.4
1930: 2e 34 2e 32 20 7b 0a 20 20 20 20 63 73 71 6c 31  .4.2 {.    csql1
1940: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1950: 20 74 31 20 7d 0a 20 20 7d 20 7b 30 20 7b 61 20   t1 }.  } {0 {a 
1960: 62 20 63 20 64 20 65 20 66 20 67 20 68 20 69 20  b c d e f g h i 
1970: 6a 20 6b 20 6c 20 31 20 32 20 33 20 34 20 35 20  j k l 1 2 3 4 5 
1980: 36 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e  6}}.  do_test 1.
1990: 34 2e 34 2e 33 20 7b 0a 20 20 20 20 63 73 71 6c  4.4.3 {.    csql
19a0: 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20 63 73 71  2 COMMIT.    csq
19b0: 6c 31 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  l1 { SELECT coun
19c0: 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d 0a 20  t(*) FROM t2 }. 
19d0: 20 7d 20 7b 30 20 35 31 32 7d 0a 20 20 64 6f 5f   } {0 512}.  do_
19e0: 74 65 73 74 20 31 2e 34 2e 35 20 7b 0a 20 20 20  test 1.4.5 {.   
19f0: 20 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f   code2 { db2 clo
1a00: 73 65 20 7d 0a 20 20 20 20 63 6f 64 65 31 20 7b  se }.    code1 {
1a10: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 7d 20   db close }.  } 
1a20: 7b 7d 0a 7d 0a 0a 66 6f 72 63 65 64 65 6c 65 74  {}.}..forcedelet
1a30: 65 20 74 65 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d  e test.db..#----
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73  ---.# Test cases
1a90: 20 32 2e 2a 20 63 68 65 63 6b 20 74 68 61 74 20   2.* check that 
1aa0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 6f 6e 6e  a read-only conn
1ab0: 65 63 74 69 6f 6e 20 6d 61 79 20 72 65 61 64 20  ection may read 
1ac0: 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 20 66  the.# database f
1ad0: 69 6c 65 20 77 68 69 6c 65 20 61 20 63 68 65 63  ile while a chec
1ae0: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
1af0: 20 69 73 20 6f 6e 67 6f 69 6e 67 2e 0a 23 0a 64   is ongoing..#.d
1b00: 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65  o_multiclient_te
1b10: 73 74 20 74 6e 20 7b 0a 20 20 0a 20 20 23 20 43  st tn {.  .  # C
1b20: 6c 6f 73 65 20 61 6c 6c 20 63 6f 6e 6e 65 63 74  lose all connect
1b30: 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 65 20  ions and delete 
1b40: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1b50: 23 0a 20 20 63 6f 64 65 31 20 7b 20 64 62 20 63  #.  code1 { db c
1b60: 6c 6f 73 65 20 20 7d 0a 20 20 63 6f 64 65 32 20  lose  }.  code2 
1b70: 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20  { db2 close }.  
1b80: 63 6f 64 65 33 20 7b 20 64 62 33 20 63 6c 6f 73  code3 { db3 clos
1b90: 65 20 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  e }.  forcedelet
1ba0: 65 20 74 65 73 74 2e 64 62 0a 20 20 66 6f 72 63  e test.db.  forc
1bb0: 65 64 65 6c 65 74 65 20 77 61 6c 72 6f 0a 20 20  edelete walro.  
1bc0: 0a 20 20 23 20 44 6f 20 6e 6f 74 20 72 75 6e 20  .  # Do not run 
1bd0: 74 65 73 74 73 20 77 69 74 68 20 74 68 65 20 63  tests with the c
1be0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74 68  onnections in th
1bf0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
1c00: 20 20 23 0a 20 20 69 66 20 7b 24 74 6e 3d 3d 32    #.  if {$tn==2
1c10: 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 20 20 66 6f  } continue..  fo
1c20: 72 65 61 63 68 20 63 20 7b 63 6f 64 65 31 20 63  reach c {code1 c
1c30: 6f 64 65 32 20 63 6f 64 65 33 7d 20 7b 0a 20 20  ode2 code3} {.  
1c40: 20 20 24 63 20 7b 0a 20 20 20 20 20 20 73 71 6c    $c {.      sql
1c50: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20  ite3_shutdown.  
1c60: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66      sqlite3_conf
1c70: 69 67 5f 75 72 69 20 31 0a 20 20 20 20 7d 0a 20  ig_uri 1.    }. 
1c80: 20 7d 0a 20 20 0a 20 20 70 72 6f 63 20 74 76 5f   }.  .  proc tv_
1c90: 68 6f 6f 6b 20 7b 78 20 66 69 6c 65 20 61 72 67  hook {x file arg
1ca0: 73 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 66 69  s} {.    if {[fi
1cb0: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 5d 3d 3d  le tail $file]==
1cc0: 22 74 65 73 74 2e 64 62 2d 77 61 6c 22 7d 20 7b  "test.db-wal"} {
1cd0: 0a 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20 32  .      do_test 2
1ce0: 2e 31 2e 32 20 7b 0a 20 20 20 20 20 20 20 20 63  .1.2 {.        c
1cf0: 6f 64 65 32 20 7b 20 73 71 6c 69 74 65 33 20 64  ode2 { sqlite3 d
1d00: 62 32 20 66 69 6c 65 3a 74 65 73 74 2e 64 62 3f  b2 file:test.db?
1d10: 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20 7d  readonly_shm=1 }
1d20: 0a 20 20 20 20 20 20 20 20 63 73 71 6c 32 20 7b  .        csql2 {
1d30: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1d40: 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20 20 20 20   FROM t2 }.     
1d50: 20 7d 20 7b 30 20 34 7d 0a 20 20 20 20 20 20 64   } {0 4}.      d
1d60: 6f 5f 74 65 73 74 20 32 2e 31 2e 33 20 7b 0a 20  o_test 2.1.3 {. 
1d70: 20 20 20 20 20 20 20 63 6f 64 65 32 20 7b 20 64         code2 { d
1d80: 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 20 20 20  b2 close }.     
1d90: 20 7d 20 7b 7d 0a 20 20 20 20 7d 20 0a 20 20 7d   } {}.    } .  }
1da0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 31 2e  ..  do_test 2.1.
1db0: 31 20 7b 0a 20 20 20 20 74 65 73 74 76 66 73 20  1 {.    testvfs 
1dc0: 74 76 20 2d 64 65 66 61 75 6c 74 20 31 20 2d 66  tv -default 1 -f
1dd0: 75 6c 6c 73 68 6d 20 31 0a 20 20 20 20 74 76 20  ullshm 1.    tv 
1de0: 73 63 72 69 70 74 20 74 76 5f 68 6f 6f 6b 0a 20  script tv_hook. 
1df0: 20 20 20 74 76 20 66 69 6c 74 65 72 20 7b 7d 0a     tv filter {}.
1e00: 20 20 20 20 63 6f 64 65 31 20 7b 20 73 71 6c 69      code1 { sqli
1e10: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d  te3 db test.db }
1e20: 0a 20 20 20 20 63 73 71 6c 31 20 7b 20 0a 20 20  .    csql1 { .  
1e30: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
1e40: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
1e50: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
1e60: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
1e70: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
1e80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1e90: 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 20 20 20  2(x, y);.       
1ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1eb0: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 78  VALUES('abc', 'x
1ec0: 79 7a 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  yz');.        IN
1ed0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
1ee0: 45 43 54 20 78 7c 7c 79 2c 20 79 7c 7c 78 20 46  ECT x||y, y||x F
1ef0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 20 20  ROM t2;.        
1f00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
1f10: 45 4c 45 43 54 20 78 7c 7c 79 2c 20 79 7c 7c 78  ELECT x||y, y||x
1f20: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20   FROM t2;.      
1f30: 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20  COMMIT;.    }.  
1f40: 7d 20 7b 30 20 77 61 6c 7d 0a 0a 20 20 74 76 20  } {0 wal}..  tv 
1f50: 66 69 6c 74 65 72 20 78 53 79 6e 63 0a 20 20 73  filter xSync.  s
1f60: 65 74 20 72 65 73 20 5b 63 73 71 6c 31 20 7b 20  et res [csql1 { 
1f70: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
1f80: 70 6f 69 6e 74 20 7d 5d 0a 20 20 64 6f 5f 74 65  point }].  do_te
1f90: 73 74 20 32 2e 31 2e 34 20 7b 20 73 65 74 20 72  st 2.1.4 { set r
1fa0: 65 73 20 7d 20 7b 30 20 7b 30 20 32 20 32 7d 7d  es } {0 {0 2 2}}
1fb0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 31 2e  ..  do_test 2.1.
1fc0: 35 20 7b 0a 20 20 20 20 63 6f 64 65 31 20 7b 20  5 {.    code1 { 
1fd0: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 20 20 63  db close }.    c
1fe0: 6f 64 65 31 20 7b 20 74 76 20 64 65 6c 65 74 65  ode1 { tv delete
1ff0: 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 66 69 6e   }.  } {}.}..fin
2000: 69 73 68 5f 74 65 73 74 0a                       ish_test.