/ Hex Artifact Content
Login

Artifact 85a4be2b23e7294d468b6e3a578ec00020723bee:


0000: 23 20 32 30 31 30 20 4f 63 74 6f 62 65 72 20 32  # 2010 October 2
0010: 39 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  9.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74  *******.#..set t
0170: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0180: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0190: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01a0: 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24  ter.tcl.source $
01b0: 74 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63  testdir/malloc_c
01c0: 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 23 20 41 46 50  ommon.tcl..# AFP
01d0: 20 64 6f 65 73 6e 27 74 20 6c 69 6b 65 20 6d 75   doesn't like mu
01e0: 6c 74 69 70 6c 65 78 20 64 62 20 74 65 73 74 73  ltiplex db tests
01f0: 0a 69 66 20 7b 20 21 5b 70 61 74 68 5f 69 73 5f  .if { ![path_is_
0200: 6c 6f 63 61 6c 20 22 2e 22 5d 20 7d 20 7b 0a 20  local "."] } {. 
0210: 20 66 69 6e 69 73 68 5f 74 65 73 74 20 0a 20 20   finish_test .  
0220: 72 65 74 75 72 6e 20 0a 7d 0a 0a 23 20 54 68 65  return .}..# The
0230: 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
0240: 69 6c 65 20 61 73 73 75 6d 65 20 74 68 61 74 20  ile assume that 
0250: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
0260: 65 64 20 77 69 74 68 6f 75 74 0a 23 20 45 4e 41  ed without.# ENA
0270: 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 2e 0a 23  BLE_8_3_NAMES..#
0280: 0a 69 66 63 61 70 61 62 6c 65 20 38 5f 33 5f 6e  .ifcapable 8_3_n
0290: 61 6d 65 73 20 7b 0a 20 20 70 75 74 73 20 2d 6e  ames {.  puts -n
02a0: 6f 6e 65 77 6c 69 6e 65 20 22 53 51 4c 69 74 65  onewline "SQLite
02b0: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
02c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
02d0: 5f 4e 41 4d 45 53 2e 20 22 0a 20 20 70 75 74 73  _NAMES. ".  puts
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69              "Ski
02f0: 70 70 69 6e 67 20 74 65 73 74 73 20 6d 75 6c 74  pping tests mult
0300: 69 70 6c 65 78 2d 2a 2e 22 0a 20 20 66 69 6e 69  iplex-*.".  fini
0310: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
0320: 0a 7d 0a 0a 73 65 74 20 67 5f 63 68 75 6e 6b 5f  .}..set g_chunk_
0330: 73 69 7a 65 20 5b 20 65 78 70 72 20 28 24 3a 3a  size [ expr ($::
0340: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
0350: 53 49 5a 45 2a 31 36 33 38 34 29 20 5d 0a 73 65  SIZE*16384) ].se
0360: 74 20 67 5f 6d 61 78 5f 63 68 75 6e 6b 73 20 33  t g_max_chunks 3
0370: 32 0a 0a 23 20 54 68 69 73 20 68 61 6e 64 6c 65  2..# This handle
0380: 73 20 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20  s appending the 
0390: 63 68 75 6e 6b 20 6e 75 6d 62 65 72 0a 23 20 74  chunk number.# t
03a0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
03b0: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 69 66 20 0a   filename.  if .
03c0: 23 20 53 51 4c 49 54 45 5f 4d 55 4c 54 49 50 4c  # SQLITE_MULTIPL
03d0: 45 58 5f 45 58 54 5f 4f 56 57 52 20 69 73 20 64  EX_EXT_OVWR is d
03e0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 0a 23 20 69  efined, then.# i
03f0: 74 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  t overwrites the
0400: 20 6c 61 73 74 20 32 20 62 79 74 65 73 20 6f 66   last 2 bytes of
0410: 20 74 68 65 20 0a 23 20 66 69 6c 65 20 6e 61 6d   the .# file nam
0420: 65 20 77 69 74 68 20 74 68 65 20 63 68 75 6e 6b  e with the chunk
0430: 20 6e 75 6d 62 65 72 2e 0a 70 72 6f 63 20 6d 75   number..proc mu
0440: 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20 7b 6e 61  ltiplex_name {na
0450: 6d 65 20 63 68 75 6e 6b 7d 20 7b 0a 20 20 69 66  me chunk} {.  if
0460: 20 7b 24 63 68 75 6e 6b 3d 3d 30 7d 20 7b 20 72   {$chunk==0} { r
0470: 65 74 75 72 6e 20 24 6e 61 6d 65 20 7d 0a 20 20  eturn $name }.  
0480: 73 65 74 20 6e 75 6d 20 5b 66 6f 72 6d 61 74 20  set num [format 
0490: 22 25 30 33 64 22 20 24 63 68 75 6e 6b 5d 0a 20  "%03d" $chunk]. 
04a0: 20 69 66 63 61 70 61 62 6c 65 20 7b 6d 75 6c 74   ifcapable {mult
04b0: 69 70 6c 65 78 5f 65 78 74 5f 6f 76 65 72 77 72  iplex_ext_overwr
04c0: 69 74 65 7d 20 7b 0a 20 20 20 20 73 65 74 20 6e  ite} {.    set n
04d0: 61 6d 65 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  ame [string rang
04e0: 65 20 24 6e 61 6d 65 20 30 20 5b 65 78 70 72 20  e $name 0 [expr 
04f0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0500: 6e 61 6d 65 5d 2d 32 2d 31 5d 5d 0a 20 20 7d 0a  name]-2-1]].  }.
0510: 20 20 72 65 74 75 72 6e 20 24 6e 61 6d 65 24 6e    return $name$n
0520: 75 6d 0a 7d 0a 0a 23 20 54 68 69 73 20 73 61 76  um.}..# This sav
0530: 65 73 20 6f 66 66 20 74 68 65 20 70 61 72 61 6d  es off the param
0540: 65 74 65 72 73 20 61 6e 64 20 63 61 6c 6c 73 20  eters and calls 
0550: 74 68 65 20 0a 23 20 75 6e 64 65 72 6c 79 69 6e  the .# underlyin
0560: 67 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70  g sqlite3_multip
0570: 6c 65 78 5f 63 6f 6e 74 72 6f 6c 28 29 20 41 50  lex_control() AP
0580: 49 2e 0a 70 72 6f 63 20 6d 75 6c 74 69 70 6c 65  I..proc multiple
0590: 78 5f 73 65 74 20 7b 64 62 20 6e 61 6d 65 20 63  x_set {db name c
05a0: 68 75 6e 6b 5f 73 69 7a 65 20 6d 61 78 5f 63 68  hunk_size max_ch
05b0: 75 6e 6b 73 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  unks} {.  global
05c0: 20 67 5f 63 68 75 6e 6b 5f 73 69 7a 65 0a 20 20   g_chunk_size.  
05d0: 67 6c 6f 62 61 6c 20 67 5f 6d 61 78 5f 63 68 75  global g_max_chu
05e0: 6e 6b 73 0a 20 20 73 65 74 20 67 5f 63 68 75 6e  nks.  set g_chun
05f0: 6b 5f 73 69 7a 65 20 5b 20 65 78 70 72 20 28 28  k_size [ expr ((
0600: 24 63 68 75 6e 6b 5f 73 69 7a 65 2b 28 24 3a 3a  $chunk_size+($::
0610: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
0620: 53 49 5a 45 2d 31 29 29 20 26 20 7e 28 24 3a 3a  SIZE-1)) & ~($::
0630: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
0640: 53 49 5a 45 2d 31 29 29 20 5d 0a 20 20 73 65 74  SIZE-1)) ].  set
0650: 20 67 5f 6d 61 78 5f 63 68 75 6e 6b 73 20 24 6d   g_max_chunks $m
0660: 61 78 5f 63 68 75 6e 6b 73 0a 20 20 73 65 74 20  ax_chunks.  set 
0670: 72 63 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74  rc [catch {sqlit
0680: 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e  e3_multiplex_con
0690: 74 72 6f 6c 20 24 64 62 20 24 6e 61 6d 65 20 63  trol $db $name c
06a0: 68 75 6e 6b 5f 73 69 7a 65 20 24 63 68 75 6e 6b  hunk_size $chunk
06b0: 5f 73 69 7a 65 7d 20 6d 73 67 5d 0a 20 20 69 66  _size} msg].  if
06c0: 20 7b 20 24 72 63 3d 3d 30 20 7d 20 7b 20 0a 20   { $rc==0 } { . 
06d0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
06e0: 20 7b 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70   {sqlite3_multip
06f0: 6c 65 78 5f 63 6f 6e 74 72 6f 6c 20 24 64 62 20  lex_control $db 
0700: 24 6e 61 6d 65 20 6d 61 78 5f 63 68 75 6e 6b 73  $name max_chunks
0710: 20 24 6d 61 78 5f 63 68 75 6e 6b 73 7d 20 6d 73   $max_chunks} ms
0720: 67 5d 0a 20 20 7d 0a 20 20 6c 69 73 74 20 24 6d  g].  }.  list $m
0730: 73 67 0a 7d 0a 0a 23 20 54 68 69 73 20 61 74 74  sg.}..# This att
0740: 65 6d 70 74 73 20 74 6f 20 64 65 6c 65 74 65 20  empts to delete 
0750: 74 68 65 20 62 61 73 65 20 66 69 6c 65 20 61 6e  the base file an
0760: 64 20 0a 23 20 61 6e 64 20 66 69 6c 65 73 20 77  d .# and files w
0770: 69 74 68 20 74 68 65 20 63 68 75 6e 6b 20 65 78  ith the chunk ex
0780: 74 65 6e 73 69 6f 6e 2e 0a 70 72 6f 63 20 6d 75  tension..proc mu
0790: 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 7b  ltiplex_delete {
07a0: 6e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  name} {.  global
07b0: 20 67 5f 6d 61 78 5f 63 68 75 6e 6b 73 0a 20 20   g_max_chunks.  
07c0: 66 6f 72 63 65 64 65 6c 65 74 65 20 24 6e 61 6d  forcedelete $nam
07d0: 65 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  e.  for {set i 0
07e0: 7d 20 7b 24 69 3c 24 67 5f 6d 61 78 5f 63 68 75  } {$i<$g_max_chu
07f0: 6e 6b 73 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  nks} {incr i} {.
0800: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
0810: 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20  [multiplex_name 
0820: 24 6e 61 6d 65 20 24 69 5d 0a 20 20 20 20 66 6f  $name $i].    fo
0830: 72 63 65 64 65 6c 65 74 65 20 5b 6d 75 6c 74 69  rcedelete [multi
0840: 70 6c 65 78 5f 6e 61 6d 65 20 24 6e 61 6d 65 2d  plex_name $name-
0850: 6a 6f 75 72 6e 61 6c 20 24 69 5d 0a 20 20 20 20  journal $i].    
0860: 66 6f 72 63 65 64 65 6c 65 74 65 20 5b 6d 75 6c  forcedelete [mul
0870: 74 69 70 6c 65 78 5f 6e 61 6d 65 20 24 6e 61 6d  tiplex_name $nam
0880: 65 2d 77 61 6c 20 24 69 5d 0a 20 20 7d 0a 7d 0a  e-wal $i].  }.}.
0890: 0a 64 62 20 63 6c 6f 73 65 0a 0a 6d 75 6c 74 69  .db close..multi
08a0: 70 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74  plex_delete test
08b0: 2e 64 62 0a 6d 75 6c 74 69 70 6c 65 78 5f 64 65  .db.multiplex_de
08c0: 6c 65 74 65 20 74 65 73 74 32 2e 64 62 0a 0a 23  lete test2.db..#
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 20 6d 75  ---------.#   mu
0920: 6c 74 69 70 6c 65 78 2d 31 2e 31 2e 2a 3a 20 54  ltiplex-1.1.*: T
0930: 65 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  est initialize a
0940: 6e 64 20 73 68 75 74 64 6f 77 6e 2e 0a 0a 64 6f  nd shutdown...do
0950: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
0960: 31 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75  1.1 { sqlite3_mu
0970: 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69  ltiplex_initiali
0980: 7a 65 20 6e 6f 73 75 63 68 76 66 73 20 31 20 7d  ze nosuchvfs 1 }
0990: 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a   {SQLITE_ERROR}.
09a0: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
09b0: 78 2d 31 2e 32 20 7b 20 73 71 6c 69 74 65 33 5f  x-1.2 { sqlite3_
09c0: 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61  multiplex_initia
09d0: 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20 20 20  lize "" 1 }     
09e0: 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64     {SQLITE_OK}.d
09f0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
0a00: 2d 31 2e 33 20 7b 20 73 71 6c 69 74 65 33 5f 6d  -1.3 { sqlite3_m
0a10: 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c  ultiplex_initial
0a20: 69 7a 65 20 22 22 20 31 20 7d 20 20 20 20 20 20  ize "" 1 }      
0a30: 20 20 7b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45    {SQLITE_MISUSE
0a40: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
0a50: 6c 65 78 2d 31 2e 34 20 7b 20 73 71 6c 69 74 65  lex-1.4 { sqlite
0a60: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74  3_multiplex_shut
0a70: 64 6f 77 6e 20 7d 20 20 20 20 20 20 20 20 20 20  down }          
0a80: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
0a90: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  ..do_test multip
0aa0: 6c 65 78 2d 31 2e 35 20 7b 20 73 71 6c 69 74 65  lex-1.5 { sqlite
0ab0: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74  3_multiplex_init
0ac0: 69 61 6c 69 7a 65 20 22 22 20 30 20 7d 20 20 20  ialize "" 0 }   
0ad0: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
0ae0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
0af0: 65 78 2d 31 2e 36 20 7b 20 73 71 6c 69 74 65 33  ex-1.6 { sqlite3
0b00: 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64  _multiplex_shutd
0b10: 6f 77 6e 20 7d 20 20 20 20 20 20 20 20 20 20 20  own }           
0b20: 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a      {SQLITE_OK}.
0b30: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
0b40: 78 2d 31 2e 37 20 7b 20 73 71 6c 69 74 65 33 5f  x-1.7 { sqlite3_
0b50: 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61  multiplex_initia
0b60: 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20 20 20  lize "" 1 }     
0b70: 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64     {SQLITE_OK}.d
0b80: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
0b90: 2d 31 2e 38 20 7b 20 73 71 6c 69 74 65 33 5f 6d  -1.8 { sqlite3_m
0ba0: 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77  ultiplex_shutdow
0bb0: 6e 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  n }             
0bc0: 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 0a    {SQLITE_OK}...
0bd0: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
0be0: 78 2d 31 2e 39 2e 31 20 20 7b 20 73 71 6c 69 74  x-1.9.1  { sqlit
0bf0: 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69  e3_multiplex_ini
0c00: 74 69 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20  tialize "" 1 }  
0c10: 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64     {SQLITE_OK}.d
0c20: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
0c30: 2d 31 2e 39 2e 32 20 20 7b 20 73 71 6c 69 74 65  -1.9.2  { sqlite
0c40: 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20 20  3 db test.db }  
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c    {}.do_test mul
0c70: 74 69 70 6c 65 78 2d 31 2e 39 2e 33 20 20 7b 20  tiplex-1.9.3  { 
0c80: 6d 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62  multiplex_set db
0c90: 20 6d 61 69 6e 20 33 32 37 36 38 20 31 36 20 7d   main 32768 16 }
0ca0: 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f          {SQLITE_
0cb0: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  OK}.do_test mult
0cc0: 69 70 6c 65 78 2d 31 2e 39 2e 34 20 20 7b 20 6d  iplex-1.9.4  { m
0cd0: 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62 20  ultiplex_set db 
0ce0: 6d 61 69 6e 20 33 32 37 36 38 20 2d 31 20 7d 20  main 32768 -1 } 
0cf0: 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f         {SQLITE_O
0d00: 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  K}.do_test multi
0d10: 70 6c 65 78 2d 31 2e 39 2e 36 20 20 7b 20 6d 75  plex-1.9.6  { mu
0d20: 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62 20 6d  ltiplex_set db m
0d30: 61 69 6e 20 33 31 20 31 36 20 7d 20 20 20 20 20  ain 31 16 }     
0d40: 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b        {SQLITE_OK
0d50: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
0d60: 6c 65 78 2d 31 2e 39 2e 37 20 20 7b 20 6d 75 6c  lex-1.9.7  { mul
0d70: 74 69 70 6c 65 78 5f 73 65 74 20 64 62 20 6d 61  tiplex_set db ma
0d80: 69 6e 20 33 32 37 36 38 20 31 30 30 20 7d 20 20  in 32768 100 }  
0d90: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
0da0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
0db0: 65 78 2d 31 2e 39 2e 38 20 20 7b 20 6d 75 6c 74  ex-1.9.8  { mult
0dc0: 69 70 6c 65 78 5f 73 65 74 20 64 62 20 6d 61 69  iplex_set db mai
0dd0: 6e 20 31 30 37 33 37 34 31 38 32 34 20 31 20 7d  n 1073741824 1 }
0de0: 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a      {SQLITE_OK}.
0df0: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
0e00: 78 2d 31 2e 39 2e 39 20 20 7b 20 64 62 20 63 6c  x-1.9.9  { db cl
0e10: 6f 73 65 20 7d 20 20 20 20 20 20 20 20 20 20 20  ose }           
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75     {}.do_test mu
0e40: 6c 74 69 70 6c 65 78 2d 31 2e 39 2e 31 30 20 7b  ltiplex-1.9.10 {
0e50: 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c   sqlite3_multipl
0e60: 65 78 5f 73 68 75 74 64 6f 77 6e 20 7d 20 20 20  ex_shutdown }   
0e70: 20 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45           {SQLITE
0e80: 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75  _OK}..do_test mu
0e90: 6c 74 69 70 6c 65 78 2d 31 2e 31 30 2e 31 20 20  ltiplex-1.10.1  
0ea0: 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70  { sqlite3_multip
0eb0: 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22  lex_initialize "
0ec0: 22 20 31 20 7d 20 20 20 20 20 20 20 20 20 20 20  " 1 }           
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f         {SQLITE_O
0ef0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  K}.do_test multi
0f00: 70 6c 65 78 2d 31 2e 31 30 2e 32 20 20 7b 20 73  plex-1.10.2  { s
0f10: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
0f20: 62 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  b }             
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d      {}.do_test m
0f60: 75 6c 74 69 70 6c 65 78 2d 31 2e 31 30 2e 33 20  ultiplex-1.10.3 
0f70: 20 7b 20 6c 69 6e 64 65 78 20 5b 20 63 61 74 63   { lindex [ catc
0f80: 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6d 75  hsql { SELECT mu
0f90: 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c 28  ltiplex_control(
0fa0: 32 2c 20 33 32 37 36 38 29 3b 20 7d 20 5d 20 30  2, 32768); } ] 0
0fb0: 20 7d 20 20 20 20 20 20 7b 30 7d 0a 64 6f 5f 74   }      {0}.do_t
0fc0: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e  est multiplex-1.
0fd0: 31 30 2e 34 20 20 7b 20 6c 69 6e 64 65 78 20 5b  10.4  { lindex [
0fe0: 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45   catchsql { SELE
0ff0: 43 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e  CT multiplex_con
1000: 74 72 6f 6c 28 33 2c 20 2d 31 29 3b 20 7d 20 5d  trol(3, -1); } ]
1010: 20 30 20 7d 20 20 20 20 20 20 20 20 20 7b 30 7d   0 }         {0}
1020: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
1030: 65 78 2d 31 2e 31 30 2e 36 20 20 7b 20 6c 69 6e  ex-1.10.6  { lin
1040: 64 65 78 20 5b 20 63 61 74 63 68 73 71 6c 20 7b  dex [ catchsql {
1050: 20 53 45 4c 45 43 54 20 6d 75 6c 74 69 70 6c 65   SELECT multiple
1060: 78 5f 63 6f 6e 74 72 6f 6c 28 32 2c 20 33 31 29  x_control(2, 31)
1070: 3b 20 7d 20 5d 20 30 20 7d 20 20 20 20 20 20 20  ; } ] 0 }       
1080: 20 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75    {0}.do_test mu
1090: 6c 74 69 70 6c 65 78 2d 31 2e 31 30 2e 37 20 20  ltiplex-1.10.7  
10a0: 7b 20 6c 69 6e 64 65 78 20 5b 20 63 61 74 63 68  { lindex [ catch
10b0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6d 75 6c  sql { SELECT mul
10c0: 74 69 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c 28 33  tiplex_control(3
10d0: 2c 20 31 30 30 29 3b 20 7d 20 5d 20 30 20 7d 20  , 100); } ] 0 } 
10e0: 20 20 20 20 20 20 20 7b 30 7d 0a 64 6f 5f 74 65         {0}.do_te
10f0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31  st multiplex-1.1
1100: 30 2e 38 20 20 7b 20 6c 69 6e 64 65 78 20 5b 20  0.8  { lindex [ 
1110: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
1120: 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74  T multiplex_cont
1130: 72 6f 6c 28 32 2c 20 31 30 37 33 37 34 31 38 32  rol(2, 107374182
1140: 34 29 3b 20 7d 20 5d 20 30 20 7d 20 7b 30 7d 0a  4); } ] 0 } {0}.
1150: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
1160: 78 2d 31 2e 31 30 2e 39 20 20 7b 20 64 62 20 63  x-1.10.9  { db c
1170: 6c 6f 73 65 20 7d 20 20 20 20 20 20 20 20 20 20  lose }          
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74   {}.do_test mult
11c0: 69 70 6c 65 78 2d 31 2e 31 30 2e 31 30 20 7b 20  iplex-1.10.10 { 
11d0: 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65  sqlite3_multiple
11e0: 78 5f 73 68 75 74 64 6f 77 6e 20 7d 20 20 20 20  x_shutdown }    
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
1220: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  ..do_test multip
1230: 6c 65 78 2d 31 2e 31 31 2e 31 20 20 7b 20 73 71  lex-1.11.1  { sq
1240: 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f  lite3_multiplex_
1250: 69 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31 20  initialize "" 1 
1260: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
1270: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74  {SQLITE_OK}.do_t
1280: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e  est multiplex-1.
1290: 31 31 2e 32 20 20 7b 20 73 71 6c 69 74 65 33 20  11.2  { sqlite3 
12a0: 64 62 20 74 65 73 74 2e 64 62 20 7d 20 20 20 20  db test.db }    
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f            {}.do_
12d0: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31  test multiplex-1
12e0: 2e 31 31 2e 33 20 20 7b 20 73 71 6c 69 74 65 33  .11.3  { sqlite3
12f0: 5f 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72  _multiplex_contr
1300: 6f 6c 20 64 62 20 6d 61 69 6e 20 65 6e 61 62 6c  ol db main enabl
1310: 65 20 30 20 20 7d 20 20 20 20 20 7b 53 51 4c 49  e 0  }     {SQLI
1320: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d  TE_OK}.do_test m
1330: 75 6c 74 69 70 6c 65 78 2d 31 2e 31 31 2e 34 20  ultiplex-1.11.4 
1340: 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69   { sqlite3_multi
1350: 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c 20 64 62 20  plex_control db 
1360: 6d 61 69 6e 20 65 6e 61 62 6c 65 20 31 20 20 7d  main enable 1  }
1370: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
1380: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
1390: 65 78 2d 31 2e 31 31 2e 35 20 20 7b 20 73 71 6c  ex-1.11.5  { sql
13a0: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 63  ite3_multiplex_c
13b0: 6f 6e 74 72 6f 6c 20 64 62 20 6d 61 69 6e 20 65  ontrol db main e
13c0: 6e 61 62 6c 65 20 2d 31 20 7d 20 20 20 20 20 7b  nable -1 }     {
13d0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
13e0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31  st multiplex-1.1
13f0: 31 2e 36 20 20 7b 20 64 62 20 63 6c 6f 73 65 20  1.6  { db close 
1400: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f 74           {}.do_t
1430: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e  est multiplex-1.
1440: 31 31 2e 37 20 20 7b 20 73 71 6c 69 74 65 33 5f  11.7  { sqlite3_
1450: 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f  multiplex_shutdo
1460: 77 6e 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  wn }            
1470: 20 20 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54            {SQLIT
1480: 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d  E_OK}..do_test m
1490: 75 6c 74 69 70 6c 65 78 2d 31 2e 31 32 2e 31 20  ultiplex-1.12.1 
14a0: 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69   { sqlite3_multi
14b0: 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20  plex_initialize 
14c0: 22 22 20 31 20 7d 20 20 20 20 20 20 20 20 20 20  "" 1 }          
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
14f0: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31  test multiplex-1
1500: 2e 31 32 2e 32 20 20 7b 20 73 71 6c 69 74 65 33  .12.2  { sqlite3
1510: 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20 20 20   db test.db }   
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f 74 65 73         {}.do_tes
1550: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 32  t multiplex-1.12
1560: 2e 33 20 20 7b 20 6c 69 6e 64 65 78 20 5b 20 63  .3  { lindex [ c
1570: 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54  atchsql { SELECT
1580: 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72   multiplex_contr
1590: 6f 6c 28 31 2c 20 30 29 3b 20 7d 20 5d 20 30 20  ol(1, 0); } ] 0 
15a0: 7d 20 20 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  }   {0}.do_test 
15b0: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 32 2e 34  multiplex-1.12.4
15c0: 20 20 7b 20 6c 69 6e 64 65 78 20 5b 20 63 61 74    { lindex [ cat
15d0: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6d  chsql { SELECT m
15e0: 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c  ultiplex_control
15f0: 28 31 2c 20 31 29 3b 20 7d 20 5d 20 30 20 7d 20  (1, 1); } ] 0 } 
1600: 20 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75    {0}.do_test mu
1610: 6c 74 69 70 6c 65 78 2d 31 2e 31 32 2e 35 20 20  ltiplex-1.12.5  
1620: 7b 20 6c 69 6e 64 65 78 20 5b 20 63 61 74 63 68  { lindex [ catch
1630: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6d 75 6c  sql { SELECT mul
1640: 74 69 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c 28 31  tiplex_control(1
1650: 2c 20 2d 31 29 3b 20 7d 20 5d 20 30 20 7d 20 20  , -1); } ] 0 }  
1660: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  {0}.do_test mult
1670: 69 70 6c 65 78 2d 31 2e 31 32 2e 36 20 20 7b 20  iplex-1.12.6  { 
1680: 64 62 20 63 6c 6f 73 65 20 7d 20 20 20 20 20 20  db close }      
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d                {}
16c0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
16d0: 65 78 2d 31 2e 31 32 2e 37 20 20 7b 20 73 71 6c  ex-1.12.7  { sql
16e0: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73  ite3_multiplex_s
16f0: 68 75 74 64 6f 77 6e 20 7d 20 20 20 20 20 20 20  hutdown }       
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 20 20 20 20 20 20 20 7b 53 51 4c 49             {SQLI
1720: 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20  TE_OK}..do_test 
1730: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 33 2e 31  multiplex-1.13.1
1740: 20 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74    { sqlite3_mult
1750: 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65  iplex_initialize
1760: 20 22 22 20 31 20 7d 20 20 20 20 20 20 20 20 20   "" 1 }         
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f    {SQLITE_OK}.do
1790: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
17a0: 31 2e 31 33 2e 32 20 20 7b 20 73 71 6c 69 74 65  1.13.2  { sqlite
17b0: 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20 20  3 db test.db }  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f 74 65          {}.do_te
17f0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31  st multiplex-1.1
1800: 33 2e 33 20 20 7b 20 6c 69 6e 64 65 78 20 5b 20  3.3  { lindex [ 
1810: 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43  catchsql { SELEC
1820: 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74  T multiplex_cont
1830: 72 6f 6c 28 2d 31 2c 20 30 29 3b 20 7d 20 5d 20  rol(-1, 0); } ] 
1840: 30 20 7d 20 20 7b 31 7d 0a 64 6f 5f 74 65 73 74  0 }  {1}.do_test
1850: 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 33 2e   multiplex-1.13.
1860: 34 20 20 7b 20 6c 69 6e 64 65 78 20 5b 20 63 61  4  { lindex [ ca
1870: 74 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  tchsql { SELECT 
1880: 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72 6f  multiplex_contro
1890: 6c 28 34 2c 20 31 29 3b 20 7d 20 5d 20 30 20 7d  l(4, 1); } ] 0 }
18a0: 20 20 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 6d     {1}.do_test m
18b0: 75 6c 74 69 70 6c 65 78 2d 31 2e 31 33 2e 36 20  ultiplex-1.13.6 
18c0: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 20 20 20   { db close }   
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74   {}.do_test mult
1910: 69 70 6c 65 78 2d 31 2e 31 33 2e 37 20 20 7b 20  iplex-1.13.7  { 
1920: 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65  sqlite3_multiple
1930: 78 5f 73 68 75 74 64 6f 77 6e 20 7d 20 20 20 20  x_shutdown }    
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 53                {S
1960: 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 23 2d 2d 2d 2d  QLITE_OK}..#----
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b0: 2d 2d 2d 2d 2d 0a 23 20 53 6f 6d 65 20 73 69 6d  -----.# Some sim
19c0: 70 6c 65 20 77 61 72 6d 2d 62 6f 64 79 20 74 65  ple warm-body te
19d0: 73 74 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c  sts with a singl
19e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19f0: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 0a 23 20 6d  in rollback .# m
1a00: 6f 64 65 3a 0a 23 0a 23 20 20 20 6d 75 6c 74 69  ode:.#.#   multi
1a10: 70 6c 65 78 2d 32 2e 31 2e 2a 3a 20 54 65 73 74  plex-2.1.*: Test
1a20: 20 73 69 6d 70 6c 65 20 77 72 69 74 69 6e 67 20   simple writing 
1a30: 74 6f 20 61 20 6d 75 6c 74 69 70 6c 65 78 20 66  to a multiplex f
1a40: 69 6c 65 2e 0a 23 0a 23 20 20 20 6d 75 6c 74 69  ile..#.#   multi
1a50: 70 6c 65 78 2d 32 2e 32 2e 2a 3a 20 4d 6f 72 65  plex-2.2.*: More
1a60: 20 77 72 69 74 69 6e 67 2e 0a 23 0a 23 20 20 20   writing..#.#   
1a70: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 33 2e 2a 3a  multiplex-2.3.*:
1a80: 20 4f 70 65 6e 20 61 6e 64 20 63 6c 6f 73 65 20   Open and close 
1a90: 61 20 73 65 63 6f 6e 64 20 64 62 2e 0a 23 0a 23  a second db..#.#
1aa0: 20 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 34     multiplex-2.4
1ab0: 2e 2a 3a 20 54 72 79 20 74 6f 20 73 68 75 74 64  .*: Try to shutd
1ac0: 6f 77 6e 20 74 68 65 20 6d 75 6c 74 69 70 6c 65  own the multiple
1ad0: 78 20 73 79 73 74 65 6d 20 62 65 66 6f 72 65 20  x system before 
1ae0: 63 6c 6f 73 69 6e 67 20 74 68 65 20 64 62 0a 23  closing the db.#
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 66 69 6c 65 2e 20 43 68 65 63 6b 20 74 68 61 74  file. Check that
1b10: 20 74 68 69 73 20 66 61 69 6c 73 20 61 6e 64 20   this fails and 
1b20: 74 68 65 20 6d 75 6c 74 69 70 6c 65 78 20 73 79  the multiplex sy
1b30: 73 74 65 6d 20 73 74 69 6c 6c 20 77 6f 72 6b 73  stem still works
1b40: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
1b50: 20 20 61 66 74 65 72 77 61 72 64 73 2e 20 54 68    afterwards. Th
1b60: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  en close the dat
1b70: 61 62 61 73 65 20 61 6e 64 20 73 75 63 63 65 73  abase and succes
1b80: 73 66 75 6c 6c 79 20 73 68 75 74 0a 23 20 20 20  sfully shut.#   
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 77               dow
1ba0: 6e 20 74 68 65 20 6d 75 6c 74 69 70 6c 65 78 20  n the multiplex 
1bb0: 73 79 73 74 65 6d 2e 0a 23 0a 23 20 20 20 6d 75  system..#.#   mu
1bc0: 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 2a 3a 20 4d  ltiplex-2.5.*: M
1bd0: 6f 72 65 20 72 65 61 64 69 6e 67 2f 77 72 69 74  ore reading/writ
1be0: 69 6e 67 2e 0a 23 0a 23 20 20 20 6d 75 6c 74 69  ing..#.#   multi
1bf0: 70 6c 65 78 2d 32 2e 36 2e 2a 3a 20 4d 6f 72 65  plex-2.6.*: More
1c00: 20 72 65 61 64 69 6e 67 2f 77 72 69 74 69 6e 67   reading/writing
1c10: 20 77 69 74 68 20 76 61 72 79 69 6e 67 20 73 6d   with varying sm
1c20: 61 6c 6c 20 63 68 75 6e 6b 20 73 69 7a 65 73 2c  all chunk sizes,
1c30: 20 61 73 0a 23 20 20 20 20 20 20 20 20 20 20 20   as.#           
1c40: 20 20 20 20 20 77 65 6c 6c 20 61 73 20 76 61 72       well as var
1c50: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ying journal mod
1c60: 65 2e 0a 23 0a 23 20 20 20 6d 75 6c 74 69 70 6c  e..#.#   multipl
1c70: 65 78 2d 32 2e 37 2e 2a 3a 20 44 69 73 61 62 6c  ex-2.7.*: Disabl
1c80: 65 2f 65 6e 61 62 6c 65 20 74 65 73 74 73 2e 0a  e/enable tests..
1c90: 23 0a 0a 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69  #..sqlite3_multi
1ca0: 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20  plex_initialize 
1cb0: 22 22 20 31 0a 6d 75 6c 74 69 70 6c 65 78 5f 73  "" 1.multiplex_s
1cc0: 65 74 20 64 62 20 6d 61 69 6e 20 33 32 37 36 38  et db main 32768
1cd0: 20 31 36 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65   16..forcedelete
1ce0: 20 74 65 73 74 2e 78 0a 66 6f 72 65 61 63 68 20   test.x.foreach 
1cf0: 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c  f [glob -nocompl
1d00: 61 69 6e 20 7b 74 65 73 74 2e 78 2a 5b 30 2d 39  ain {test.x*[0-9
1d10: 5d 5b 30 2d 39 5d 5b 30 2d 39 5d 7d 5d 20 7b 0a  ][0-9][0-9]}] {.
1d20: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 24 66    forcedelete $f
1d30: 0a 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  .}.do_test multi
1d40: 70 6c 65 78 2d 32 2e 31 2e 32 20 7b 0a 20 20 73  plex-2.1.2 {.  s
1d50: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 78  qlite3 db test.x
1d60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1d70: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
1d80: 65 3d 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47  e=1024;.    PRAG
1d90: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f  MA auto_vacuum=O
1da0: 46 46 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  FF;.    PRAGMA j
1db0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45  ournal_mode=DELE
1dc0: 54 45 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  TE;.  }.  execsq
1dd0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
1de0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
1df0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1e00: 31 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  1 VALUES(1, rand
1e10: 6f 6d 62 6c 6f 62 28 31 31 30 30 29 29 3b 0a 20  omblob(1100));. 
1e20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1e30: 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64  1 VALUES(2, rand
1e40: 6f 6d 62 6c 6f 62 28 31 31 30 30 29 29 3b 0a 20  omblob(1100));. 
1e50: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
1e60: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 31 2e 33 20  multiplex-2.1.3 
1e70: 7b 20 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75 6c  { file size [mul
1e80: 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74  tiplex_name test
1e90: 2e 78 20 30 5d 20 7d 20 7b 34 30 39 36 7d 0a 64  .x 0] } {4096}.d
1ea0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
1eb0: 2d 32 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -2.1.4 {.  execs
1ec0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
1ed0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72 61   t1 VALUES(3, ra
1ee0: 6e 64 6f 6d 62 6c 6f 62 28 31 31 30 30 29 29 20  ndomblob(1100)) 
1ef0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
1f00: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 32 2e 31 20  multiplex-2.2.1 
1f10: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
1f20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1f30: 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(3, randomblo
1f40: 62 28 31 31 30 30 29 29 20 7d 0a 7d 20 7b 7d 0a  b(1100)) }.} {}.
1f50: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
1f60: 78 2d 32 2e 32 2e 33 20 7b 20 66 69 6c 65 20 73  x-2.2.3 { file s
1f70: 69 7a 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e  ize [multiplex_n
1f80: 61 6d 65 20 74 65 73 74 2e 78 20 30 5d 20 7d 20  ame test.x 0] } 
1f90: 7b 36 31 34 34 7d 0a 0a 64 6f 5f 74 65 73 74 20  {6144}..do_test 
1fa0: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 33 2e 31 20  multiplex-2.3.1 
1fb0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
1fc0: 74 65 73 74 32 2e 78 0a 20 20 64 62 32 20 63 6c  test2.x.  db2 cl
1fd0: 6f 73 65 0a 7d 20 7b 7d 0a 0a 0a 64 6f 5f 74 65  ose.} {}...do_te
1fe0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 34  st multiplex-2.4
1ff0: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .1 {.  sqlite3_m
2000: 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77  ultiplex_shutdow
2010: 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4d 49 53 55  n.} {SQLITE_MISU
2020: 53 45 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  SE}.do_test mult
2030: 69 70 6c 65 78 2d 32 2e 34 2e 32 20 7b 0a 20 20  iplex-2.4.2 {.  
2040: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
2050: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2060: 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 31  3, randomblob(11
2070: 30 30 29 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  00)) }.} {}.do_t
2080: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e  est multiplex-2.
2090: 34 2e 34 20 7b 20 66 69 6c 65 20 73 69 7a 65 20  4.4 { file size 
20a0: 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20  [multiplex_name 
20b0: 74 65 73 74 2e 78 20 30 5d 20 7d 20 7b 37 31 36  test.x 0] } {716
20c0: 38 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  8}.do_test multi
20d0: 70 6c 65 78 2d 32 2e 34 2e 35 20 7b 0a 20 20 64  plex-2.4.5 {.  d
20e0: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
20f0: 33 20 64 62 20 74 65 73 74 2e 78 0a 20 20 64 62  3 db test.x.  db
2100: 20 65 76 61 6c 20 76 61 63 75 75 6d 0a 20 20 64   eval vacuum.  d
2110: 62 20 63 6c 6f 73 65 0a 20 20 67 6c 6f 62 20 74  b close.  glob t
2120: 65 73 74 2e 78 2a 0a 7d 20 7b 74 65 73 74 2e 78  est.x*.} {test.x
2130: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
2140: 6c 65 78 2d 32 2e 34 2e 39 39 20 7b 0a 20 20 73  lex-2.4.99 {.  s
2150: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
2160: 5f 73 68 75 74 64 6f 77 6e 0a 7d 20 7b 53 51 4c  _shutdown.} {SQL
2170: 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74  ITE_OK}..do_test
2180: 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 31   multiplex-2.5.1
2190: 20 7b 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f 64   {.  multiplex_d
21a0: 65 6c 65 74 65 20 74 65 73 74 2e 78 0a 20 20 73  elete test.x.  s
21b0: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
21c0: 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31  _initialize "" 1
21d0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
21e0: 73 74 2e 78 0a 20 20 6d 75 6c 74 69 70 6c 65 78  st.x.  multiplex
21f0: 5f 73 65 74 20 64 62 20 6d 61 69 6e 20 34 30 39  _set db main 409
2200: 36 20 31 36 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  6 16.} {SQLITE_O
2210: 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  K}..do_test mult
2220: 69 70 6c 65 78 2d 32 2e 35 2e 32 20 7b 0a 20 20  iplex-2.5.2 {.  
2230: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
2240: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
2250: 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d   1024;.    PRAGM
2260: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
2270: 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 50 52 41   delete;.    PRA
2280: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
2290: 3d 20 6f 66 66 3b 0a 20 20 20 20 43 52 45 41 54  = off;.    CREAT
22a0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
22b0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
22c0: 7d 0a 7d 20 7b 64 65 6c 65 74 65 7d 0a 0a 64 6f  }.} {delete}..do
22d0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
22e0: 32 2e 35 2e 33 20 7b 20 0a 20 20 65 78 65 63 73  2.5.3 { .  execs
22f0: 71 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54  ql { .    INSERT
2300: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2310: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49  1, 'one');.    I
2320: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2330: 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
2340: 6f 62 28 34 30 30 30 29 29 3b 0a 20 20 20 20 49  ob(4000));.    I
2350: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2360: 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27 29  LUES(3, 'three')
2370: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2380: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 72  O t1 VALUES(4, r
2390: 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 30 29 29  andomblob(4000))
23a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
23b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 27  O t1 VALUES(5, '
23c0: 66 69 76 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  five');.    INSE
23d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
23e0: 53 28 36 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(6, randomblob(
23f0: 24 67 5f 63 68 75 6e 6b 5f 73 69 7a 65 29 29 3b  $g_chunk_size));
2400: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2410: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 72 61   t1 VALUES(7, ra
2420: 6e 64 6f 6d 62 6c 6f 62 28 24 67 5f 63 68 75 6e  ndomblob($g_chun
2430: 6b 5f 73 69 7a 65 29 29 3b 0a 20 20 7d 0a 7d 20  k_size));.  }.} 
2440: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  {}..do_test mult
2450: 69 70 6c 65 78 2d 32 2e 35 2e 34 20 7b 0a 20 20  iplex-2.5.4 {.  
2460: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
2470: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
2480: 61 3d 31 7d 0a 7d 20 7b 31 20 6f 6e 65 7d 0a 0a  a=1}.} {1 one}..
2490: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
24a0: 78 2d 32 2e 35 2e 35 20 7b 0a 20 20 64 62 20 65  x-2.5.5 {.  db e
24b0: 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  val {SELECT * FR
24c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 33 7d  OM t1 WHERE a=3}
24d0: 0a 7d 20 7b 33 20 74 68 72 65 65 7d 0a 0a 64 6f  .} {3 three}..do
24e0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
24f0: 32 2e 35 2e 36 20 7b 0a 20 20 64 62 20 65 76 61  2.5.6 {.  db eva
2500: 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  l {SELECT * FROM
2510: 20 74 31 20 57 48 45 52 45 20 61 3d 35 7d 0a 7d   t1 WHERE a=5}.}
2520: 20 7b 35 20 66 69 76 65 7d 0a 0a 64 6f 5f 74 65   {5 five}..do_te
2530: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35  st multiplex-2.5
2540: 2e 37 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .7 {.  db eval {
2550: 53 45 4c 45 43 54 20 61 2c 6c 65 6e 67 74 68 28  SELECT a,length(
2560: 62 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  b) FROM t1 WHERE
2570: 20 61 3d 32 7d 0a 7d 20 7b 32 20 34 30 30 30 7d   a=2}.} {2 4000}
2580: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  ..do_test multip
2590: 6c 65 78 2d 32 2e 35 2e 38 20 7b 0a 20 20 64 62  lex-2.5.8 {.  db
25a0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 61 2c   eval {SELECT a,
25b0: 6c 65 6e 67 74 68 28 62 29 20 46 52 4f 4d 20 74  length(b) FROM t
25c0: 31 20 57 48 45 52 45 20 61 3d 34 7d 0a 7d 20 7b  1 WHERE a=4}.} {
25d0: 34 20 34 30 30 30 7d 0a 0a 64 6f 5f 74 65 73 74  4 4000}..do_test
25e0: 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 39   multiplex-2.5.9
25f0: 20 7b 20 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75   { file size [mu
2600: 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73  ltiplex_name tes
2610: 74 2e 78 20 30 5d 20 7d 20 5b 6c 69 73 74 20 24  t.x 0] } [list $
2620: 67 5f 63 68 75 6e 6b 5f 73 69 7a 65 5d 0a 64 6f  g_chunk_size].do
2630: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
2640: 32 2e 35 2e 31 30 20 7b 20 66 69 6c 65 20 73 69  2.5.10 { file si
2650: 7a 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61  ze [multiplex_na
2660: 6d 65 20 74 65 73 74 2e 78 20 31 5d 20 7d 20 5b  me test.x 1] } [
2670: 6c 69 73 74 20 24 67 5f 63 68 75 6e 6b 5f 73 69  list $g_chunk_si
2680: 7a 65 5d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  ze]..do_test mul
2690: 74 69 70 6c 65 78 2d 32 2e 35 2e 39 39 20 7b 0a  tiplex-2.5.99 {.
26a0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
26b0: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73  ite3_multiplex_s
26c0: 68 75 74 64 6f 77 6e 0a 7d 20 7b 53 51 4c 49 54  hutdown.} {SQLIT
26d0: 45 5f 4f 4b 7d 0a 0a 0a 73 65 74 20 61 6c 6c 5f  E_OK}...set all_
26e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 73 20 7b 64  journal_modes {d
26f0: 65 6c 65 74 65 20 70 65 72 73 69 73 74 20 74 72  elete persist tr
2700: 75 6e 63 61 74 65 20 6d 65 6d 6f 72 79 20 6f 66  uncate memory of
2710: 66 7d 0a 66 6f 72 65 61 63 68 20 6a 6d 6f 64 65  f}.foreach jmode
2720: 20 24 61 6c 6c 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f   $all_journal_mo
2730: 64 65 73 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74  des {.  for {set
2740: 20 73 7a 20 31 35 31 7d 20 7b 24 73 7a 3c 38 30   sz 151} {$sz<80
2750: 30 30 7d 20 7b 73 65 74 20 73 7a 20 5b 65 78 70  00} {set sz [exp
2760: 72 20 24 73 7a 2b 34 31 39 5d 7d 20 7b 0a 0a 20  r $sz+419]} {.. 
2770: 20 20 20 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69     do_test multi
2780: 70 6c 65 78 2d 32 2e 36 2e 31 2e 24 73 7a 2e 24  plex-2.6.1.$sz.$
2790: 6a 6d 6f 64 65 20 7b 0a 20 20 20 20 20 20 6d 75  jmode {.      mu
27a0: 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 74  ltiplex_delete t
27b0: 65 73 74 2e 64 62 0a 20 20 20 20 20 20 73 71 6c  est.db.      sql
27c0: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69  ite3_multiplex_i
27d0: 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31 0a 20  nitialize "" 1. 
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20       sqlite3 db 
27f0: 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20 6d 75  test.db.      mu
2800: 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62 20 6d  ltiplex_set db m
2810: 61 69 6e 20 24 73 7a 20 33 32 0a 20 20 20 20 7d  ain $sz 32.    }
2820: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 20 20   {SQLITE_OK}..  
2830: 20 20 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70    do_test multip
2840: 6c 65 78 2d 32 2e 36 2e 32 2e 24 73 7a 2e 24 6a  lex-2.6.2.$sz.$j
2850: 6d 6f 64 65 20 7b 0a 20 20 20 20 20 20 64 62 20  mode {.      db 
2860: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 20 20 50  eval {.        P
2870: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
2880: 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20 20 20  = 1024;.        
2890: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
28a0: 75 6d 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20  um = off;.      
28b0: 7d 0a 20 20 20 20 20 20 64 62 20 65 76 61 6c 20  }.      db eval 
28c0: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
28d0: 6d 6f 64 65 20 3d 20 24 6a 6d 6f 64 65 3b 22 0a  mode = $jmode;".
28e0: 20 20 20 20 7d 20 24 6a 6d 6f 64 65 0a 0a 20 20      } $jmode..  
28f0: 20 20 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70    do_test multip
2900: 6c 65 78 2d 32 2e 36 2e 33 2e 24 73 7a 2e 24 6a  lex-2.6.3.$sz.$j
2910: 6d 6f 64 65 20 7b 20 0a 20 20 20 20 20 20 65 78  mode { .      ex
2920: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 20  ecsql { .       
2930: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2940: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
2950: 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  b);.        INSE
2960: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2970: 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20  S(1, 'one');.   
2980: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2990: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72 61   t1 VALUES(2, ra
29a0: 6e 64 6f 6d 62 6c 6f 62 28 24 67 5f 63 68 75 6e  ndomblob($g_chun
29b0: 6b 5f 73 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  k_size));.      
29c0: 7d 0a 20 20 20 20 7d 20 7b 7d 0a 0a 20 20 20 20  }.    } {}..    
29d0: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
29e0: 78 2d 32 2e 36 2e 34 2e 24 73 7a 2e 24 6a 6d 6f  x-2.6.4.$sz.$jmo
29f0: 64 65 20 7b 0a 20 20 20 20 20 20 64 62 20 65 76  de {.      db ev
2a00: 61 6c 20 7b 53 45 4c 45 43 54 20 62 20 46 52 4f  al {SELECT b FRO
2a10: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 7d 0a  M t1 WHERE a=1}.
2a20: 20 20 20 20 7d 20 7b 6f 6e 65 7d 0a 0a 20 20 20      } {one}..   
2a30: 20 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c   do_test multipl
2a40: 65 78 2d 32 2e 36 2e 35 2e 24 73 7a 2e 24 6a 6d  ex-2.6.5.$sz.$jm
2a50: 6f 64 65 20 7b 0a 20 20 20 20 20 20 64 62 20 65  ode {.      db e
2a60: 76 61 6c 20 7b 53 45 4c 45 43 54 20 6c 65 6e 67  val {SELECT leng
2a70: 74 68 28 62 29 20 46 52 4f 4d 20 74 31 20 57 48  th(b) FROM t1 WH
2a80: 45 52 45 20 61 3d 32 7d 0a 20 20 20 20 7d 20 5b  ERE a=2}.    } [
2a90: 6c 69 73 74 20 24 67 5f 63 68 75 6e 6b 5f 73 69  list $g_chunk_si
2aa0: 7a 65 5d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74  ze]..    do_test
2ab0: 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 36 2e 36   multiplex-2.6.6
2ac0: 2e 24 73 7a 2e 24 6a 6d 6f 64 65 20 7b 20 66 69  .$sz.$jmode { fi
2ad0: 6c 65 20 73 69 7a 65 20 5b 6d 75 6c 74 69 70 6c  le size [multipl
2ae0: 65 78 5f 6e 61 6d 65 20 74 65 73 74 2e 64 62 20  ex_name test.db 
2af0: 30 5d 20 7d 20 5b 6c 69 73 74 20 24 67 5f 63 68  0] } [list $g_ch
2b00: 75 6e 6b 5f 73 69 7a 65 5d 0a 0a 20 20 20 20 64  unk_size]..    d
2b10: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
2b20: 2d 32 2e 36 2e 39 39 2e 24 73 7a 2e 24 6a 6d 6f  -2.6.99.$sz.$jmo
2b30: 64 65 20 7b 0a 20 20 20 20 20 20 64 62 20 63 6c  de {.      db cl
2b40: 6f 73 65 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ose.      sqlite
2b50: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74  3_multiplex_shut
2b60: 64 6f 77 6e 0a 20 20 20 20 7d 20 7b 53 51 4c 49  down.    } {SQLI
2b70: 54 45 5f 4f 4b 7d 0a 0a 20 20 7d 0a 7d 0a 0a 64  TE_OK}..  }.}..d
2b80: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
2b90: 2d 32 2e 37 2e 31 20 20 7b 20 6d 75 6c 74 69 70  -2.7.1  { multip
2ba0: 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74 2e  lex_delete test.
2bb0: 64 62 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  db }            
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f             {}.do
2be0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
2bf0: 32 2e 37 2e 32 20 20 7b 20 73 71 6c 69 74 65 33  2.7.2  { sqlite3
2c00: 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69  _multiplex_initi
2c10: 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20 20  alize "" 1 }    
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54            {SQLIT
2c40: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  E_OK}.do_test mu
2c50: 6c 74 69 70 6c 65 78 2d 32 2e 37 2e 33 20 20 7b  ltiplex-2.7.3  {
2c60: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
2c70: 2e 64 62 20 7d 20 20 20 20 20 20 20 20 20 20 20  .db }           
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c    {}.do_test mul
2cb0: 74 69 70 6c 65 78 2d 32 2e 37 2e 34 20 20 7b 20  tiplex-2.7.4  { 
2cc0: 6c 69 6e 64 65 78 20 5b 20 63 61 74 63 68 73 71  lindex [ catchsq
2cd0: 6c 20 7b 20 53 45 4c 45 43 54 20 6d 75 6c 74 69  l { SELECT multi
2ce0: 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c 28 32 2c 20  plex_control(2, 
2cf0: 36 35 35 33 36 29 3b 20 7d 20 5d 20 30 20 7d 20  65536); } ] 0 } 
2d00: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c   {0}.do_test mul
2d10: 74 69 70 6c 65 78 2d 32 2e 37 2e 35 20 20 7b 20  tiplex-2.7.5  { 
2d20: 6c 69 6e 64 65 78 20 5b 20 63 61 74 63 68 73 71  lindex [ catchsq
2d30: 6c 20 7b 20 53 45 4c 45 43 54 20 6d 75 6c 74 69  l { SELECT multi
2d40: 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c 28 31 2c 20  plex_control(1, 
2d50: 30 29 3b 20 7d 20 5d 20 30 20 7d 20 20 20 20 20  0); } ] 0 }     
2d60: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c   {0}.do_test mul
2d70: 74 69 70 6c 65 78 2d 32 2e 37 2e 36 20 7b 20 0a  tiplex-2.7.6 { .
2d80: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
2d90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2da0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
2db0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
2dc0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
2dd0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
2de0: 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 23 20 76  ));.  }.} {}.# v
2df0: 65 72 69 66 79 20 6f 6e 6c 79 20 6f 6e 65 20 66  erify only one f
2e00: 69 6c 65 2c 20 61 6e 64 20 66 69 6c 65 20 73 69  ile, and file si
2e10: 7a 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ze is less than 
2e20: 63 68 75 6e 6b 73 20 73 69 7a 65 0a 64 6f 5f 74  chunks size.do_t
2e30: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e  est multiplex-2.
2e40: 37 2e 37 20 20 7b 20 65 78 70 72 20 28 5b 66 69  7.7  { expr ([fi
2e50: 6c 65 20 73 69 7a 65 20 5b 6d 75 6c 74 69 70 6c  le size [multipl
2e60: 65 78 5f 6e 61 6d 65 20 74 65 73 74 2e 64 62 20  ex_name test.db 
2e70: 30 5d 5d 20 3c 20 36 35 35 33 36 29 20 7d 20 7b  0]] < 65536) } {
2e80: 31 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  1}.do_test multi
2e90: 70 6c 65 78 2d 32 2e 37 2e 38 20 20 7b 20 66 69  plex-2.7.8  { fi
2ea0: 6c 65 20 65 78 69 73 74 73 20 5b 6d 75 6c 74 69  le exists [multi
2eb0: 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74 2e 64  plex_name test.d
2ec0: 62 20 31 5d 20 7d 20 20 20 20 20 20 20 20 20 20  b 1] }          
2ed0: 20 20 20 20 20 20 7b 30 7d 0a 64 6f 5f 74 65 73        {0}.do_tes
2ee0: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 37 2e  t multiplex-2.7.
2ef0: 39 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 7b  9 { .  execsql {
2f00: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
2f10: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 72  O t1 VALUES(2, r
2f20: 61 6e 64 6f 6d 62 6c 6f 62 28 36 35 35 33 36 29  andomblob(65536)
2f30: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 23 20 76 65  );.  }.} {}.# ve
2f40: 72 69 66 79 20 6f 6e 6c 79 20 6f 6e 65 20 66 69  rify only one fi
2f50: 6c 65 2c 20 61 6e 64 20 66 69 6c 65 20 73 69 7a  le, and file siz
2f60: 65 20 65 78 63 65 65 64 73 20 63 68 75 6e 6b 73  e exceeds chunks
2f70: 20 73 69 7a 65 0a 64 6f 5f 74 65 73 74 20 6d 75   size.do_test mu
2f80: 6c 74 69 70 6c 65 78 2d 32 2e 37 2e 31 30 20 7b  ltiplex-2.7.10 {
2f90: 20 65 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a   expr ([file siz
2fa0: 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d  e [multiplex_nam
2fb0: 65 20 74 65 73 74 2e 64 62 20 30 5d 5d 20 3e 20  e test.db 0]] > 
2fc0: 36 35 35 33 36 29 20 7d 20 7b 31 7d 0a 64 6f 5f  65536) } {1}.do_
2fd0: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32  test multiplex-2
2fe0: 2e 37 2e 31 31 20 7b 20 66 69 6c 65 20 65 78 69  .7.11 { file exi
2ff0: 73 74 73 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e  sts [multiplex_n
3000: 61 6d 65 20 74 65 73 74 2e 64 62 20 31 5d 20 7d  ame test.db 1] }
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  {0}.do_test mult
3030: 69 70 6c 65 78 2d 32 2e 37 2e 31 32 20 7b 20 64  iplex-2.7.12 { d
3040: 62 20 63 6c 6f 73 65 20 7d 20 20 20 20 20 20 20  b close }       
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f 74 65 73         {}.do_tes
3080: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 37 2e  t multiplex-2.7.
3090: 31 33 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c  13 { sqlite3_mul
30a0: 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 20  tiplex_shutdown 
30b0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 53 51               {SQ
30d0: 4c 49 54 45 5f 4f 4b 7d 0a 0a 23 2d 2d 2d 2d 2d  LITE_OK}..#-----
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 0a 23 20 54 72 79 20 73 6f 6d 65 20  ----.# Try some 
3130: 74 65 73 74 73 20 77 69 74 68 20 6d 6f 72 65 20  tests with more 
3140: 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74  than one connect
3150: 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
3160: 65 20 66 69 6c 65 2e 20 53 74 69 6c 6c 0a 23 20  e file. Still.# 
3170: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  in rollback mode
3180: 2e 0a 23 0a 23 20 20 20 6d 75 6c 74 69 70 6c 65  ..#.#   multiple
3190: 78 2d 33 2e 31 2e 2a 3a 20 54 77 6f 20 63 6f 6e  x-3.1.*: Two con
31a0: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 61 20 73 69  nections to a si
31b0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ngle database fi
31c0: 6c 65 2e 0a 23 0a 23 20 20 20 6d 75 6c 74 69 70  le..#.#   multip
31d0: 6c 65 78 2d 33 2e 32 2e 2a 3a 20 54 77 6f 20 63  lex-3.2.*: Two c
31e0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 65 61  onnections to ea
31f0: 63 68 20 6f 66 20 73 65 76 65 72 61 6c 20 64 61  ch of several da
3200: 74 61 62 61 73 65 20 66 69 6c 65 73 20 28 74 68  tabase files (th
3210: 61 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  at.#            
3220: 20 20 20 20 61 72 65 20 69 6e 20 74 68 65 20 73      are in the s
3230: 61 6d 65 20 6d 75 6c 74 69 70 6c 65 78 20 67 72  ame multiplex gr
3240: 6f 75 70 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  oup)..#.do_test 
3250: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 31 2e 31 20  multiplex-3.1.1 
3260: 7b 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f 64 65  {.  multiplex_de
3270: 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 73  lete test.db.  s
3280: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
3290: 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31  _initialize "" 1
32a0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
32b0: 73 74 2e 64 62 0a 20 20 6d 75 6c 74 69 70 6c 65  st.db.  multiple
32c0: 78 5f 73 65 74 20 64 62 20 6d 61 69 6e 20 33 32  x_set db main 32
32d0: 37 36 38 20 31 36 0a 7d 20 7b 53 51 4c 49 54 45  768 16.} {SQLITE
32e0: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  _OK}.do_test mul
32f0: 74 69 70 6c 65 78 2d 33 2e 31 2e 32 20 7b 0a 20  tiplex-3.1.2 {. 
3300: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
3310: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
3320: 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47  = 1024;.    PRAG
3330: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
3340: 3d 20 64 65 6c 65 74 65 3b 0a 20 20 20 20 50 52  = delete;.    PR
3350: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
3360: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 43 52 45 41   = off;.    CREA
3370: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
3380: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
3390: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
33a0: 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65  1 VALUES(1, 'one
33b0: 27 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  ');.  }.  file s
33c0: 69 7a 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e  ize [multiplex_n
33d0: 61 6d 65 20 74 65 73 74 2e 64 62 20 30 5d 0a 7d  ame test.db 0].}
33e0: 20 7b 33 30 37 32 7d 0a 64 6f 5f 74 65 73 74 20   {3072}.do_test 
33f0: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 31 2e 33 20  multiplex-3.1.3 
3400: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
3410: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
3420: 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
3430: 20 74 32 28 61 2c 20 62 29 20 7d 20 64 62 32 0a   t2(a, b) } db2.
3440: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  } {}.do_test mul
3450: 74 69 70 6c 65 78 2d 33 2e 31 2e 34 20 7b 0a 20  tiplex-3.1.4 {. 
3460: 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54   execsql { CREAT
3470: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
3480: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
3490: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 31 2e 35 20  multiplex-3.1.5 
34a0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 43  {.  catchsql { C
34b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
34c0: 2c 20 62 29 20 7d 0a 7d 20 7b 31 20 7b 74 61 62  , b) }.} {1 {tab
34d0: 6c 65 20 74 33 20 61 6c 72 65 61 64 79 20 65 78  le t3 already ex
34e0: 69 73 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 6d  ists}}.do_test m
34f0: 75 6c 74 69 70 6c 65 78 2d 33 2e 31 2e 36 20 7b  ultiplex-3.1.6 {
3500: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62  .  db close.  db
3510: 32 20 63 6c 6f 73 65 0a 7d 20 7b 7d 0a 0a 64 6f  2 close.} {}..do
3520: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
3530: 33 2e 32 2e 31 61 20 7b 0a 0a 20 20 6d 75 6c 74  3.2.1a {..  mult
3540: 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73  iplex_delete tes
3550: 74 2e 64 62 0a 20 20 6d 75 6c 74 69 70 6c 65 78  t.db.  multiplex
3560: 5f 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62  _delete test2.db
3570: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 31 61  ..  sqlite3 db1a
3580: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
3590: 65 33 20 64 62 32 61 20 74 65 73 74 32 2e 64 62  e3 db2a test2.db
35a0: 0a 0a 20 20 66 6f 72 65 61 63 68 20 64 62 20 7b  ..  foreach db {
35b0: 64 62 31 61 20 64 62 32 61 7d 20 7b 0a 20 20 20  db1a db2a} {.   
35c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
35d0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
35e0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20  e = 1024;.      
35f0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
3600: 6f 64 65 20 3d 20 64 65 6c 65 74 65 3b 0a 20 20  ode = delete;.  
3610: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
3620: 76 61 63 75 75 6d 20 3d 20 6f 66 66 3b 0a 20 20  vacuum = off;.  
3630: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3640: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 7d   t1(a, b);.    }
3650: 20 24 64 62 0a 20 20 7d 0a 0a 20 20 6c 69 73 74   $db.  }..  list
3660: 20 5b 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75 6c   [file size [mul
3670: 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74  tiplex_name test
3680: 2e 64 62 20 30 5d 5d 20 5b 66 69 6c 65 20 73 69  .db 0]] [file si
3690: 7a 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61  ze [multiplex_na
36a0: 6d 65 20 74 65 73 74 32 2e 64 62 20 30 5d 5d 0a  me test2.db 0]].
36b0: 7d 20 7b 32 30 34 38 20 32 30 34 38 7d 0a 0a 64  } {2048 2048}..d
36c0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
36d0: 2d 33 2e 32 2e 31 62 20 7b 0a 20 20 73 71 6c 69  -3.2.1b {.  sqli
36e0: 74 65 33 20 64 62 31 62 20 74 65 73 74 2e 64 62  te3 db1b test.db
36f0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 62 20  .  sqlite3 db2b 
3700: 74 65 73 74 32 2e 64 62 0a 7d 20 7b 7d 0a 0a 64  test2.db.} {}..d
3710: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
3720: 2d 33 2e 32 2e 32 20 7b 20 65 78 65 63 73 71 6c  -3.2.2 { execsql
3730: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3740: 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79  1 VALUES('x', 'y
3750: 27 29 20 7d 20 64 62 31 61 20 7d 20 7b 7d 0a 64  ') } db1a } {}.d
3760: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
3770: 2d 33 2e 32 2e 33 20 7b 20 65 78 65 63 73 71 6c  -3.2.3 { execsql
3780: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3790: 31 20 56 41 4c 55 45 53 28 27 76 27 2c 20 27 77  1 VALUES('v', 'w
37a0: 27 29 20 7d 20 64 62 31 62 20 7d 20 7b 7d 0a 64  ') } db1b } {}.d
37b0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
37c0: 2d 33 2e 32 2e 34 20 7b 20 65 78 65 63 73 71 6c  -3.2.4 { execsql
37d0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
37e0: 31 20 56 41 4c 55 45 53 28 27 74 27 2c 20 27 75  1 VALUES('t', 'u
37f0: 27 29 20 7d 20 64 62 32 61 20 7d 20 7b 7d 0a 64  ') } db2a } {}.d
3800: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
3810: 2d 33 2e 32 2e 35 20 7b 20 65 78 65 63 73 71 6c  -3.2.5 { execsql
3820: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3830: 31 20 56 41 4c 55 45 53 28 27 72 27 2c 20 27 73  1 VALUES('r', 's
3840: 27 29 20 7d 20 64 62 32 62 20 7d 20 7b 7d 0a 0a  ') } db2b } {}..
3850: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
3860: 78 2d 33 2e 32 2e 36 20 7b 20 0a 20 20 65 78 65  x-3.2.6 { .  exe
3870: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
3880: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
3890: 64 6f 6d 62 6c 6f 62 28 35 30 30 29 2c 20 72 61  domblob(500), ra
38a0: 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 29 20 7d  ndomblob(500)) }
38b0: 20 64 62 31 61 0a 7d 20 7b 7d 0a 64 6f 5f 74 65   db1a.} {}.do_te
38c0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32  st multiplex-3.2
38d0: 2e 37 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20  .7 { .  execsql 
38e0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
38f0: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
3900: 6f 62 28 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62  ob(500), randomb
3910: 6c 6f 62 28 35 30 30 29 29 20 7d 20 64 62 31 62  lob(500)) } db1b
3920: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  .} {}.do_test mu
3930: 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 38 20 7b 20  ltiplex-3.2.8 { 
3940: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
3950: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3960: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30  ES(randomblob(50
3970: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  0), randomblob(5
3980: 30 30 29 29 20 7d 20 64 62 32 61 0a 7d 20 7b 7d  00)) } db2a.} {}
3990: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
39a0: 65 78 2d 33 2e 32 2e 39 20 7b 20 0a 20 20 65 78  ex-3.2.9 { .  ex
39b0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
39c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
39d0: 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 2c 20 72  ndomblob(500), r
39e0: 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 29 20  andomblob(500)) 
39f0: 7d 20 64 62 32 62 0a 7d 20 7b 7d 0a 0a 64 6f 5f  } db2b.} {}..do_
3a00: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 33  test multiplex-3
3a10: 2e 33 2e 31 20 7b 20 0a 20 20 65 78 65 63 73 71  .3.1 { .  execsq
3a20: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
3a30: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
3a40: 62 6c 6f 62 28 35 30 30 29 2c 20 72 61 6e 64 6f  blob(500), rando
3a50: 6d 62 6c 6f 62 28 35 30 30 29 29 20 7d 20 64 62  mblob(500)) } db
3a60: 31 61 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49  1a.  execsql { I
3a70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3a80: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
3a90: 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  500), randomblob
3aa0: 28 35 30 30 29 29 20 7d 20 64 62 31 62 0a 20 20  (500)) } db1b.  
3ab0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
3ac0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3ad0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 2c  randomblob(500),
3ae0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29   randomblob(500)
3af0: 29 20 7d 20 64 62 32 61 0a 20 20 65 78 65 63 73  ) } db2a.  execs
3b00: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
3b10: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
3b20: 6d 62 6c 6f 62 28 35 30 30 29 2c 20 72 61 6e 64  mblob(500), rand
3b30: 6f 6d 62 6c 6f 62 28 35 30 30 29 29 20 7d 20 64  omblob(500)) } d
3b40: 62 32 62 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  b2b.} {}..do_tes
3b50: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e  t multiplex-3.2.
3b60: 58 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 64 62  X {.  foreach db
3b70: 20 7b 64 62 31 61 20 64 62 32 61 20 64 62 32 62   {db1a db2a db2b
3b80: 20 64 62 31 62 7d 20 7b 20 63 61 74 63 68 20 7b   db1b} { catch {
3b90: 20 24 64 62 20 63 6c 6f 73 65 20 7d 20 7d 0a 7d   $db close } }.}
3ba0: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3bf0: 23 0a 0a 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69  #..sqlite3_multi
3c00: 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20  plex_initialize 
3c10: 22 22 20 31 0a 6d 75 6c 74 69 70 6c 65 78 5f 73  "" 1.multiplex_s
3c20: 65 74 20 64 62 20 6d 61 69 6e 20 33 32 37 36 38  et db main 32768
3c30: 20 31 36 0a 0a 23 20 52 65 74 75 72 6e 20 61 20   16..# Return a 
3c40: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 75 72 72  list of all curr
3c50: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 6d 75  ently defined mu
3c60: 6c 74 69 70 6c 65 78 73 2e 0a 70 72 6f 63 20 6d  ltiplexs..proc m
3c70: 75 6c 74 69 70 6c 65 78 5f 6c 69 73 74 20 7b 7d  ultiplex_list {}
3c80: 20 7b 0a 20 20 73 65 74 20 61 6c 6c 71 20 7b 7d   {.  set allq {}
3c90: 0a 20 20 66 6f 72 65 61 63 68 20 71 20 5b 73 71  .  foreach q [sq
3ca0: 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f  lite3_multiplex_
3cb0: 64 75 6d 70 5d 20 7b 0a 20 20 20 20 6c 61 70 70  dump] {.    lapp
3cc0: 65 6e 64 20 61 6c 6c 71 20 5b 6c 69 6e 64 65 78  end allq [lindex
3cd0: 20 24 71 20 30 5d 0a 20 20 7d 0a 20 20 72 65 74   $q 0].  }.  ret
3ce0: 75 72 6e 20 5b 6c 73 6f 72 74 20 24 61 6c 6c 71  urn [lsort $allq
3cf0: 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  ].}..do_test mul
3d00: 74 69 70 6c 65 78 2d 34 2e 31 2e 36 20 7b 0a 20  tiplex-4.1.6 {. 
3d10: 20 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74   multiplex_delet
3d20: 65 20 74 65 73 74 32 2e 64 62 0a 20 20 73 71 6c  e test2.db.  sql
3d30: 69 74 65 33 20 64 62 20 74 65 73 74 32 2e 64 62  ite3 db test2.db
3d40: 0a 20 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41  .  db eval {CREA
3d50: 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 3b 20  TE TABLE t2(x); 
3d60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
3d70: 41 4c 55 45 53 28 27 74 61 62 2d 74 32 27 29 3b  ALUES('tab-t2');
3d80: 7d 0a 20 20 73 65 74 20 72 65 73 20 5b 6d 75 6c  }.  set res [mul
3d90: 74 69 70 6c 65 78 5f 6c 69 73 74 5d 0a 20 20 6c  tiplex_list].  l
3da0: 69 73 74 20 5b 72 65 67 65 78 70 20 7b 74 65 73  ist [regexp {tes
3db0: 74 32 2e 64 62 7d 20 24 72 65 73 5d 0a 7d 20 7b  t2.db} $res].} {
3dc0: 31 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  1}.do_test multi
3dd0: 70 6c 65 78 2d 34 2e 31 2e 36 61 20 7b 0a 20 20  plex-4.1.6a {.  
3de0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
3df0: 32 2e 64 62 0a 20 20 64 62 32 20 65 76 61 6c 20  2.db.  db2 eval 
3e00: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
3e10: 32 7d 0a 7d 20 7b 74 61 62 2d 74 32 7d 0a 64 6f  2}.} {tab-t2}.do
3e20: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
3e30: 34 2e 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  4.1.7 {.  execsq
3e40: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l {INSERT INTO t
3e50: 32 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f  2 VALUES(zeroblo
3e60: 62 28 32 30 30 30 30 30 29 29 7d 0a 7d 20 7b 7d  b(200000))}.} {}
3e70: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
3e80: 65 78 2d 34 2e 31 2e 38 20 7b 0a 20 20 73 71 6c  ex-4.1.8 {.  sql
3e90: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
3ea0: 62 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45  b.  db2 eval {SE
3eb0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3ec0: 4f 4d 20 74 32 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f  OM t2}.} {2}.do_
3ed0: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 34  test multiplex-4
3ee0: 2e 31 2e 38 61 20 7b 0a 20 20 20 64 62 32 20 65  .1.8a {.   db2 e
3ef0: 76 61 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  val { DELETE FRO
3f00: 4d 20 74 32 20 57 48 45 52 45 20 78 20 3d 20 27  M t2 WHERE x = '
3f10: 74 61 62 2d 74 32 27 20 7d 0a 7d 20 7b 7d 0a 64  tab-t2' }.} {}.d
3f20: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
3f30: 2d 34 2e 31 2e 38 62 20 7b 0a 20 20 73 71 6c 69  -4.1.8b {.  sqli
3f40: 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64 62  te3 db2 test2.db
3f50: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 53 45 4c  .  db2 eval {SEL
3f60: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
3f70: 4d 20 74 32 7d 0a 7d 20 7b 31 7d 0a 0a 0a 64 6f  M t2}.} {1}...do
3f80: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
3f90: 34 2e 31 2e 39 20 7b 0a 20 20 65 78 65 63 73 71  4.1.9 {.  execsq
3fa0: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l {INSERT INTO t
3fb0: 32 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f  2 VALUES(zeroblo
3fc0: 62 28 32 30 30 30 30 30 29 29 7d 0a 7d 20 7b 7d  b(200000))}.} {}
3fd0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
3fe0: 65 78 2d 34 2e 31 2e 31 30 20 7b 0a 20 20 73 65  ex-4.1.10 {.  se
3ff0: 74 20 72 65 73 20 5b 6d 75 6c 74 69 70 6c 65 78  t res [multiplex
4000: 5f 6c 69 73 74 5d 0a 20 20 6c 69 73 74 20 5b 72  _list].  list [r
4010: 65 67 65 78 70 20 7b 74 65 73 74 32 2e 64 62 7d  egexp {test2.db}
4020: 20 24 72 65 73 5d 0a 7d 20 7b 31 7d 0a 64 6f 5f   $res].} {1}.do_
4030: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 34  test multiplex-4
4040: 2e 31 2e 31 31 20 7b 0a 20 20 64 62 32 20 63 6c  .1.11 {.  db2 cl
4050: 6f 73 65 0a 20 20 73 65 74 20 72 65 73 20 5b 6d  ose.  set res [m
4060: 75 6c 74 69 70 6c 65 78 5f 6c 69 73 74 5d 0a 20  ultiplex_list]. 
4070: 20 6c 69 73 74 20 5b 72 65 67 65 78 70 20 7b 74   list [regexp {t
4080: 65 73 74 32 2e 64 62 7d 20 24 72 65 73 5d 0a 7d  est2.db} $res].}
4090: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c   {1}.do_test mul
40a0: 74 69 70 6c 65 78 2d 34 2e 31 2e 31 32 20 7b 0a  tiplex-4.1.12 {.
40b0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6d 75 6c    db close.  mul
40c0: 74 69 70 6c 65 78 5f 6c 69 73 74 0a 7d 20 7b 7d  tiplex_list.} {}
40d0: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4120: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
4130: 73 74 73 20 74 65 73 74 20 74 68 61 74 20 74 68  sts test that th
4140: 65 20 6d 75 6c 74 69 70 6c 65 78 20 56 46 53 20  e multiplex VFS 
4150: 68 61 6e 64 6c 65 73 20 6d 61 6c 6c 6f 63 20 61  handles malloc a
4160: 6e 64 20 49 4f 20 0a 23 20 65 72 72 6f 72 73 2e  nd IO .# errors.
4170: 0a 23 0a 0a 73 71 6c 69 74 65 33 5f 6d 75 6c 74  .#..sqlite3_mult
4180: 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65  iplex_initialize
4190: 20 22 22 20 31 0a 6d 75 6c 74 69 70 6c 65 78 5f   "" 1.multiplex_
41a0: 73 65 74 20 64 62 20 6d 61 69 6e 20 33 32 37 36  set db main 3276
41b0: 38 20 31 36 0a 0a 64 6f 5f 66 61 75 6c 74 73 69  8 16..do_faultsi
41c0: 6d 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  m_test multiplex
41d0: 2d 35 2e 31 20 2d 70 72 65 70 20 7b 0a 20 20 63  -5.1 -prep {.  c
41e0: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
41f0: 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 73 71 6c 69  } -body {.  sqli
4200: 74 65 33 20 64 62 20 74 65 73 74 32 2e 64 62 0a  te3 db test2.db.
4210: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
4220: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 35 2e 32  st multiplex-5.2
4230: 20 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63 68   -prep {.  catch
4240: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 7d 20 2d 62   {db close}.} -b
4250: 6f 64 79 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  ody {.  sqlite3 
4260: 64 62 20 74 65 73 74 2e 64 62 0a 7d 0a 0a 63 61  db test.db.}..ca
4270: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
4280: 0a 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74  .multiplex_delet
4290: 65 20 74 65 73 74 2e 64 62 0a 6d 75 6c 74 69 70  e test.db.multip
42a0: 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74 32  lex_delete test2
42b0: 2e 64 62 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  .db..do_test mul
42c0: 74 69 70 6c 65 78 2d 35 2e 33 2e 70 72 65 70 20  tiplex-5.3.prep 
42d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
42e0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
42f0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
4300: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20  to_vacuum = 1;. 
4310: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
4320: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
4330: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
4340: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
4350: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4360: 28 31 30 2c 20 7a 65 72 6f 62 6c 6f 62 28 31 32  (10, zeroblob(12
4370: 30 30 29 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c  00));.  }.  faul
4380: 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c  tsim_save_and_cl
4390: 6f 73 65 0a 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c  ose.} {}.do_faul
43a0: 74 73 69 6d 5f 74 65 73 74 20 6d 75 6c 74 69 70  tsim_test multip
43b0: 6c 65 78 2d 35 2e 33 20 2d 70 72 65 70 20 7b 0a  lex-5.3 -prep {.
43c0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
43d0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20  re_and_reopen.} 
43e0: 2d 62 6f 64 79 20 7b 0a 20 20 65 78 65 63 73 71  -body {.  execsq
43f0: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
4400: 74 31 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  t1 }.}..do_test 
4410: 6d 75 6c 74 69 70 6c 65 78 2d 35 2e 34 2e 31 20  multiplex-5.4.1 
4420: 7b 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63  {.  catch { db c
4430: 6c 6f 73 65 20 7d 0a 20 20 6d 75 6c 74 69 70 6c  lose }.  multipl
4440: 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74 2e 64  ex_delete test.d
4450: 62 0a 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 74  b.  file mkdir t
4460: 65 73 74 2e 64 62 0a 20 20 6c 69 73 74 20 5b 63  est.db.  list [c
4470: 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33 20 64  atch { sqlite3 d
4480: 62 20 74 65 73 74 2e 64 62 20 7d 20 6d 73 67 5d  b test.db } msg]
4490: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 75 6e 61 62   $msg.} {1 {unab
44a0: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
44b0: 61 73 65 20 66 69 6c 65 7d 7d 0a 63 61 74 63 68  ase file}}.catch
44c0: 20 7b 20 64 65 6c 65 74 65 5f 66 69 6c 65 20 74   { delete_file t
44d0: 65 73 74 2e 64 62 20 7d 0a 0a 64 6f 5f 66 61 75  est.db }..do_fau
44e0: 6c 74 73 69 6d 5f 74 65 73 74 20 6d 75 6c 74 69  ltsim_test multi
44f0: 70 6c 65 78 2d 35 2e 35 20 2d 70 72 65 70 20 7b  plex-5.5 -prep {
4500: 0a 20 20 63 61 74 63 68 20 7b 20 73 71 6c 69 74  .  catch { sqlit
4510: 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75  e3_multiplex_shu
4520: 74 64 6f 77 6e 20 7d 0a 7d 20 2d 62 6f 64 79 20  tdown }.} -body 
4530: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74  {.  sqlite3_mult
4540: 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65  iplex_initialize
4550: 20 22 22 20 31 0a 20 20 6d 75 6c 74 69 70 6c 65   "" 1.  multiple
4560: 78 5f 73 65 74 20 64 62 20 6d 61 69 6e 20 33 32  x_set db main 32
4570: 37 36 38 20 31 36 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  768 16.}..#-----
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45c0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
45d0: 20 79 6f 75 20 63 61 6e 20 76 61 63 75 75 6d 20   you can vacuum 
45e0: 61 20 6d 75 6c 74 69 70 6c 65 78 27 65 64 20 44  a multiplex'ed D
45f0: 42 2e 20 20 0a 0a 69 66 63 61 70 61 62 6c 65 20  B.  ..ifcapable 
4600: 76 61 63 75 75 6d 20 7b 0a 0a 73 71 6c 69 74 65  vacuum {..sqlite
4610: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74  3_multiplex_shut
4620: 64 6f 77 6e 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  down.do_test mul
4630: 74 69 70 6c 65 78 2d 36 2e 30 2e 30 20 7b 0a 20  tiplex-6.0.0 {. 
4640: 20 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74   multiplex_delet
4650: 65 20 74 65 73 74 2e 64 62 0a 20 20 6d 75 6c 74  e test.db.  mult
4660: 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73  iplex_delete tes
4670: 74 2e 78 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  t.x.  sqlite3_mu
4680: 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69  ltiplex_initiali
4690: 7a 65 20 22 22 20 31 0a 20 20 73 71 6c 69 74 65  ze "" 1.  sqlite
46a0: 33 20 64 62 20 74 65 73 74 2e 78 0a 20 20 6d 75  3 db test.x.  mu
46b0: 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62 20 6d  ltiplex_set db m
46c0: 61 69 6e 20 34 30 39 36 20 31 36 0a 7d 20 7b 53  ain 4096 16.} {S
46d0: 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65  QLITE_OK}..do_te
46e0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 36 2e 31  st multiplex-6.1
46f0: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
4700: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
4710: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20  _size=1024;.    
4720: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
4730: 6f 64 65 3d 44 45 4c 45 54 45 3b 0a 20 20 20 20  ode=DELETE;.    
4740: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
4750: 75 6d 3d 4f 46 46 3b 0a 20 20 7d 0a 20 20 65 78  um=OFF;.  }.  ex
4760: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
4770: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
4780: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4790: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
47a0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 24 67 5f 63 68  randomblob($g_ch
47b0: 75 6e 6b 5f 73 69 7a 65 29 29 3b 0a 20 20 20 20  unk_size));.    
47c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
47d0: 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62  ALUES(2, randomb
47e0: 6c 6f 62 28 24 67 5f 63 68 75 6e 6b 5f 73 69 7a  lob($g_chunk_siz
47f0: 65 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  e));.  }.} {}.do
4800: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
4810: 36 2e 32 2e 31 20 7b 20 66 69 6c 65 20 73 69 7a  6.2.1 { file siz
4820: 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d  e [multiplex_nam
4830: 65 20 74 65 73 74 2e 78 20 30 5d 20 7d 20 5b 6c  e test.x 0] } [l
4840: 69 73 74 20 24 67 5f 63 68 75 6e 6b 5f 73 69 7a  ist $g_chunk_siz
4850: 65 5d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  e].do_test multi
4860: 70 6c 65 78 2d 36 2e 32 2e 32 20 7b 20 66 69 6c  plex-6.2.2 { fil
4870: 65 20 73 69 7a 65 20 5b 6d 75 6c 74 69 70 6c 65  e size [multiple
4880: 78 5f 6e 61 6d 65 20 74 65 73 74 2e 78 20 31 5d  x_name test.x 1]
4890: 20 7d 20 5b 6c 69 73 74 20 24 67 5f 63 68 75 6e   } [list $g_chun
48a0: 6b 5f 73 69 7a 65 5d 0a 0a 64 6f 5f 74 65 73 74  k_size]..do_test
48b0: 20 6d 75 6c 74 69 70 6c 65 78 2d 36 2e 33 2e 30   multiplex-6.3.0
48c0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 56   {.  execsql { V
48d0: 41 43 55 55 4d 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f  ACUUM }.} {}..do
48e0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
48f0: 36 2e 39 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73  6.99 {.  db clos
4900: 65 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f 64 65  e.  multiplex_de
4910: 6c 65 74 65 20 74 65 73 74 2e 78 0a 20 20 73 71  lete test.x.  sq
4920: 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f  lite3_multiplex_
4930: 73 68 75 74 64 6f 77 6e 0a 7d 20 7b 53 51 4c 49  shutdown.} {SQLI
4940: 54 45 5f 4f 4b 7d 0a 0a 7d 0a 0a 0a 63 61 74 63  TE_OK}..}...catc
4950: 68 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74  h { sqlite3_mult
4960: 69 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 20 7d  iplex_shutdown }
4970: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.