/ Hex Artifact Content
Login

Artifact 770f0295dd6673e60458cb93abd033ed2f253291:


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 73 65 74 20 67  ommon.tcl..set g
01d0: 5f 63 68 75 6e 6b 5f 73 69 7a 65 20 5b 20 65 78  _chunk_size [ ex
01e0: 70 72 20 28 24 3a 3a 53 51 4c 49 54 45 5f 4d 41  pr ($::SQLITE_MA
01f0: 58 5f 50 41 47 45 5f 53 49 5a 45 2a 31 36 33 38  X_PAGE_SIZE*1638
0200: 34 29 20 5d 0a 73 65 74 20 67 5f 6d 61 78 5f 63  4) ].set g_max_c
0210: 68 75 6e 6b 73 20 33 32 0a 0a 23 20 54 68 69 73  hunks 32..# This
0220: 20 68 61 6e 64 6c 65 73 20 61 70 70 65 6e 64 69   handles appendi
0230: 6e 67 20 74 68 65 20 63 68 75 6e 6b 20 6e 75 6d  ng the chunk num
0240: 62 65 72 0a 23 20 74 6f 20 74 68 65 20 65 6e 64  ber.# to the end
0250: 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
0260: 2e 20 20 69 66 20 0a 23 20 53 51 4c 49 54 45 5f  .  if .# SQLITE_
0270: 4d 55 4c 54 49 50 4c 45 58 5f 45 58 54 5f 4f 56  MULTIPLEX_EXT_OV
0280: 57 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  WR is defined, t
0290: 68 65 6e 0a 23 20 69 74 20 6f 76 65 72 77 72 69  hen.# it overwri
02a0: 74 65 73 20 74 68 65 20 6c 61 73 74 20 32 20 62  tes the last 2 b
02b0: 79 74 65 73 20 6f 66 20 74 68 65 20 0a 23 20 66  ytes of the .# f
02c0: 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68  ile name with th
02d0: 65 20 63 68 75 6e 6b 20 6e 75 6d 62 65 72 2e 0a  e chunk number..
02e0: 70 72 6f 63 20 6d 75 6c 74 69 70 6c 65 78 5f 6e  proc multiplex_n
02f0: 61 6d 65 20 7b 6e 61 6d 65 20 63 68 75 6e 6b 7d  ame {name chunk}
0300: 20 7b 0a 20 20 69 66 20 7b 24 63 68 75 6e 6b 3d   {.  if {$chunk=
0310: 3d 30 7d 20 7b 20 72 65 74 75 72 6e 20 24 6e 61  =0} { return $na
0320: 6d 65 20 7d 0a 20 20 73 65 74 20 6e 75 6d 20 5b  me }.  set num [
0330: 66 6f 72 6d 61 74 20 22 25 30 33 64 22 20 24 63  format "%03d" $c
0340: 68 75 6e 6b 5d 0a 20 20 69 66 63 61 70 61 62 6c  hunk].  ifcapabl
0350: 65 20 7b 6d 75 6c 74 69 70 6c 65 78 5f 65 78 74  e {multiplex_ext
0360: 5f 6f 76 65 72 77 72 69 74 65 7d 20 7b 0a 20 20  _overwrite} {.  
0370: 20 20 73 65 74 20 6e 61 6d 65 20 5b 73 74 72 69    set name [stri
0380: 6e 67 20 72 61 6e 67 65 20 24 6e 61 6d 65 20 30  ng range $name 0
0390: 20 5b 65 78 70 72 20 5b 73 74 72 69 6e 67 20 6c   [expr [string l
03a0: 65 6e 67 74 68 20 24 6e 61 6d 65 5d 2d 32 2d 31  ength $name]-2-1
03b0: 5d 5d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ]].  }.  return 
03c0: 24 6e 61 6d 65 24 6e 75 6d 0a 7d 0a 0a 23 20 54  $name$num.}..# T
03d0: 68 69 73 20 73 61 76 65 73 20 6f 66 66 20 74 68  his saves off th
03e0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64  e parameters and
03f0: 20 63 61 6c 6c 73 20 74 68 65 20 0a 23 20 75 6e   calls the .# un
0400: 64 65 72 6c 79 69 6e 67 20 73 71 6c 69 74 65 33  derlying sqlite3
0410: 5f 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72  _multiplex_contr
0420: 6f 6c 28 29 20 41 50 49 2e 0a 70 72 6f 63 20 6d  ol() API..proc m
0430: 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 7b 64 62  ultiplex_set {db
0440: 20 6e 61 6d 65 20 63 68 75 6e 6b 5f 73 69 7a 65   name chunk_size
0450: 20 6d 61 78 5f 63 68 75 6e 6b 73 7d 20 7b 0a 20   max_chunks} {. 
0460: 20 67 6c 6f 62 61 6c 20 67 5f 63 68 75 6e 6b 5f   global g_chunk_
0470: 73 69 7a 65 0a 20 20 67 6c 6f 62 61 6c 20 67 5f  size.  global g_
0480: 6d 61 78 5f 63 68 75 6e 6b 73 0a 20 20 73 65 74  max_chunks.  set
0490: 20 67 5f 63 68 75 6e 6b 5f 73 69 7a 65 20 5b 20   g_chunk_size [ 
04a0: 65 78 70 72 20 28 28 24 63 68 75 6e 6b 5f 73 69  expr (($chunk_si
04b0: 7a 65 2b 28 24 3a 3a 53 51 4c 49 54 45 5f 4d 41  ze+($::SQLITE_MA
04c0: 58 5f 50 41 47 45 5f 53 49 5a 45 2d 31 29 29 20  X_PAGE_SIZE-1)) 
04d0: 26 20 7e 28 24 3a 3a 53 51 4c 49 54 45 5f 4d 41  & ~($::SQLITE_MA
04e0: 58 5f 50 41 47 45 5f 53 49 5a 45 2d 31 29 29 20  X_PAGE_SIZE-1)) 
04f0: 5d 0a 20 20 73 65 74 20 67 5f 6d 61 78 5f 63 68  ].  set g_max_ch
0500: 75 6e 6b 73 20 24 6d 61 78 5f 63 68 75 6e 6b 73  unks $max_chunks
0510: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
0520: 20 7b 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70   {sqlite3_multip
0530: 6c 65 78 5f 63 6f 6e 74 72 6f 6c 20 24 64 62 20  lex_control $db 
0540: 24 6e 61 6d 65 20 63 68 75 6e 6b 5f 73 69 7a 65  $name chunk_size
0550: 20 24 63 68 75 6e 6b 5f 73 69 7a 65 7d 20 6d 73   $chunk_size} ms
0560: 67 5d 0a 20 20 69 66 20 7b 20 24 72 63 3d 3d 30  g].  if { $rc==0
0570: 20 7d 20 7b 20 0a 20 20 20 20 73 65 74 20 72 63   } { .    set rc
0580: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
0590: 5f 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72  _multiplex_contr
05a0: 6f 6c 20 24 64 62 20 24 6e 61 6d 65 20 6d 61 78  ol $db $name max
05b0: 5f 63 68 75 6e 6b 73 20 24 6d 61 78 5f 63 68 75  _chunks $max_chu
05c0: 6e 6b 73 7d 20 6d 73 67 5d 0a 20 20 7d 0a 20 20  nks} msg].  }.  
05d0: 6c 69 73 74 20 24 6d 73 67 0a 7d 0a 0a 23 20 54  list $msg.}..# T
05e0: 68 69 73 20 61 74 74 65 6d 70 74 73 20 74 6f 20  his attempts to 
05f0: 64 65 6c 65 74 65 20 74 68 65 20 62 61 73 65 20  delete the base 
0600: 66 69 6c 65 20 61 6e 64 20 0a 23 20 61 6e 64 20  file and .# and 
0610: 66 69 6c 65 73 20 77 69 74 68 20 74 68 65 20 63  files with the c
0620: 68 75 6e 6b 20 65 78 74 65 6e 73 69 6f 6e 2e 0a  hunk extension..
0630: 70 72 6f 63 20 6d 75 6c 74 69 70 6c 65 78 5f 64  proc multiplex_d
0640: 65 6c 65 74 65 20 7b 6e 61 6d 65 7d 20 7b 0a 20  elete {name} {. 
0650: 20 67 6c 6f 62 61 6c 20 67 5f 6d 61 78 5f 63 68   global g_max_ch
0660: 75 6e 6b 73 0a 20 20 66 6f 72 63 65 64 65 6c 65  unks.  forcedele
0670: 74 65 20 24 6e 61 6d 65 0a 20 20 66 6f 72 20 7b  te $name.  for {
0680: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 24 67 5f  set i 0} {$i<$g_
0690: 6d 61 78 5f 63 68 75 6e 6b 73 7d 20 7b 69 6e 63  max_chunks} {inc
06a0: 72 20 69 7d 20 7b 0a 20 20 20 20 66 6f 72 63 65  r i} {.    force
06b0: 64 65 6c 65 74 65 20 5b 6d 75 6c 74 69 70 6c 65  delete [multiple
06c0: 78 5f 6e 61 6d 65 20 24 6e 61 6d 65 20 24 69 5d  x_name $name $i]
06d0: 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
06e0: 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d 65   [multiplex_name
06f0: 20 24 6e 61 6d 65 2d 6a 6f 75 72 6e 61 6c 20 24   $name-journal $
0700: 69 5d 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65  i].    forcedele
0710: 74 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61  te [multiplex_na
0720: 6d 65 20 24 6e 61 6d 65 2d 77 61 6c 20 24 69 5d  me $name-wal $i]
0730: 0a 20 20 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65  .  }.}..db close
0740: 0a 0a 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65  ..multiplex_dele
0750: 74 65 20 74 65 73 74 2e 64 62 0a 6d 75 6c 74 69  te test.db.multi
0760: 70 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74  plex_delete test
0770: 32 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  2.db..#---------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 0a 23 20 20 20 6d 75 6c 74 69 70 6c 65 78 2d 31  .#   multiplex-1
07d0: 2e 31 2e 2a 3a 20 54 65 73 74 20 69 6e 69 74 69  .1.*: Test initi
07e0: 61 6c 69 7a 65 20 61 6e 64 20 73 68 75 74 64 6f  alize and shutdo
07f0: 77 6e 2e 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  wn...do_test mul
0800: 74 69 70 6c 65 78 2d 31 2e 31 20 7b 20 73 71 6c  tiplex-1.1 { sql
0810: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69  ite3_multiplex_i
0820: 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 73 75 63 68  nitialize nosuch
0830: 76 66 73 20 31 20 7d 20 7b 53 51 4c 49 54 45 5f  vfs 1 } {SQLITE_
0840: 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 6d  ERROR}.do_test m
0850: 75 6c 74 69 70 6c 65 78 2d 31 2e 32 20 7b 20 73  ultiplex-1.2 { s
0860: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
0870: 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31  _initialize "" 1
0880: 20 7d 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54   }        {SQLIT
0890: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  E_OK}.do_test mu
08a0: 6c 74 69 70 6c 65 78 2d 31 2e 33 20 7b 20 73 71  ltiplex-1.3 { sq
08b0: 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f  lite3_multiplex_
08c0: 69 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31 20  initialize "" 1 
08d0: 7d 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45  }        {SQLITE
08e0: 5f 4d 49 53 55 53 45 7d 0a 64 6f 5f 74 65 73 74  _MISUSE}.do_test
08f0: 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 34 20 7b   multiplex-1.4 {
0900: 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c   sqlite3_multipl
0910: 65 78 5f 73 68 75 74 64 6f 77 6e 20 7d 20 20 20  ex_shutdown }   
0920: 20 20 20 20 20 20 20 20 20 20 20 20 7b 53 51 4c              {SQL
0930: 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74  ITE_OK}..do_test
0940: 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 35 20 7b   multiplex-1.5 {
0950: 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c   sqlite3_multipl
0960: 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22 22  ex_initialize ""
0970: 20 30 20 7d 20 20 20 20 20 20 20 20 7b 53 51 4c   0 }        {SQL
0980: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
0990: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 36 20 7b 20  multiplex-1.6 { 
09a0: 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65  sqlite3_multiple
09b0: 78 5f 73 68 75 74 64 6f 77 6e 20 7d 20 20 20 20  x_shutdown }    
09c0: 20 20 20 20 20 20 20 20 20 20 20 7b 53 51 4c 49             {SQLI
09d0: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d  TE_OK}.do_test m
09e0: 75 6c 74 69 70 6c 65 78 2d 31 2e 37 20 7b 20 73  ultiplex-1.7 { s
09f0: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
0a00: 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31  _initialize "" 1
0a10: 20 7d 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54   }        {SQLIT
0a20: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  E_OK}.do_test mu
0a30: 6c 74 69 70 6c 65 78 2d 31 2e 38 20 7b 20 73 71  ltiplex-1.8 { sq
0a40: 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f  lite3_multiplex_
0a50: 73 68 75 74 64 6f 77 6e 20 7d 20 20 20 20 20 20  shutdown }      
0a60: 20 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45           {SQLITE
0a70: 5f 4f 4b 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 6d  _OK}...do_test m
0a80: 75 6c 74 69 70 6c 65 78 2d 31 2e 39 2e 31 20 20  ultiplex-1.9.1  
0a90: 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70  { sqlite3_multip
0aa0: 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22  lex_initialize "
0ab0: 22 20 31 20 7d 20 20 20 20 20 7b 53 51 4c 49 54  " 1 }     {SQLIT
0ac0: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  E_OK}.do_test mu
0ad0: 6c 74 69 70 6c 65 78 2d 31 2e 39 2e 32 20 20 7b  ltiplex-1.9.2  {
0ae0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
0af0: 2e 64 62 20 7d 20 20 20 20 20 20 20 20 20 20 20  .db }           
0b00: 20 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f 74           {}.do_t
0b10: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e  est multiplex-1.
0b20: 39 2e 33 20 20 7b 20 6d 75 6c 74 69 70 6c 65 78  9.3  { multiplex
0b30: 5f 73 65 74 20 64 62 20 6d 61 69 6e 20 33 32 37  _set db main 327
0b40: 36 38 20 31 36 20 7d 20 20 20 20 20 20 20 20 7b  68 16 }        {
0b50: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
0b60: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 39  st multiplex-1.9
0b70: 2e 34 20 20 7b 20 6d 75 6c 74 69 70 6c 65 78 5f  .4  { multiplex_
0b80: 73 65 74 20 64 62 20 6d 61 69 6e 20 33 32 37 36  set db main 3276
0b90: 38 20 2d 31 20 7d 20 20 20 20 20 20 20 20 7b 53  8 -1 }        {S
0ba0: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
0bb0: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 39 2e  t multiplex-1.9.
0bc0: 36 20 20 7b 20 6d 75 6c 74 69 70 6c 65 78 5f 73  6  { multiplex_s
0bd0: 65 74 20 64 62 20 6d 61 69 6e 20 33 31 20 31 36  et db main 31 16
0be0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 7b 53 51   }           {SQ
0bf0: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
0c00: 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 39 2e 37   multiplex-1.9.7
0c10: 20 20 7b 20 6d 75 6c 74 69 70 6c 65 78 5f 73 65    { multiplex_se
0c20: 74 20 64 62 20 6d 61 69 6e 20 33 32 37 36 38 20  t db main 32768 
0c30: 31 30 30 20 7d 20 20 20 20 20 20 20 7b 53 51 4c  100 }       {SQL
0c40: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
0c50: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 39 2e 38 20  multiplex-1.9.8 
0c60: 20 7b 20 6d 75 6c 74 69 70 6c 65 78 5f 73 65 74   { multiplex_set
0c70: 20 64 62 20 6d 61 69 6e 20 31 30 37 33 37 34 31   db main 1073741
0c80: 38 32 34 20 31 20 7d 20 20 20 20 7b 53 51 4c 49  824 1 }    {SQLI
0c90: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d  TE_OK}.do_test m
0ca0: 75 6c 74 69 70 6c 65 78 2d 31 2e 39 2e 39 20 20  ultiplex-1.9.9  
0cb0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 20 20 20 20  { db close }    
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f            {}.do_
0ce0: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31  test multiplex-1
0cf0: 2e 39 2e 31 30 20 7b 20 73 71 6c 69 74 65 33 5f  .9.10 { sqlite3_
0d00: 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f  multiplex_shutdo
0d10: 77 6e 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  wn }            
0d20: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f  {SQLITE_OK}..do_
0d30: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31  test multiplex-1
0d40: 2e 31 30 2e 31 20 20 7b 20 73 71 6c 69 74 65 33  .10.1  { sqlite3
0d50: 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69  _multiplex_initi
0d60: 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20 20  alize "" 1 }    
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 53                {S
0d90: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
0da0: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 30  t multiplex-1.10
0db0: 2e 32 20 20 7b 20 73 71 6c 69 74 65 33 20 64 62  .2  { sqlite3 db
0dc0: 20 74 65 73 74 2e 64 62 20 7d 20 20 20 20 20 20   test.db }      
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f             {}.do
0e00: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
0e10: 31 2e 31 30 2e 33 20 20 7b 20 6c 69 6e 64 65 78  1.10.3  { lindex
0e20: 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45   [ catchsql { SE
0e30: 4c 45 43 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63  LECT multiplex_c
0e40: 6f 6e 74 72 6f 6c 28 32 2c 20 33 32 37 36 38 29  ontrol(2, 32768)
0e50: 3b 20 7d 20 5d 20 30 20 7d 20 20 20 20 20 20 7b  ; } ] 0 }      {
0e60: 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  0}.do_test multi
0e70: 70 6c 65 78 2d 31 2e 31 30 2e 34 20 20 7b 20 6c  plex-1.10.4  { l
0e80: 69 6e 64 65 78 20 5b 20 63 61 74 63 68 73 71 6c  index [ catchsql
0e90: 20 7b 20 53 45 4c 45 43 54 20 6d 75 6c 74 69 70   { SELECT multip
0ea0: 6c 65 78 5f 63 6f 6e 74 72 6f 6c 28 33 2c 20 2d  lex_control(3, -
0eb0: 31 29 3b 20 7d 20 5d 20 30 20 7d 20 20 20 20 20  1); } ] 0 }     
0ec0: 20 20 20 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20      {0}.do_test 
0ed0: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 30 2e 36  multiplex-1.10.6
0ee0: 20 20 7b 20 6c 69 6e 64 65 78 20 5b 20 63 61 74    { lindex [ cat
0ef0: 63 68 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 6d  chsql { SELECT m
0f00: 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c  ultiplex_control
0f10: 28 32 2c 20 33 31 29 3b 20 7d 20 5d 20 30 20 7d  (2, 31); } ] 0 }
0f20: 20 20 20 20 20 20 20 20 20 7b 30 7d 0a 64 6f 5f           {0}.do_
0f30: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31  test multiplex-1
0f40: 2e 31 30 2e 37 20 20 7b 20 6c 69 6e 64 65 78 20  .10.7  { lindex 
0f50: 5b 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c  [ catchsql { SEL
0f60: 45 43 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f  ECT multiplex_co
0f70: 6e 74 72 6f 6c 28 33 2c 20 31 30 30 29 3b 20 7d  ntrol(3, 100); }
0f80: 20 5d 20 30 20 7d 20 20 20 20 20 20 20 20 7b 30   ] 0 }        {0
0f90: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
0fa0: 6c 65 78 2d 31 2e 31 30 2e 38 20 20 7b 20 6c 69  lex-1.10.8  { li
0fb0: 6e 64 65 78 20 5b 20 63 61 74 63 68 73 71 6c 20  ndex [ catchsql 
0fc0: 7b 20 53 45 4c 45 43 54 20 6d 75 6c 74 69 70 6c  { SELECT multipl
0fd0: 65 78 5f 63 6f 6e 74 72 6f 6c 28 32 2c 20 31 30  ex_control(2, 10
0fe0: 37 33 37 34 31 38 32 34 29 3b 20 7d 20 5d 20 30  73741824); } ] 0
0ff0: 20 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 6d   } {0}.do_test m
1000: 75 6c 74 69 70 6c 65 78 2d 31 2e 31 30 2e 39 20  ultiplex-1.10.9 
1010: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 20 20 20   { db close }   
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1050: 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f 74 65          {}.do_te
1060: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31  st multiplex-1.1
1070: 30 2e 31 30 20 7b 20 73 71 6c 69 74 65 33 5f 6d  0.10 { sqlite3_m
1080: 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77  ultiplex_shutdow
1090: 6e 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  n }             
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 53 51 4c              {SQL
10c0: 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74  ITE_OK}..do_test
10d0: 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 31 2e   multiplex-1.11.
10e0: 31 20 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c  1  { sqlite3_mul
10f0: 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a  tiplex_initializ
1100: 65 20 22 22 20 31 20 7d 20 20 20 20 20 20 20 20  e "" 1 }        
1110: 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f         {SQLITE_O
1120: 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  K}.do_test multi
1130: 70 6c 65 78 2d 31 2e 31 31 2e 32 20 20 7b 20 73  plex-1.11.2  { s
1140: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1150: 62 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  b }             
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74   {}.do_test mult
1180: 69 70 6c 65 78 2d 31 2e 31 31 2e 33 20 20 7b 20  iplex-1.11.3  { 
1190: 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65  sqlite3_multiple
11a0: 78 5f 63 6f 6e 74 72 6f 6c 20 64 62 20 6d 61 69  x_control db mai
11b0: 6e 20 65 6e 61 62 6c 65 20 30 20 20 7d 20 20 20  n enable 0  }   
11c0: 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f    {SQLITE_OK}.do
11d0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
11e0: 31 2e 31 31 2e 34 20 20 7b 20 73 71 6c 69 74 65  1.11.4  { sqlite
11f0: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 63 6f 6e 74  3_multiplex_cont
1200: 72 6f 6c 20 64 62 20 6d 61 69 6e 20 65 6e 61 62  rol db main enab
1210: 6c 65 20 31 20 20 7d 20 20 20 20 20 7b 53 51 4c  le 1  }     {SQL
1220: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
1230: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 31 2e 35  multiplex-1.11.5
1240: 20 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74    { sqlite3_mult
1250: 69 70 6c 65 78 5f 63 6f 6e 74 72 6f 6c 20 64 62  iplex_control db
1260: 20 6d 61 69 6e 20 65 6e 61 62 6c 65 20 2d 31 20   main enable -1 
1270: 7d 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b  }     {SQLITE_OK
1280: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
1290: 6c 65 78 2d 31 2e 31 31 2e 36 20 20 7b 20 64 62  lex-1.11.6  { db
12a0: 20 63 6c 6f 73 65 20 7d 20 20 20 20 20 20 20 20   close }        
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 20 20 20 20 20 20                  
12d0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  {}.do_test multi
12e0: 70 6c 65 78 2d 31 2e 31 31 2e 37 20 20 7b 20 73  plex-1.11.7  { s
12f0: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
1300: 5f 73 68 75 74 64 6f 77 6e 20 7d 20 20 20 20 20  _shutdown }     
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f   {SQLITE_OK}..do
1330: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
1340: 31 2e 31 32 2e 31 20 20 7b 20 73 71 6c 69 74 65  1.12.1  { sqlite
1350: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74  3_multiplex_init
1360: 69 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20  ialize "" 1 }   
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f          {SQLITE_
1390: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  OK}.do_test mult
13a0: 69 70 6c 65 78 2d 31 2e 31 32 2e 32 20 20 7b 20  iplex-1.12.2  { 
13b0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
13c0: 64 62 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  db }            
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d                {}
13f0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
1400: 65 78 2d 31 2e 31 32 2e 33 20 20 7b 20 6c 69 6e  ex-1.12.3  { lin
1410: 64 65 78 20 5b 20 63 61 74 63 68 73 71 6c 20 7b  dex [ catchsql {
1420: 20 53 45 4c 45 43 54 20 6d 75 6c 74 69 70 6c 65   SELECT multiple
1430: 78 5f 63 6f 6e 74 72 6f 6c 28 31 2c 20 30 29 3b  x_control(1, 0);
1440: 20 7d 20 5d 20 30 20 7d 20 20 20 7b 30 7d 0a 64   } ] 0 }   {0}.d
1450: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
1460: 2d 31 2e 31 32 2e 34 20 20 7b 20 6c 69 6e 64 65  -1.12.4  { linde
1470: 78 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 20 53  x [ catchsql { S
1480: 45 4c 45 43 54 20 6d 75 6c 74 69 70 6c 65 78 5f  ELECT multiplex_
1490: 63 6f 6e 74 72 6f 6c 28 31 2c 20 31 29 3b 20 7d  control(1, 1); }
14a0: 20 5d 20 30 20 7d 20 20 20 7b 30 7d 0a 64 6f 5f   ] 0 }   {0}.do_
14b0: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31  test multiplex-1
14c0: 2e 31 32 2e 35 20 20 7b 20 6c 69 6e 64 65 78 20  .12.5  { lindex 
14d0: 5b 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c  [ catchsql { SEL
14e0: 45 43 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f  ECT multiplex_co
14f0: 6e 74 72 6f 6c 28 31 2c 20 2d 31 29 3b 20 7d 20  ntrol(1, -1); } 
1500: 5d 20 30 20 7d 20 20 7b 30 7d 0a 64 6f 5f 74 65  ] 0 }  {0}.do_te
1510: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31  st multiplex-1.1
1520: 32 2e 36 20 20 7b 20 64 62 20 63 6c 6f 73 65 20  2.6  { db close 
1530: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 7b 7d 0a 64 6f 5f 74 65 73 74 20       {}.do_test 
1570: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 32 2e 37  multiplex-1.12.7
1580: 20 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74    { sqlite3_mult
1590: 69 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 20 7d  iplex_shutdown }
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64    {SQLITE_OK}..d
15d0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
15e0: 2d 31 2e 31 33 2e 31 20 20 7b 20 73 71 6c 69 74  -1.13.1  { sqlit
15f0: 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69  e3_multiplex_ini
1600: 74 69 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20  tialize "" 1 }  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45           {SQLITE
1630: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  _OK}.do_test mul
1640: 74 69 70 6c 65 78 2d 31 2e 31 33 2e 32 20 20 7b  tiplex-1.13.2  {
1650: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
1660: 2e 64 62 20 7d 20 20 20 20 20 20 20 20 20 20 20  .db }           
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1690: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
16a0: 6c 65 78 2d 31 2e 31 33 2e 33 20 20 7b 20 6c 69  lex-1.13.3  { li
16b0: 6e 64 65 78 20 5b 20 63 61 74 63 68 73 71 6c 20  ndex [ catchsql 
16c0: 7b 20 53 45 4c 45 43 54 20 6d 75 6c 74 69 70 6c  { SELECT multipl
16d0: 65 78 5f 63 6f 6e 74 72 6f 6c 28 2d 31 2c 20 30  ex_control(-1, 0
16e0: 29 3b 20 7d 20 5d 20 30 20 7d 20 20 7b 31 7d 0a  ); } ] 0 }  {1}.
16f0: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
1700: 78 2d 31 2e 31 33 2e 34 20 20 7b 20 6c 69 6e 64  x-1.13.4  { lind
1710: 65 78 20 5b 20 63 61 74 63 68 73 71 6c 20 7b 20  ex [ catchsql { 
1720: 53 45 4c 45 43 54 20 6d 75 6c 74 69 70 6c 65 78  SELECT multiplex
1730: 5f 63 6f 6e 74 72 6f 6c 28 34 2c 20 31 29 3b 20  _control(4, 1); 
1740: 7d 20 5d 20 30 20 7d 20 20 20 7b 31 7d 0a 64 6f  } ] 0 }   {1}.do
1750: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
1760: 31 2e 31 33 2e 36 20 20 7b 20 64 62 20 63 6c 6f  1.13.6  { db clo
1770: 73 65 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  se }            
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f 5f 74 65          {}.do_te
17b0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31  st multiplex-1.1
17c0: 33 2e 37 20 20 7b 20 73 71 6c 69 74 65 33 5f 6d  3.7  { sqlite3_m
17d0: 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77  ultiplex_shutdow
17e0: 6e 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  n }             
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
1810: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53  ------------.# S
1860: 6f 6d 65 20 73 69 6d 70 6c 65 20 77 61 72 6d 2d  ome simple warm-
1870: 62 6f 64 79 20 74 65 73 74 73 20 77 69 74 68 20  body tests with 
1880: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1890: 65 20 66 69 6c 65 20 69 6e 20 72 6f 6c 6c 62 61  e file in rollba
18a0: 63 6b 20 0a 23 20 6d 6f 64 65 3a 0a 23 0a 23 20  ck .# mode:.#.# 
18b0: 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 31 2e    multiplex-2.1.
18c0: 2a 3a 20 54 65 73 74 20 73 69 6d 70 6c 65 20 77  *: Test simple w
18d0: 72 69 74 69 6e 67 20 74 6f 20 61 20 6d 75 6c 74  riting to a mult
18e0: 69 70 6c 65 78 20 66 69 6c 65 2e 0a 23 0a 23 20  iplex file..#.# 
18f0: 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 32 2e    multiplex-2.2.
1900: 2a 3a 20 4d 6f 72 65 20 77 72 69 74 69 6e 67 2e  *: More writing.
1910: 0a 23 0a 23 20 20 20 6d 75 6c 74 69 70 6c 65 78  .#.#   multiplex
1920: 2d 32 2e 33 2e 2a 3a 20 4f 70 65 6e 20 61 6e 64  -2.3.*: Open and
1930: 20 63 6c 6f 73 65 20 61 20 73 65 63 6f 6e 64 20   close a second 
1940: 64 62 2e 0a 23 0a 23 20 20 20 6d 75 6c 74 69 70  db..#.#   multip
1950: 6c 65 78 2d 32 2e 34 2e 2a 3a 20 54 72 79 20 74  lex-2.4.*: Try t
1960: 6f 20 73 68 75 74 64 6f 77 6e 20 74 68 65 20 6d  o shutdown the m
1970: 75 6c 74 69 70 6c 65 78 20 73 79 73 74 65 6d 20  ultiplex system 
1980: 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 20 74  before closing t
1990: 68 65 20 64 62 0a 23 20 20 20 20 20 20 20 20 20  he db.#         
19a0: 20 20 20 20 20 20 20 66 69 6c 65 2e 20 43 68 65         file. Che
19b0: 63 6b 20 74 68 61 74 20 74 68 69 73 20 66 61 69  ck that this fai
19c0: 6c 73 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69  ls and the multi
19d0: 70 6c 65 78 20 73 79 73 74 65 6d 20 73 74 69 6c  plex system stil
19e0: 6c 20 77 6f 72 6b 73 0a 23 20 20 20 20 20 20 20  l works.#       
19f0: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 77 61           afterwa
1a00: 72 64 73 2e 20 54 68 65 6e 20 63 6c 6f 73 65 20  rds. Then close 
1a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1a20: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 68   successfully sh
1a30: 75 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ut.#            
1a40: 20 20 20 20 64 6f 77 6e 20 74 68 65 20 6d 75 6c      down the mul
1a50: 74 69 70 6c 65 78 20 73 79 73 74 65 6d 2e 0a 23  tiplex system..#
1a60: 0a 23 20 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32  .#   multiplex-2
1a70: 2e 35 2e 2a 3a 20 4d 6f 72 65 20 72 65 61 64 69  .5.*: More readi
1a80: 6e 67 2f 77 72 69 74 69 6e 67 2e 0a 23 0a 23 20  ng/writing..#.# 
1a90: 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 36 2e    multiplex-2.6.
1aa0: 2a 3a 20 4d 6f 72 65 20 72 65 61 64 69 6e 67 2f  *: More reading/
1ab0: 77 72 69 74 69 6e 67 20 77 69 74 68 20 76 61 72  writing with var
1ac0: 79 69 6e 67 20 73 6d 61 6c 6c 20 63 68 75 6e 6b  ying small chunk
1ad0: 20 73 69 7a 65 73 2c 20 61 73 0a 23 20 20 20 20   sizes, as.#    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 77 65 6c 6c              well
1af0: 20 61 73 20 76 61 72 79 69 6e 67 20 6a 6f 75 72   as varying jour
1b00: 6e 61 6c 20 6d 6f 64 65 2e 0a 23 0a 23 20 20 20  nal mode..#.#   
1b10: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 37 2e 2a 3a  multiplex-2.7.*:
1b20: 20 44 69 73 61 62 6c 65 2f 65 6e 61 62 6c 65 20   Disable/enable 
1b30: 74 65 73 74 73 2e 0a 23 0a 0a 73 71 6c 69 74 65  tests..#..sqlite
1b40: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74  3_multiplex_init
1b50: 69 61 6c 69 7a 65 20 22 22 20 31 0a 6d 75 6c 74  ialize "" 1.mult
1b60: 69 70 6c 65 78 5f 73 65 74 20 64 62 20 6d 61 69  iplex_set db mai
1b70: 6e 20 33 32 37 36 38 20 31 36 0a 0a 66 6f 72 63  n 32768 16..forc
1b80: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 78 0a 64  edelete test.x.d
1b90: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
1ba0: 2d 32 2e 31 2e 32 20 7b 0a 20 20 73 71 6c 69 74  -2.1.2 {.  sqlit
1bb0: 65 33 20 64 62 20 74 65 73 74 2e 78 0a 20 20 65  e3 db test.x.  e
1bc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
1bd0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30  GMA page_size=10
1be0: 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  24;.    PRAGMA a
1bf0: 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b 0a  uto_vacuum=OFF;.
1c00: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
1c10: 61 6c 5f 6d 6f 64 65 3d 44 45 4c 45 54 45 3b 0a  al_mode=DELETE;.
1c20: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
1c30: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1c40: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
1c50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1c60: 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(1, randombl
1c70: 6f 62 28 31 31 30 30 29 29 3b 0a 20 20 20 20 49  ob(1100));.    I
1c80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1c90: 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
1ca0: 6f 62 28 31 31 30 30 29 29 3b 0a 20 20 7d 0a 7d  ob(1100));.  }.}
1cb0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74   {}.do_test mult
1cc0: 69 70 6c 65 78 2d 32 2e 31 2e 33 20 7b 20 66 69  iplex-2.1.3 { fi
1cd0: 6c 65 20 73 69 7a 65 20 5b 6d 75 6c 74 69 70 6c  le size [multipl
1ce0: 65 78 5f 6e 61 6d 65 20 74 65 73 74 2e 78 20 30  ex_name test.x 0
1cf0: 5d 20 7d 20 7b 34 30 39 36 7d 0a 64 6f 5f 74 65  ] } {4096}.do_te
1d00: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 31  st multiplex-2.1
1d10: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
1d20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1d30: 56 41 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d  VALUES(3, random
1d40: 62 6c 6f 62 28 31 31 30 30 29 29 20 7d 0a 7d 20  blob(1100)) }.} 
1d50: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  {}..do_test mult
1d60: 69 70 6c 65 78 2d 32 2e 32 2e 31 20 7b 0a 20 20  iplex-2.2.1 {.  
1d70: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
1d80: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1d90: 33 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 31  3, randomblob(11
1da0: 30 30 29 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  00)) }.} {}.do_t
1db0: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e  est multiplex-2.
1dc0: 32 2e 33 20 7b 20 66 69 6c 65 20 73 69 7a 65 20  2.3 { file size 
1dd0: 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20  [multiplex_name 
1de0: 74 65 73 74 2e 78 20 30 5d 20 7d 20 7b 36 31 34  test.x 0] } {614
1df0: 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  4}..do_test mult
1e00: 69 70 6c 65 78 2d 32 2e 33 2e 31 20 7b 0a 20 20  iplex-2.3.1 {.  
1e10: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
1e20: 32 2e 78 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  2.x.  db2 close.
1e30: 7d 20 7b 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 6d  } {}...do_test m
1e40: 75 6c 74 69 70 6c 65 78 2d 32 2e 34 2e 31 20 7b  ultiplex-2.4.1 {
1e50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69  .  sqlite3_multi
1e60: 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 0a 7d 20  plex_shutdown.} 
1e70: 7b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 7d 0a  {SQLITE_MISUSE}.
1e80: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
1e90: 78 2d 32 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63  x-2.4.2 {.  exec
1ea0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1eb0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 72  O t1 VALUES(3, r
1ec0: 61 6e 64 6f 6d 62 6c 6f 62 28 31 31 30 30 29 29  andomblob(1100))
1ed0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
1ee0: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 34 2e 34 20  multiplex-2.4.4 
1ef0: 7b 20 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75 6c  { file size [mul
1f00: 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74  tiplex_name test
1f10: 2e 78 20 30 5d 20 7d 20 7b 37 31 36 38 7d 0a 64  .x 0] } {7168}.d
1f20: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
1f30: 2d 32 2e 34 2e 39 39 20 7b 0a 20 20 64 62 20 63  -2.4.99 {.  db c
1f40: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6d  lose.  sqlite3_m
1f50: 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77  ultiplex_shutdow
1f60: 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  n.} {SQLITE_OK}.
1f70: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  ..do_test multip
1f80: 6c 65 78 2d 32 2e 35 2e 31 20 7b 0a 20 20 6d 75  lex-2.5.1 {.  mu
1f90: 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 74  ltiplex_delete t
1fa0: 65 73 74 2e 78 0a 20 20 73 71 6c 69 74 65 33 5f  est.x.  sqlite3_
1fb0: 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61  multiplex_initia
1fc0: 6c 69 7a 65 20 22 22 20 31 0a 20 20 73 71 6c 69  lize "" 1.  sqli
1fd0: 74 65 33 20 64 62 20 74 65 73 74 2e 78 0a 20 20  te3 db test.x.  
1fe0: 6d 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62  multiplex_set db
1ff0: 20 6d 61 69 6e 20 34 30 39 36 20 31 36 0a 7d 20   main 4096 16.} 
2000: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f  {SQLITE_OK}..do_
2010: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32  test multiplex-2
2020: 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.2 {.  execsql
2030: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
2040: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
2050: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
2060: 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74 65  al_mode = delete
2070: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
2080: 6f 5f 76 61 63 75 75 6d 20 3d 20 6f 66 66 3b 0a  o_vacuum = off;.
2090: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
20a0: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
20b0: 59 2c 20 62 29 3b 0a 20 20 7d 0a 7d 20 7b 64 65  Y, b);.  }.} {de
20c0: 6c 65 74 65 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d  lete}..do_test m
20d0: 75 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 33 20 7b  ultiplex-2.5.3 {
20e0: 20 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20   .  execsql { . 
20f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2100: 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65  1 VALUES(1, 'one
2110: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
2120: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
2130: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 30   randomblob(4000
2140: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
2150: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
2160: 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 49   'three');.    I
2170: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2180: 4c 55 45 53 28 34 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(4, randombl
2190: 6f 62 28 34 30 30 30 29 29 3b 0a 20 20 20 20 49  ob(4000));.    I
21a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
21b0: 4c 55 45 53 28 35 2c 20 27 66 69 76 65 27 29 3b  LUES(5, 'five');
21c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
21d0: 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20 72 61   t1 VALUES(6, ra
21e0: 6e 64 6f 6d 62 6c 6f 62 28 24 67 5f 63 68 75 6e  ndomblob($g_chun
21f0: 6b 5f 73 69 7a 65 29 29 3b 0a 20 20 20 20 49 4e  k_size));.    IN
2200: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2210: 55 45 53 28 37 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(7, randomblo
2220: 62 28 24 67 5f 63 68 75 6e 6b 5f 73 69 7a 65 29  b($g_chunk_size)
2230: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  );.  }.} {}..do_
2240: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32  test multiplex-2
2250: 2e 35 2e 34 20 7b 0a 20 20 64 62 20 65 76 61 6c  .5.4 {.  db eval
2260: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
2270: 74 31 20 57 48 45 52 45 20 61 3d 31 7d 0a 7d 20  t1 WHERE a=1}.} 
2280: 7b 31 20 6f 6e 65 7d 0a 0a 64 6f 5f 74 65 73 74  {1 one}..do_test
2290: 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 35   multiplex-2.5.5
22a0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   {.  db eval {SE
22b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
22c0: 48 45 52 45 20 61 3d 33 7d 0a 7d 20 7b 33 20 74  HERE a=3}.} {3 t
22d0: 68 72 65 65 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d  hree}..do_test m
22e0: 75 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 36 20 7b  ultiplex-2.5.6 {
22f0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
2300: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2310: 52 45 20 61 3d 35 7d 0a 7d 20 7b 35 20 66 69 76  RE a=5}.} {5 fiv
2320: 65 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  e}..do_test mult
2330: 69 70 6c 65 78 2d 32 2e 35 2e 37 20 7b 0a 20 20  iplex-2.5.7 {.  
2340: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
2350: 61 2c 6c 65 6e 67 74 68 28 62 29 20 46 52 4f 4d  a,length(b) FROM
2360: 20 74 31 20 57 48 45 52 45 20 61 3d 32 7d 0a 7d   t1 WHERE a=2}.}
2370: 20 7b 32 20 34 30 30 30 7d 0a 0a 64 6f 5f 74 65   {2 4000}..do_te
2380: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35  st multiplex-2.5
2390: 2e 38 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .8 {.  db eval {
23a0: 53 45 4c 45 43 54 20 61 2c 6c 65 6e 67 74 68 28  SELECT a,length(
23b0: 62 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  b) FROM t1 WHERE
23c0: 20 61 3d 34 7d 0a 7d 20 7b 34 20 34 30 30 30 7d   a=4}.} {4 4000}
23d0: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  ..do_test multip
23e0: 6c 65 78 2d 32 2e 35 2e 39 20 7b 20 66 69 6c 65  lex-2.5.9 { file
23f0: 20 73 69 7a 65 20 5b 6d 75 6c 74 69 70 6c 65 78   size [multiplex
2400: 5f 6e 61 6d 65 20 74 65 73 74 2e 78 20 30 5d 20  _name test.x 0] 
2410: 7d 20 5b 6c 69 73 74 20 24 67 5f 63 68 75 6e 6b  } [list $g_chunk
2420: 5f 73 69 7a 65 5d 0a 64 6f 5f 74 65 73 74 20 6d  _size].do_test m
2430: 75 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 31 30 20  ultiplex-2.5.10 
2440: 7b 20 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75 6c  { file size [mul
2450: 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74  tiplex_name test
2460: 2e 78 20 31 5d 20 7d 20 5b 6c 69 73 74 20 24 67  .x 1] } [list $g
2470: 5f 63 68 75 6e 6b 5f 73 69 7a 65 5d 0a 0a 64 6f  _chunk_size]..do
2480: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
2490: 32 2e 35 2e 39 39 20 7b 0a 20 20 64 62 20 63 6c  2.5.99 {.  db cl
24a0: 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ose.  sqlite3_mu
24b0: 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e  ltiplex_shutdown
24c0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a  .} {SQLITE_OK}..
24d0: 0a 73 65 74 20 61 6c 6c 5f 6a 6f 75 72 6e 61 6c  .set all_journal
24e0: 5f 6d 6f 64 65 73 20 7b 64 65 6c 65 74 65 20 70  _modes {delete p
24f0: 65 72 73 69 73 74 20 74 72 75 6e 63 61 74 65 20  ersist truncate 
2500: 6d 65 6d 6f 72 79 20 6f 66 66 7d 0a 66 6f 72 65  memory off}.fore
2510: 61 63 68 20 6a 6d 6f 64 65 20 24 61 6c 6c 5f 6a  ach jmode $all_j
2520: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 73 20 7b 0a 20  ournal_modes {. 
2530: 20 66 6f 72 20 7b 73 65 74 20 73 7a 20 31 35 31   for {set sz 151
2540: 7d 20 7b 24 73 7a 3c 38 30 30 30 7d 20 7b 73 65  } {$sz<8000} {se
2550: 74 20 73 7a 20 5b 65 78 70 72 20 24 73 7a 2b 34  t sz [expr $sz+4
2560: 31 39 5d 7d 20 7b 0a 0a 20 20 20 20 64 6f 5f 74  19]} {..    do_t
2570: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e  est multiplex-2.
2580: 36 2e 31 2e 24 73 7a 2e 24 6a 6d 6f 64 65 20 7b  6.1.$sz.$jmode {
2590: 0a 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 78  .      multiplex
25a0: 5f 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  _delete test.db.
25b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
25c0: 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69  ltiplex_initiali
25d0: 7a 65 20 22 22 20 31 0a 20 20 20 20 20 20 73 71  ze "" 1.      sq
25e0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
25f0: 0a 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 78  .      multiplex
2600: 5f 73 65 74 20 64 62 20 6d 61 69 6e 20 24 73 7a  _set db main $sz
2610: 20 33 32 0a 20 20 20 20 7d 20 7b 53 51 4c 49 54   32.    } {SQLIT
2620: 45 5f 4f 4b 7d 0a 0a 20 20 20 20 64 6f 5f 74 65  E_OK}..    do_te
2630: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 36  st multiplex-2.6
2640: 2e 32 2e 24 73 7a 2e 24 6a 6d 6f 64 65 20 7b 0a  .2.$sz.$jmode {.
2650: 20 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 0a        db eval {.
2660: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 70          PRAGMA p
2670: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
2680: 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  .        PRAGMA 
2690: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6f 66  auto_vacuum = of
26a0: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
26b0: 20 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41   db eval "PRAGMA
26c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
26d0: 24 6a 6d 6f 64 65 3b 22 0a 20 20 20 20 7d 20 24  $jmode;".    } $
26e0: 6a 6d 6f 64 65 0a 0a 20 20 20 20 64 6f 5f 74 65  jmode..    do_te
26f0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 36  st multiplex-2.6
2700: 2e 33 2e 24 73 7a 2e 24 6a 6d 6f 64 65 20 7b 20  .3.$sz.$jmode { 
2710: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b  .      execsql {
2720: 20 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45   .        CREATE
2730: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
2740: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
2750: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2760: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27 6f   t1 VALUES(1, 'o
2770: 6e 65 27 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  ne');.        IN
2780: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2790: 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(2, randomblo
27a0: 62 28 24 67 5f 63 68 75 6e 6b 5f 73 69 7a 65 29  b($g_chunk_size)
27b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27c0: 20 7b 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74   {}..    do_test
27d0: 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 36 2e 34   multiplex-2.6.4
27e0: 2e 24 73 7a 2e 24 6a 6d 6f 64 65 20 7b 0a 20 20  .$sz.$jmode {.  
27f0: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c      db eval {SEL
2800: 45 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48  ECT b FROM t1 WH
2810: 45 52 45 20 61 3d 31 7d 0a 20 20 20 20 7d 20 7b  ERE a=1}.    } {
2820: 6f 6e 65 7d 0a 0a 20 20 20 20 64 6f 5f 74 65 73  one}..    do_tes
2830: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 36 2e  t multiplex-2.6.
2840: 35 2e 24 73 7a 2e 24 6a 6d 6f 64 65 20 7b 0a 20  5.$sz.$jmode {. 
2850: 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45       db eval {SE
2860: 4c 45 43 54 20 6c 65 6e 67 74 68 28 62 29 20 46  LECT length(b) F
2870: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 32  ROM t1 WHERE a=2
2880: 7d 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 24 67  }.    } [list $g
2890: 5f 63 68 75 6e 6b 5f 73 69 7a 65 5d 0a 0a 20 20  _chunk_size]..  
28a0: 20 20 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70    do_test multip
28b0: 6c 65 78 2d 32 2e 36 2e 36 2e 24 73 7a 2e 24 6a  lex-2.6.6.$sz.$j
28c0: 6d 6f 64 65 20 7b 20 66 69 6c 65 20 73 69 7a 65  mode { file size
28d0: 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d 65   [multiplex_name
28e0: 20 74 65 73 74 2e 64 62 20 30 5d 20 7d 20 5b 6c   test.db 0] } [l
28f0: 69 73 74 20 24 67 5f 63 68 75 6e 6b 5f 73 69 7a  ist $g_chunk_siz
2900: 65 5d 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  e]..    do_test 
2910: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 36 2e 39 39  multiplex-2.6.99
2920: 2e 24 73 7a 2e 24 6a 6d 6f 64 65 20 7b 0a 20 20  .$sz.$jmode {.  
2930: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
2940: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69     sqlite3_multi
2950: 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 0a 20 20  plex_shutdown.  
2960: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a    } {SQLITE_OK}.
2970: 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20  .  }.}..do_test 
2980: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 37 2e 31 20  multiplex-2.7.1 
2990: 20 7b 20 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c   { multiplex_del
29a0: 65 74 65 20 74 65 73 74 2e 64 62 20 7d 20 20 20  ete test.db }   
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d      {}.do_test m
29e0: 75 6c 74 69 70 6c 65 78 2d 32 2e 37 2e 32 20 20  ultiplex-2.7.2  
29f0: 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70  { sqlite3_multip
2a00: 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22  lex_initialize "
2a10: 22 20 31 20 7d 20 20 20 20 20 20 20 20 20 20 20  " 1 }           
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64     {SQLITE_OK}.d
2a40: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
2a50: 2d 32 2e 37 2e 33 20 20 7b 20 73 71 6c 69 74 65  -2.7.3  { sqlite
2a60: 33 20 64 62 20 74 65 73 74 2e 64 62 20 7d 20 20  3 db test.db }  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 20 20 20 20 7b 7d 0a 64 6f             {}.do
2aa0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
2ab0: 32 2e 37 2e 34 20 20 7b 20 6c 69 6e 64 65 78 20  2.7.4  { lindex 
2ac0: 5b 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c  [ catchsql { SEL
2ad0: 45 43 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f  ECT multiplex_co
2ae0: 6e 74 72 6f 6c 28 32 2c 20 36 35 35 33 36 29 3b  ntrol(2, 65536);
2af0: 20 7d 20 5d 20 30 20 7d 20 20 7b 30 7d 0a 64 6f   } ] 0 }  {0}.do
2b00: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
2b10: 32 2e 37 2e 35 20 20 7b 20 6c 69 6e 64 65 78 20  2.7.5  { lindex 
2b20: 5b 20 63 61 74 63 68 73 71 6c 20 7b 20 53 45 4c  [ catchsql { SEL
2b30: 45 43 54 20 6d 75 6c 74 69 70 6c 65 78 5f 63 6f  ECT multiplex_co
2b40: 6e 74 72 6f 6c 28 31 2c 20 30 29 3b 20 7d 20 5d  ntrol(1, 0); } ]
2b50: 20 30 20 7d 20 20 20 20 20 20 7b 30 7d 0a 64 6f   0 }      {0}.do
2b60: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
2b70: 32 2e 37 2e 36 20 7b 20 0a 20 20 65 78 65 63 73  2.7.6 { .  execs
2b80: 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45  ql { .    CREATE
2b90: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
2ba0: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
2bb0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2bc0: 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d  VALUES(1, random
2bd0: 62 6c 6f 62 28 31 30 30 30 29 29 3b 0a 20 20 7d  blob(1000));.  }
2be0: 0a 7d 20 7b 7d 0a 23 20 76 65 72 69 66 79 20 6f  .} {}.# verify o
2bf0: 6e 6c 79 20 6f 6e 65 20 66 69 6c 65 2c 20 61 6e  nly one file, an
2c00: 64 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 6c  d file size is l
2c10: 65 73 73 20 74 68 61 6e 20 63 68 75 6e 6b 73 20  ess than chunks 
2c20: 73 69 7a 65 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  size.do_test mul
2c30: 74 69 70 6c 65 78 2d 32 2e 37 2e 37 20 20 7b 20  tiplex-2.7.7  { 
2c40: 65 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a 65  expr ([file size
2c50: 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d 65   [multiplex_name
2c60: 20 74 65 73 74 2e 64 62 20 30 5d 5d 20 3c 20 36   test.db 0]] < 6
2c70: 35 35 33 36 29 20 7d 20 7b 31 7d 0a 64 6f 5f 74  5536) } {1}.do_t
2c80: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e  est multiplex-2.
2c90: 37 2e 38 20 20 7b 20 66 69 6c 65 20 65 78 69 73  7.8  { file exis
2ca0: 74 73 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61  ts [multiplex_na
2cb0: 6d 65 20 74 65 73 74 2e 64 62 20 31 5d 20 7d 20  me test.db 1] } 
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2cd0: 30 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  0}.do_test multi
2ce0: 70 6c 65 78 2d 32 2e 37 2e 39 20 7b 20 0a 20 20  plex-2.7.9 { .  
2cf0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 49  execsql { .    I
2d00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2d10: 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
2d20: 6f 62 28 36 35 35 33 36 29 29 3b 0a 20 20 7d 0a  ob(65536));.  }.
2d30: 7d 20 7b 7d 0a 23 20 76 65 72 69 66 79 20 6f 6e  } {}.# verify on
2d40: 6c 79 20 6f 6e 65 20 66 69 6c 65 2c 20 61 6e 64  ly one file, and
2d50: 20 66 69 6c 65 20 73 69 7a 65 20 65 78 63 65 65   file size excee
2d60: 64 73 20 63 68 75 6e 6b 73 20 73 69 7a 65 0a 64  ds chunks size.d
2d70: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
2d80: 2d 32 2e 37 2e 31 30 20 7b 20 65 78 70 72 20 28  -2.7.10 { expr (
2d90: 5b 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75 6c 74  [file size [mult
2da0: 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74 2e  iplex_name test.
2db0: 64 62 20 30 5d 5d 20 3e 20 36 35 35 33 36 29 20  db 0]] > 65536) 
2dc0: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  } {1}.do_test mu
2dd0: 6c 74 69 70 6c 65 78 2d 32 2e 37 2e 31 31 20 7b  ltiplex-2.7.11 {
2de0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 5b 6d 75   file exists [mu
2df0: 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73  ltiplex_name tes
2e00: 74 2e 64 62 20 31 5d 20 7d 20 20 20 20 20 20 20  t.db 1] }       
2e10: 20 20 20 20 20 20 20 20 20 7b 30 7d 0a 64 6f 5f           {0}.do_
2e20: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32  test multiplex-2
2e30: 2e 37 2e 31 32 20 7b 20 64 62 20 63 6c 6f 73 65  .7.12 { db close
2e40: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  {}.do_test multi
2e80: 70 6c 65 78 2d 32 2e 37 2e 31 33 20 7b 20 73 71  plex-2.7.13 { sq
2e90: 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f  lite3_multiplex_
2ea0: 73 68 75 74 64 6f 77 6e 20 7d 20 20 20 20 20 20  shutdown }      
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b        {SQLITE_OK
2ed0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2f20: 54 72 79 20 73 6f 6d 65 20 74 65 73 74 73 20 77  Try some tests w
2f30: 69 74 68 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ith more than on
2f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
2f50: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
2f60: 20 53 74 69 6c 6c 0a 23 20 69 6e 20 72 6f 6c 6c   Still.# in roll
2f70: 62 61 63 6b 20 6d 6f 64 65 2e 0a 23 0a 23 20 20  back mode..#.#  
2f80: 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 31 2e 2a   multiplex-3.1.*
2f90: 3a 20 54 77 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e  : Two connection
2fa0: 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 61  s to a single da
2fb0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 23  tabase file..#.#
2fc0: 20 20 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32     multiplex-3.2
2fd0: 2e 2a 3a 20 54 77 6f 20 63 6f 6e 6e 65 63 74 69  .*: Two connecti
2fe0: 6f 6e 73 20 74 6f 20 65 61 63 68 20 6f 66 20 73  ons to each of s
2ff0: 65 76 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  everal database 
3000: 66 69 6c 65 73 20 28 74 68 61 74 0a 23 20 20 20  files (that.#   
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72 65               are
3020: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6d 75 6c   in the same mul
3030: 74 69 70 6c 65 78 20 67 72 6f 75 70 29 2e 0a 23  tiplex group)..#
3040: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
3050: 65 78 2d 33 2e 31 2e 31 20 7b 0a 20 20 6d 75 6c  ex-3.1.1 {.  mul
3060: 74 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 74 65  tiplex_delete te
3070: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 5f  st.db.  sqlite3_
3080: 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61  multiplex_initia
3090: 6c 69 7a 65 20 22 22 20 31 0a 20 20 73 71 6c 69  lize "" 1.  sqli
30a0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
30b0: 20 6d 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 64   multiplex_set d
30c0: 62 20 6d 61 69 6e 20 33 32 37 36 38 20 31 36 0a  b main 32768 16.
30d0: 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f  } {SQLITE_OK}.do
30e0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
30f0: 33 2e 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3.1.2 {.  execsq
3100: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
3110: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
3120: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
3130: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65 6c 65 74  nal_mode = delet
3140: 65 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75  e;.    PRAGMA au
3150: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6f 66 66 3b  to_vacuum = off;
3160: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3170: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
3180: 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  EY, b);.    INSE
3190: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
31a0: 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 7d  S(1, 'one');.  }
31b0: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75  .  file size [mu
31c0: 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73  ltiplex_name tes
31d0: 74 2e 64 62 20 30 5d 0a 7d 20 7b 33 30 37 32 7d  t.db 0].} {3072}
31e0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
31f0: 65 78 2d 33 2e 31 2e 33 20 7b 0a 20 20 73 71 6c  ex-3.1.3 {.  sql
3200: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
3210: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45  .  execsql { CRE
3220: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
3230: 62 29 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64 6f  b) } db2.} {}.do
3240: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
3250: 33 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  3.1.4 {.  execsq
3260: 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
3270: 20 74 33 28 61 2c 20 62 29 20 7d 0a 7d 20 7b 7d   t3(a, b) }.} {}
3280: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
3290: 65 78 2d 33 2e 31 2e 35 20 7b 0a 20 20 63 61 74  ex-3.1.5 {.  cat
32a0: 63 68 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  chsql { CREATE T
32b0: 41 42 4c 45 20 74 33 28 61 2c 20 62 29 20 7d 0a  ABLE t3(a, b) }.
32c0: 7d 20 7b 31 20 7b 74 61 62 6c 65 20 74 33 20 61  } {1 {table t3 a
32d0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 7d 7d 0a  lready exists}}.
32e0: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
32f0: 78 2d 33 2e 31 2e 36 20 7b 0a 20 20 64 62 20 63  x-3.1.6 {.  db c
3300: 6c 6f 73 65 0a 20 20 64 62 32 20 63 6c 6f 73 65  lose.  db2 close
3310: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d  .} {}..do_test m
3320: 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 31 61 20  ultiplex-3.2.1a 
3330: 7b 0a 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f 64  {..  multiplex_d
3340: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20  elete test.db.  
3350: 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74 65  multiplex_delete
3360: 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 73 71 6c   test2.db..  sql
3370: 69 74 65 33 20 64 62 31 61 20 74 65 73 74 2e 64  ite3 db1a test.d
3380: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 61  b.  sqlite3 db2a
3390: 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 66 6f 72   test2.db..  for
33a0: 65 61 63 68 20 64 62 20 7b 64 62 31 61 20 64 62  each db {db1a db
33b0: 32 61 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71  2a} {.    execsq
33c0: 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  l {.      PRAGMA
33d0: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
33e0: 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  4;.      PRAGMA 
33f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64  journal_mode = d
3400: 65 6c 65 74 65 3b 0a 20 20 20 20 20 20 50 52 41  elete;.      PRA
3410: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
3420: 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 43 52 45  = off;.      CRE
3430: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3440: 62 29 3b 0a 20 20 20 20 7d 20 24 64 62 0a 20 20  b);.    } $db.  
3450: 7d 0a 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  }..  list [file 
3460: 73 69 7a 65 20 5b 6d 75 6c 74 69 70 6c 65 78 5f  size [multiplex_
3470: 6e 61 6d 65 20 74 65 73 74 2e 64 62 20 30 5d 5d  name test.db 0]]
3480: 20 5b 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75 6c   [file size [mul
3490: 74 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74  tiplex_name test
34a0: 32 2e 64 62 20 30 5d 5d 0a 7d 20 7b 32 30 34 38  2.db 0]].} {2048
34b0: 20 32 30 34 38 7d 0a 0a 64 6f 5f 74 65 73 74 20   2048}..do_test 
34c0: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 31 62  multiplex-3.2.1b
34d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 31   {.  sqlite3 db1
34e0: 62 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69  b test.db.  sqli
34f0: 74 65 33 20 64 62 32 62 20 74 65 73 74 32 2e 64  te3 db2b test2.d
3500: 62 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  b.} {}..do_test 
3510: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 32 20  multiplex-3.2.2 
3520: 7b 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45  { execsql { INSE
3530: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3540: 53 28 27 78 27 2c 20 27 79 27 29 20 7d 20 64 62  S('x', 'y') } db
3550: 31 61 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  1a } {}.do_test 
3560: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 33 20  multiplex-3.2.3 
3570: 7b 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45  { execsql { INSE
3580: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3590: 53 28 27 76 27 2c 20 27 77 27 29 20 7d 20 64 62  S('v', 'w') } db
35a0: 31 62 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  1b } {}.do_test 
35b0: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 34 20  multiplex-3.2.4 
35c0: 7b 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45  { execsql { INSE
35d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
35e0: 53 28 27 74 27 2c 20 27 75 27 29 20 7d 20 64 62  S('t', 'u') } db
35f0: 32 61 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  2a } {}.do_test 
3600: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 35 20  multiplex-3.2.5 
3610: 7b 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45  { execsql { INSE
3620: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3630: 53 28 27 72 27 2c 20 27 73 27 29 20 7d 20 64 62  S('r', 's') } db
3640: 32 62 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  2b } {}..do_test
3650: 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 36   multiplex-3.2.6
3660: 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 7b 20   { .  execsql { 
3670: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3680: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
3690: 28 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  (500), randomblo
36a0: 62 28 35 30 30 29 29 20 7d 20 64 62 31 61 0a 7d  b(500)) } db1a.}
36b0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74   {}.do_test mult
36c0: 69 70 6c 65 78 2d 33 2e 32 2e 37 20 7b 20 0a 20  iplex-3.2.7 { . 
36d0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
36e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
36f0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29  (randomblob(500)
3700: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30  , randomblob(500
3710: 29 29 20 7d 20 64 62 31 62 0a 7d 20 7b 7d 0a 64  )) } db1b.} {}.d
3720: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
3730: 2d 33 2e 32 2e 38 20 7b 20 0a 20 20 65 78 65 63  -3.2.8 { .  exec
3740: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
3750: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
3760: 6f 6d 62 6c 6f 62 28 35 30 30 29 2c 20 72 61 6e  omblob(500), ran
3770: 64 6f 6d 62 6c 6f 62 28 35 30 30 29 29 20 7d 20  domblob(500)) } 
3780: 64 62 32 61 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  db2a.} {}.do_tes
3790: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e  t multiplex-3.2.
37a0: 39 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 7b  9 { .  execsql {
37b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
37c0: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
37d0: 62 28 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  b(500), randombl
37e0: 6f 62 28 35 30 30 29 29 20 7d 20 64 62 32 62 0a  ob(500)) } db2b.
37f0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75  } {}..do_test mu
3800: 6c 74 69 70 6c 65 78 2d 33 2e 33 2e 31 20 7b 20  ltiplex-3.3.1 { 
3810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
3820: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3830: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30  ES(randomblob(50
3840: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  0), randomblob(5
3850: 30 30 29 29 20 7d 20 64 62 31 61 0a 20 20 65 78  00)) } db1a.  ex
3860: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
3870: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
3880: 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 2c 20 72  ndomblob(500), r
3890: 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 29 20  andomblob(500)) 
38a0: 7d 20 64 62 31 62 0a 20 20 65 78 65 63 73 71 6c  } db1b.  execsql
38b0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
38c0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
38d0: 6c 6f 62 28 35 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(500), random
38e0: 62 6c 6f 62 28 35 30 30 29 29 20 7d 20 64 62 32  blob(500)) } db2
38f0: 61 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  a.  execsql { IN
3900: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3910: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  UES(randomblob(5
3920: 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
3930: 35 30 30 29 29 20 7d 20 64 62 32 62 0a 7d 20 7b  500)) } db2b.} {
3940: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  }..do_test multi
3950: 70 6c 65 78 2d 33 2e 32 2e 58 20 7b 0a 20 20 66  plex-3.2.X {.  f
3960: 6f 72 65 61 63 68 20 64 62 20 7b 64 62 31 61 20  oreach db {db1a 
3970: 64 62 32 61 20 64 62 32 62 20 64 62 31 62 7d 20  db2a db2b db1b} 
3980: 7b 20 63 61 74 63 68 20 7b 20 24 64 62 20 63 6c  { catch { $db cl
3990: 6f 73 65 20 7d 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d  ose } }.} {}..#-
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 0a 73 71 6c 69  --------.#..sqli
39f0: 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e  te3_multiplex_in
3a00: 69 74 69 61 6c 69 7a 65 20 22 22 20 31 0a 6d 75  itialize "" 1.mu
3a10: 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62 20 6d  ltiplex_set db m
3a20: 61 69 6e 20 33 32 37 36 38 20 31 36 0a 0a 23 20  ain 32768 16..# 
3a30: 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
3a40: 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 64   all currently d
3a50: 65 66 69 6e 65 64 20 6d 75 6c 74 69 70 6c 65 78  efined multiplex
3a60: 73 2e 0a 70 72 6f 63 20 6d 75 6c 74 69 70 6c 65  s..proc multiple
3a70: 78 5f 6c 69 73 74 20 7b 7d 20 7b 0a 20 20 73 65  x_list {} {.  se
3a80: 74 20 61 6c 6c 71 20 7b 7d 0a 20 20 66 6f 72 65  t allq {}.  fore
3a90: 61 63 68 20 71 20 5b 73 71 6c 69 74 65 33 5f 6d  ach q [sqlite3_m
3aa0: 75 6c 74 69 70 6c 65 78 5f 64 75 6d 70 5d 20 7b  ultiplex_dump] {
3ab0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 61 6c 6c  .    lappend all
3ac0: 71 20 5b 6c 69 6e 64 65 78 20 24 71 20 30 5d 0a  q [lindex $q 0].
3ad0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b 6c 73    }.  return [ls
3ae0: 6f 72 74 20 24 61 6c 6c 71 5d 0a 7d 0a 0a 64 6f  ort $allq].}..do
3af0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
3b00: 34 2e 31 2e 36 20 7b 0a 20 20 6d 75 6c 74 69 70  4.1.6 {.  multip
3b10: 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74 32  lex_delete test2
3b20: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
3b30: 20 74 65 73 74 32 2e 64 62 0a 20 20 64 62 20 65   test2.db.  db e
3b40: 76 61 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  val {CREATE TABL
3b50: 45 20 74 32 28 78 29 3b 20 49 4e 53 45 52 54 20  E t2(x); INSERT 
3b60: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
3b70: 74 61 62 2d 74 32 27 29 3b 7d 0a 20 20 73 65 74  tab-t2');}.  set
3b80: 20 72 65 73 20 5b 6d 75 6c 74 69 70 6c 65 78 5f   res [multiplex_
3b90: 6c 69 73 74 5d 0a 20 20 6c 69 73 74 20 5b 72 65  list].  list [re
3ba0: 67 65 78 70 20 7b 74 65 73 74 32 2e 64 62 7d 20  gexp {test2.db} 
3bb0: 24 72 65 73 5d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  $res].} {1}.do_t
3bc0: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 34 2e  est multiplex-4.
3bd0: 31 2e 36 61 20 7b 0a 20 20 73 71 6c 69 74 65 33  1.6a {.  sqlite3
3be0: 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20   db2 test2.db.  
3bf0: 64 62 32 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  db2 eval {SELECT
3c00: 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 74   * FROM t2}.} {t
3c10: 61 62 2d 74 32 7d 0a 64 6f 5f 74 65 73 74 20 6d  ab-t2}.do_test m
3c20: 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 37 20 7b  ultiplex-4.1.7 {
3c30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45  .  execsql {INSE
3c40: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
3c50: 53 28 7a 65 72 6f 62 6c 6f 62 28 32 30 30 30 30  S(zeroblob(20000
3c60: 30 29 29 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  0))}.} {}.do_tes
3c70: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e  t multiplex-4.1.
3c80: 38 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  8 {.  sqlite3 db
3c90: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 64 62 32  2 test2.db.  db2
3ca0: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f   eval {SELECT co
3cb0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 7d 0a  unt(*) FROM t2}.
3cc0: 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  } {2}.do_test mu
3cd0: 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 38 61 20 7b  ltiplex-4.1.8a {
3ce0: 0a 20 20 20 64 62 32 20 65 76 61 6c 20 7b 20 44  .   db2 eval { D
3cf0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48  ELETE FROM t2 WH
3d00: 45 52 45 20 78 20 3d 20 27 74 61 62 2d 74 32 27  ERE x = 'tab-t2'
3d10: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
3d20: 6d 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 38 62  multiplex-4.1.8b
3d30: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
3d40: 20 74 65 73 74 32 2e 64 62 0a 20 20 64 62 32 20   test2.db.  db2 
3d50: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75  eval {SELECT cou
3d60: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 7d 0a 7d  nt(*) FROM t2}.}
3d70: 20 7b 31 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 6d   {1}...do_test m
3d80: 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 39 20 7b  ultiplex-4.1.9 {
3d90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53 45  .  execsql {INSE
3da0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
3db0: 53 28 7a 65 72 6f 62 6c 6f 62 28 32 30 30 30 30  S(zeroblob(20000
3dc0: 30 29 29 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  0))}.} {}.do_tes
3dd0: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e  t multiplex-4.1.
3de0: 31 30 20 7b 0a 20 20 73 65 74 20 72 65 73 20 5b  10 {.  set res [
3df0: 6d 75 6c 74 69 70 6c 65 78 5f 6c 69 73 74 5d 0a  multiplex_list].
3e00: 20 20 6c 69 73 74 20 5b 72 65 67 65 78 70 20 7b    list [regexp {
3e10: 74 65 73 74 32 2e 64 62 7d 20 24 72 65 73 5d 0a  test2.db} $res].
3e20: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  } {1}.do_test mu
3e30: 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 31 31 20 7b  ltiplex-4.1.11 {
3e40: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 73  .  db2 close.  s
3e50: 65 74 20 72 65 73 20 5b 6d 75 6c 74 69 70 6c 65  et res [multiple
3e60: 78 5f 6c 69 73 74 5d 0a 20 20 6c 69 73 74 20 5b  x_list].  list [
3e70: 72 65 67 65 78 70 20 7b 74 65 73 74 32 2e 64 62  regexp {test2.db
3e80: 7d 20 24 72 65 73 5d 0a 7d 20 7b 31 7d 0a 64 6f  } $res].} {1}.do
3e90: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
3ea0: 34 2e 31 2e 31 32 20 7b 0a 20 20 64 62 20 63 6c  4.1.12 {.  db cl
3eb0: 6f 73 65 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f  ose.  multiplex_
3ec0: 6c 69 73 74 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d  list.} {}...#---
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
3f20: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 74 65 73  lowing tests tes
3f30: 74 20 74 68 61 74 20 74 68 65 20 6d 75 6c 74 69  t that the multi
3f40: 70 6c 65 78 20 56 46 53 20 68 61 6e 64 6c 65 73  plex VFS handles
3f50: 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 49 4f 20 0a   malloc and IO .
3f60: 23 20 65 72 72 6f 72 73 2e 0a 23 0a 0a 73 71 6c  # errors..#..sql
3f70: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69  ite3_multiplex_i
3f80: 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31 0a 6d  nitialize "" 1.m
3f90: 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 64 62 20  ultiplex_set db 
3fa0: 6d 61 69 6e 20 33 32 37 36 38 20 31 36 0a 0a 64  main 32768 16..d
3fb0: 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65 73 74 20  o_faultsim_test 
3fc0: 6d 75 6c 74 69 70 6c 65 78 2d 35 2e 31 20 2d 70  multiplex-5.1 -p
3fd0: 72 65 70 20 7b 0a 20 20 63 61 74 63 68 20 7b 64  rep {.  catch {d
3fe0: 62 20 63 6c 6f 73 65 7d 0a 7d 20 2d 62 6f 64 79  b close}.} -body
3ff0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
4000: 74 65 73 74 32 2e 64 62 0a 7d 0a 64 6f 5f 66 61  test2.db.}.do_fa
4010: 75 6c 74 73 69 6d 5f 74 65 73 74 20 6d 75 6c 74  ultsim_test mult
4020: 69 70 6c 65 78 2d 35 2e 32 20 2d 70 72 65 70 20  iplex-5.2 -prep 
4030: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c  {.  catch {db cl
4040: 6f 73 65 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20  ose}.} -body {. 
4050: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
4060: 2e 64 62 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64  .db.}..catch { d
4070: 62 20 63 6c 6f 73 65 20 7d 0a 6d 75 6c 74 69 70  b close }.multip
4080: 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74 2e  lex_delete test.
4090: 64 62 0a 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c  db.multiplex_del
40a0: 65 74 65 20 74 65 73 74 32 2e 64 62 0a 0a 64 6f  ete test2.db..do
40b0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
40c0: 35 2e 33 2e 70 72 65 70 20 7b 0a 20 20 73 71 6c  5.3.prep {.  sql
40d0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
40e0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
40f0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
4100: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 50 52 41 47  um = 1;.    PRAG
4110: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
4120: 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
4130: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
4140: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4150: 74 31 20 56 41 4c 55 45 53 28 31 30 2c 20 7a 65  t1 VALUES(10, ze
4160: 72 6f 62 6c 6f 62 28 31 32 30 30 29 29 3b 0a 20  roblob(1200));. 
4170: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
4180: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 7d 20 7b  ve_and_close.} {
4190: 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74 65  }.do_faultsim_te
41a0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 35 2e 33  st multiplex-5.3
41b0: 20 2d 70 72 65 70 20 7b 0a 20 20 66 61 75 6c 74   -prep {.  fault
41c0: 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f  sim_restore_and_
41d0: 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64 79 20 7b  reopen.} -body {
41e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c  .  execsql { DEL
41f0: 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 0a  ETE FROM t1 }.}.
4200: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
4210: 65 78 2d 35 2e 34 2e 31 20 7b 0a 20 20 63 61 74  ex-5.4.1 {.  cat
4220: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
4230: 20 20 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65    multiplex_dele
4240: 74 65 20 74 65 73 74 2e 64 62 0a 20 20 66 69 6c  te test.db.  fil
4250: 65 20 6d 6b 64 69 72 20 74 65 73 74 2e 64 62 0a  e mkdir test.db.
4260: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20    list [catch { 
4270: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
4280: 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d  db } msg] $msg.}
4290: 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 6f   {1 {unable to o
42a0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
42b0: 65 7d 7d 0a 63 61 74 63 68 20 7b 20 64 65 6c 65  e}}.catch { dele
42c0: 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 20  te_file test.db 
42d0: 7d 0a 0a 64 6f 5f 66 61 75 6c 74 73 69 6d 5f 74  }..do_faultsim_t
42e0: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 35 2e  est multiplex-5.
42f0: 35 20 2d 70 72 65 70 20 7b 0a 20 20 63 61 74 63  5 -prep {.  catc
4300: 68 20 7b 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74  h { sqlite3_mult
4310: 69 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 20 7d  iplex_shutdown }
4320: 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 73 71 6c  .} -body {.  sql
4330: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69  ite3_multiplex_i
4340: 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31 0a 20  nitialize "" 1. 
4350: 20 6d 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 64   multiplex_set d
4360: 62 20 6d 61 69 6e 20 33 32 37 36 38 20 31 36 0a  b main 32768 16.
4370: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
43c0: 54 65 73 74 20 74 68 61 74 20 79 6f 75 20 63 61  Test that you ca
43d0: 6e 20 76 61 63 75 75 6d 20 61 20 6d 75 6c 74 69  n vacuum a multi
43e0: 70 6c 65 78 27 65 64 20 44 42 2e 20 20 0a 0a 69  plex'ed DB.  ..i
43f0: 66 63 61 70 61 62 6c 65 20 76 61 63 75 75 6d 20  fcapable vacuum 
4400: 7b 0a 0a 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69  {..sqlite3_multi
4410: 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 0a 64 6f  plex_shutdown.do
4420: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
4430: 36 2e 30 2e 30 20 7b 0a 20 20 6d 75 6c 74 69 70  6.0.0 {.  multip
4440: 6c 65 78 5f 64 65 6c 65 74 65 20 74 65 73 74 2e  lex_delete test.
4450: 64 62 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f 64  db.  multiplex_d
4460: 65 6c 65 74 65 20 74 65 73 74 2e 78 0a 20 20 73  elete test.x.  s
4470: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
4480: 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22 22 20 31  _initialize "" 1
4490: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
44a0: 73 74 2e 78 0a 20 20 6d 75 6c 74 69 70 6c 65 78  st.x.  multiplex
44b0: 5f 73 65 74 20 64 62 20 6d 61 69 6e 20 34 30 39  _set db main 409
44c0: 36 20 31 36 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f  6 16.} {SQLITE_O
44d0: 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  K}..do_test mult
44e0: 69 70 6c 65 78 2d 36 2e 31 2e 30 20 7b 0a 20 20  iplex-6.1.0 {.  
44f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
4500: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31  AGMA page_size=1
4510: 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
4520: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 44 45 4c  journal_mode=DEL
4530: 45 54 45 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ETE;.    PRAGMA 
4540: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 4f 46 46 3b  auto_vacuum=OFF;
4550: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
4560: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4570: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
4580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4590: 41 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62  ALUES(1, randomb
45a0: 6c 6f 62 28 24 67 5f 63 68 75 6e 6b 5f 73 69 7a  lob($g_chunk_siz
45b0: 65 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e));.    INSERT 
45c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
45d0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 24 67 5f  , randomblob($g_
45e0: 63 68 75 6e 6b 5f 73 69 7a 65 29 29 3b 0a 20 20  chunk_size));.  
45f0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d  }.} {}.do_test m
4600: 75 6c 74 69 70 6c 65 78 2d 36 2e 32 2e 31 20 7b  ultiplex-6.2.1 {
4610: 20 66 69 6c 65 20 73 69 7a 65 20 5b 6d 75 6c 74   file size [mult
4620: 69 70 6c 65 78 5f 6e 61 6d 65 20 74 65 73 74 2e  iplex_name test.
4630: 78 20 30 5d 20 7d 20 5b 6c 69 73 74 20 24 67 5f  x 0] } [list $g_
4640: 63 68 75 6e 6b 5f 73 69 7a 65 5d 0a 64 6f 5f 74  chunk_size].do_t
4650: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 36 2e  est multiplex-6.
4660: 32 2e 32 20 7b 20 66 69 6c 65 20 73 69 7a 65 20  2.2 { file size 
4670: 5b 6d 75 6c 74 69 70 6c 65 78 5f 6e 61 6d 65 20  [multiplex_name 
4680: 74 65 73 74 2e 78 20 31 5d 20 7d 20 5b 6c 69 73  test.x 1] } [lis
4690: 74 20 24 67 5f 63 68 75 6e 6b 5f 73 69 7a 65 5d  t $g_chunk_size]
46a0: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  ..do_test multip
46b0: 6c 65 78 2d 36 2e 33 2e 30 20 7b 0a 20 20 65 78  lex-6.3.0 {.  ex
46c0: 65 63 73 71 6c 20 7b 20 56 41 43 55 55 4d 20 7d  ecsql { VACUUM }
46d0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d  .} {}..do_test m
46e0: 75 6c 74 69 70 6c 65 78 2d 36 2e 39 39 20 7b 0a  ultiplex-6.99 {.
46f0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6d 75 6c    db close.  mul
4700: 74 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 74 65  tiplex_delete te
4710: 73 74 2e 78 0a 20 20 73 71 6c 69 74 65 33 5f 6d  st.x.  sqlite3_m
4720: 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77  ultiplex_shutdow
4730: 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  n.} {SQLITE_OK}.
4740: 0a 7d 0a 0a 0a 63 61 74 63 68 20 7b 20 73 71 6c  .}...catch { sql
4750: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73  ite3_multiplex_s
4760: 68 75 74 64 6f 77 6e 20 7d 0a 66 69 6e 69 73 68  hutdown }.finish
4770: 5f 74 65 73 74 0a                                _test.