/ Hex Artifact Content
Login

Artifact 2f6830ad67e0a26d28658b4ed3ff07c909075eb8:


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 70 72 6f 63 20  ommon.tcl..proc 
01d0: 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74 65  multiplex_delete
01e0: 20 7b 6e 61 6d 65 7d 20 7b 0a 20 20 66 69 6c 65   {name} {.  file
01f0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24   delete -force $
0200: 6e 61 6d 65 0a 20 20 66 69 6c 65 20 64 65 6c 65  name.  file dele
0210: 74 65 20 2d 66 6f 72 63 65 20 24 6e 61 6d 65 2d  te -force $name-
0220: 6a 6f 75 72 6e 61 6c 0a 20 20 66 69 6c 65 20 64  journal.  file d
0230: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 6e 61  elete -force $na
0240: 6d 65 2d 77 61 6c 0a 20 20 66 6f 72 20 7b 73 65  me-wal.  for {se
0250: 74 20 69 20 31 7d 20 7b 24 69 3c 3d 31 35 7d 20  t i 1} {$i<=15} 
0260: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 66  {incr i} {.    f
0270: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
0280: 65 20 24 6e 61 6d 65 2d 30 30 30 24 69 0a 20 20  e $name-000$i.  
0290: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
02a0: 6f 72 63 65 20 24 6e 61 6d 65 2d 30 30 24 69 0a  orce $name-00$i.
02b0: 20 20 7d 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a    }.}..db close.
02c0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 20  -----------.#   
0310: 6d 75 6c 74 69 70 6c 65 78 2d 31 2e 31 2e 2a 3a  multiplex-1.1.*:
0320: 20 54 65 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   Test initialize
0330: 20 61 6e 64 20 73 68 75 74 64 6f 77 6e 2e 0a 0a   and shutdown...
0340: 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65  do_test multiple
0350: 78 2d 31 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f  x-1.1 { sqlite3_
0360: 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61  multiplex_initia
0370: 6c 69 7a 65 20 6e 6f 73 75 63 68 76 66 73 20 31  lize nosuchvfs 1
0380: 20 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52   } {SQLITE_ERROR
0390: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
03a0: 6c 65 78 2d 31 2e 32 20 7b 20 73 71 6c 69 74 65  lex-1.2 { sqlite
03b0: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74  3_multiplex_init
03c0: 69 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20  ialize "" 1 }   
03d0: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
03e0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
03f0: 65 78 2d 31 2e 33 20 7b 20 73 71 6c 69 74 65 33  ex-1.3 { sqlite3
0400: 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69  _multiplex_initi
0410: 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20 20  alize "" 1 }    
0420: 20 20 20 20 7b 53 51 4c 49 54 45 5f 4d 49 53 55      {SQLITE_MISU
0430: 53 45 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  SE}.do_test mult
0440: 69 70 6c 65 78 2d 31 2e 34 20 7b 20 73 71 6c 69  iplex-1.4 { sqli
0450: 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68  te3_multiplex_sh
0460: 75 74 64 6f 77 6e 20 7d 20 20 20 20 20 20 20 20  utdown }        
0470: 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f         {SQLITE_O
0480: 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  K}..do_test mult
0490: 69 70 6c 65 78 2d 31 2e 35 20 7b 20 73 71 6c 69  iplex-1.5 { sqli
04a0: 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e  te3_multiplex_in
04b0: 69 74 69 61 6c 69 7a 65 20 22 22 20 30 20 7d 20  itialize "" 0 } 
04c0: 20 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f         {SQLITE_O
04d0: 4b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  K}.do_test multi
04e0: 70 6c 65 78 2d 31 2e 36 20 7b 20 73 71 6c 69 74  plex-1.6 { sqlit
04f0: 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75  e3_multiplex_shu
0500: 74 64 6f 77 6e 20 7d 20 20 20 20 20 20 20 20 20  tdown }         
0510: 20 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b        {SQLITE_OK
0520: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
0530: 6c 65 78 2d 31 2e 37 20 7b 20 73 71 6c 69 74 65  lex-1.7 { sqlite
0540: 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74  3_multiplex_init
0550: 69 61 6c 69 7a 65 20 22 22 20 31 20 7d 20 20 20  ialize "" 1 }   
0560: 20 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d       {SQLITE_OK}
0570: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
0580: 65 78 2d 31 2e 38 20 7b 20 73 71 6c 69 74 65 33  ex-1.8 { sqlite3
0590: 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64  _multiplex_shutd
05a0: 6f 77 6e 20 7d 20 20 20 20 20 20 20 20 20 20 20  own }           
05b0: 20 20 20 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a      {SQLITE_OK}.
05c0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53  ------------.# S
0610: 6f 6d 65 20 73 69 6d 70 6c 65 20 77 61 72 6d 2d  ome simple warm-
0620: 62 6f 64 79 20 74 65 73 74 73 20 77 69 74 68 20  body tests with 
0630: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
0640: 65 20 66 69 6c 65 20 69 6e 20 72 6f 6c 6c 62 61  e file in rollba
0650: 63 6b 20 0a 23 20 6d 6f 64 65 3a 0a 23 0a 23 20  ck .# mode:.#.# 
0660: 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 31 2e    multiplex-2.1.
0670: 2a 3a 20 54 65 73 74 20 73 69 6d 70 6c 65 20 77  *: Test simple w
0680: 72 69 74 69 6e 67 20 74 6f 20 61 20 6d 75 6c 74  riting to a mult
0690: 69 70 6c 65 78 20 66 69 6c 65 2e 0a 23 0a 23 20  iplex file..#.# 
06a0: 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 32 2e    multiplex-2.2.
06b0: 2a 3a 20 4d 6f 72 65 20 77 72 69 74 69 6e 67 2e  *: More writing.
06c0: 0a 23 0a 23 20 20 20 6d 75 6c 74 69 70 6c 65 78  .#.#   multiplex
06d0: 2d 32 2e 33 2e 2a 3a 20 4f 70 65 6e 20 61 6e 64  -2.3.*: Open and
06e0: 20 63 6c 6f 73 65 20 61 20 73 65 63 6f 6e 64 20   close a second 
06f0: 64 62 2e 0a 23 0a 23 20 20 20 6d 75 6c 74 69 70  db..#.#   multip
0700: 6c 65 78 2d 32 2e 34 2e 2a 3a 20 54 72 79 20 74  lex-2.4.*: Try t
0710: 6f 20 73 68 75 74 64 6f 77 6e 20 74 68 65 20 6d  o shutdown the m
0720: 75 6c 74 69 70 6c 65 78 20 73 79 73 74 65 6d 20  ultiplex system 
0730: 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 20 74  before closing t
0740: 68 65 20 64 62 0a 23 20 20 20 20 20 20 20 20 20  he db.#         
0750: 20 20 20 20 20 20 20 66 69 6c 65 2e 20 43 68 65         file. Che
0760: 63 6b 20 74 68 61 74 20 74 68 69 73 20 66 61 69  ck that this fai
0770: 6c 73 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69  ls and the multi
0780: 70 6c 65 78 20 73 79 73 74 65 6d 20 73 74 69 6c  plex system stil
0790: 6c 20 77 6f 72 6b 73 0a 23 20 20 20 20 20 20 20  l works.#       
07a0: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 77 61           afterwa
07b0: 72 64 73 2e 20 54 68 65 6e 20 63 6c 6f 73 65 20  rds. Then close 
07c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
07d0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 68   successfully sh
07e0: 75 74 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ut.#            
07f0: 20 20 20 20 64 6f 77 6e 20 74 68 65 20 6d 75 6c      down the mul
0800: 74 69 70 6c 65 78 20 73 79 73 74 65 6d 2e 0a 23  tiplex system..#
0810: 0a 23 20 20 20 6d 75 6c 74 69 70 6c 65 78 2d 32  .#   multiplex-2
0820: 2e 35 2e 2a 3a 20 4d 6f 72 65 20 72 65 61 64 69  .5.*: More readi
0830: 6e 67 2f 77 72 69 74 69 6e 67 20 77 69 74 68 20  ng/writing with 
0840: 73 6d 61 6c 6c 20 63 68 75 6e 6b 20 73 69 7a 65  small chunk size
0850: 2e 0a 0a 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69  ...sqlite3_multi
0860: 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20  plex_initialize 
0870: 22 22 20 31 0a 73 71 6c 69 74 65 33 5f 6d 75 6c  "" 1.sqlite3_mul
0880: 74 69 70 6c 65 78 5f 73 65 74 20 30 78 38 30 30  tiplex_set 0x800
0890: 30 20 31 36 0a 0a 64 6f 5f 74 65 73 74 20 6d 75  0 16..do_test mu
08a0: 6c 74 69 70 6c 65 78 2d 32 2e 31 2e 32 20 7b 0a  ltiplex-2.1.2 {.
08b0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
08c0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
08d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
08e0: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20  _size=1024;.    
08f0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
0900: 75 6d 3d 4f 46 46 3b 0a 20 20 20 20 50 52 41 47  um=OFF;.    PRAG
0910: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
0920: 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20 20 65 78  DELETE;.  }.  ex
0930: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0940: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0950: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0960: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
0970: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 31 30 30 29  randomblob(1100)
0980: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0990: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20  TO t1 VALUES(2, 
09a0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 31 30 30 29  randomblob(1100)
09b0: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
09c0: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e  est multiplex-2.
09d0: 31 2e 33 20 7b 20 66 69 6c 65 20 73 69 7a 65 20  1.3 { file size 
09e0: 74 65 73 74 2e 64 62 20 7d 20 7b 34 30 39 36 7d  test.db } {4096}
09f0: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
0a00: 65 78 2d 32 2e 31 2e 34 20 7b 0a 20 20 65 78 65  ex-2.1.4 {.  exe
0a10: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0a20: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
0a30: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 31 30 30 29  randomblob(1100)
0a40: 29 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  ) }.} {}..do_tes
0a50: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 32 2e  t multiplex-2.2.
0a60: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
0a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0a80: 41 4c 55 45 53 28 33 2c 20 72 61 6e 64 6f 6d 62  ALUES(3, randomb
0a90: 6c 6f 62 28 31 31 30 30 29 29 20 7d 0a 7d 20 7b  lob(1100)) }.} {
0aa0: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
0ab0: 6c 65 78 2d 32 2e 32 2e 33 20 7b 20 66 69 6c 65  lex-2.2.3 { file
0ac0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 20 7d 20   size test.db } 
0ad0: 7b 36 31 34 34 7d 0a 0a 64 6f 5f 74 65 73 74 20  {6144}..do_test 
0ae0: 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 33 2e 31 20  multiplex-2.3.1 
0af0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  {.  sqlite3 db2 
0b00: 62 61 6b 2e 64 62 0a 20 20 64 62 32 20 63 6c 6f  bak.db.  db2 clo
0b10: 73 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  se.} {}..do_test
0b20: 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 34 2e 31   multiplex-2.4.1
0b30: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 6c   {.  sqlite3_mul
0b40: 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77 6e 0a  tiplex_shutdown.
0b50: 7d 20 7b 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  } {SQLITE_MISUSE
0b60: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
0b70: 6c 65 78 2d 32 2e 34 2e 32 20 7b 0a 20 20 65 78  lex-2.4.2 {.  ex
0b80: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
0b90: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
0ba0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 31 30 30   randomblob(1100
0bb0: 29 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  )) }.} {}.do_tes
0bc0: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 34 2e  t multiplex-2.4.
0bd0: 34 20 7b 20 66 69 6c 65 20 73 69 7a 65 20 74 65  4 { file size te
0be0: 73 74 2e 64 62 20 7d 20 7b 37 31 36 38 7d 0a 64  st.db } {7168}.d
0bf0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
0c00: 2d 32 2e 34 2e 39 39 20 7b 0a 20 20 64 62 20 63  -2.4.99 {.  db c
0c10: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6d  lose.  sqlite3_m
0c20: 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64 6f 77  ultiplex_shutdow
0c30: 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  n.} {SQLITE_OK}.
0c40: 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  ..do_test multip
0c50: 6c 65 78 2d 32 2e 35 2e 31 20 7b 0a 20 20 6d 75  lex-2.5.1 {.  mu
0c60: 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74 65 20 74  ltiplex_delete t
0c70: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
0c80: 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69  _multiplex_initi
0c90: 61 6c 69 7a 65 20 22 22 20 31 0a 20 20 73 71 6c  alize "" 1.  sql
0ca0: 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73  ite3_multiplex_s
0cb0: 65 74 20 30 78 31 30 30 30 20 31 36 0a 7d 20 7b  et 0x1000 16.} {
0cc0: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74  SQLITE_OK}..do_t
0cd0: 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e  est multiplex-2.
0ce0: 35 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  5.2 {.  sqlite3 
0cf0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
0d00: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
0d10: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
0d20: 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  24;.    PRAGMA j
0d30: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64 65  ournal_mode = de
0d40: 6c 65 74 65 3b 0a 20 20 20 20 50 52 41 47 4d 41  lete;.    PRAGMA
0d50: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 6f   auto_vacuum = o
0d60: 66 66 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ff;.    CREATE T
0d70: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
0d80: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 7d 0a 7d  Y KEY, b);.  }.}
0d90: 20 7b 64 65 6c 65 74 65 7d 0a 0a 64 6f 5f 74 65   {delete}..do_te
0da0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35  st multiplex-2.5
0db0: 2e 33 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20  .3 { .  execsql 
0dc0: 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  { .    INSERT IN
0dd0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
0de0: 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  'one');.    INSE
0df0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0e00: 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(2, randomblob(
0e10: 34 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  4000));.    INSE
0e20: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0e30: 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 20  S(3, 'three');. 
0e40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0e50: 31 20 56 41 4c 55 45 53 28 34 2c 20 72 61 6e 64  1 VALUES(4, rand
0e60: 6f 6d 62 6c 6f 62 28 34 30 30 30 29 29 3b 0a 20  omblob(4000));. 
0e70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0e80: 31 20 56 41 4c 55 45 53 28 35 2c 20 27 66 69 76  1 VALUES(5, 'fiv
0e90: 65 27 29 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  e') .  }.} {}..d
0ea0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
0eb0: 2d 32 2e 35 2e 34 20 7b 0a 20 20 64 62 20 65 76  -2.5.4 {.  db ev
0ec0: 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  al {SELECT * FRO
0ed0: 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 7d 0a  M t1 WHERE a=1}.
0ee0: 7d 20 7b 31 20 6f 6e 65 7d 0a 0a 64 6f 5f 74 65  } {1 one}..do_te
0ef0: 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35  st multiplex-2.5
0f00: 2e 35 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .5 {.  db eval {
0f10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0f20: 20 57 48 45 52 45 20 61 3d 33 7d 0a 7d 20 7b 33   WHERE a=3}.} {3
0f30: 20 74 68 72 65 65 7d 0a 0a 64 6f 5f 74 65 73 74   three}..do_test
0f40: 20 6d 75 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 36   multiplex-2.5.6
0f50: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   {.  db eval {SE
0f60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0f70: 48 45 52 45 20 61 3d 35 7d 0a 7d 20 7b 35 20 66  HERE a=5}.} {5 f
0f80: 69 76 65 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75  ive}..do_test mu
0f90: 6c 74 69 70 6c 65 78 2d 32 2e 35 2e 37 20 7b 0a  ltiplex-2.5.7 {.
0fa0: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
0fb0: 54 20 61 2c 6c 65 6e 67 74 68 28 62 29 20 46 52  T a,length(b) FR
0fc0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 32 7d  OM t1 WHERE a=2}
0fd0: 0a 7d 20 7b 32 20 34 30 30 30 7d 0a 0a 64 6f 5f  .} {2 4000}..do_
0fe0: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 32  test multiplex-2
0ff0: 2e 35 2e 38 20 7b 0a 20 20 64 62 20 65 76 61 6c  .5.8 {.  db eval
1000: 20 7b 53 45 4c 45 43 54 20 61 2c 6c 65 6e 67 74   {SELECT a,lengt
1010: 68 28 62 29 20 46 52 4f 4d 20 74 31 20 57 48 45  h(b) FROM t1 WHE
1020: 52 45 20 61 3d 34 7d 0a 7d 20 7b 34 20 34 30 30  RE a=4}.} {4 400
1030: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  0}..do_test mult
1040: 69 70 6c 65 78 2d 32 2e 35 2e 39 39 20 7b 0a 20  iplex-2.5.99 {. 
1050: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
1060: 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68  te3_multiplex_sh
1070: 75 74 64 6f 77 6e 0a 7d 20 7b 53 51 4c 49 54 45  utdown.} {SQLITE
1080: 5f 4f 4b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  _OK}..#---------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d0: 0a 23 20 54 72 79 20 73 6f 6d 65 20 74 65 73 74  .# Try some test
10e0: 73 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e  s with more than
10f0: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
1100: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1110: 6c 65 2e 20 53 74 69 6c 6c 0a 23 20 69 6e 20 72  le. Still.# in r
1120: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2e 0a 23 0a  ollback mode..#.
1130: 23 20 20 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e  #   multiplex-3.
1140: 31 2e 2a 3a 20 54 77 6f 20 63 6f 6e 6e 65 63 74  1.*: Two connect
1150: 69 6f 6e 73 20 74 6f 20 61 20 73 69 6e 67 6c 65  ions to a single
1160: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1170: 23 0a 23 20 20 20 6d 75 6c 74 69 70 6c 65 78 2d  #.#   multiplex-
1180: 33 2e 32 2e 2a 3a 20 54 77 6f 20 63 6f 6e 6e 65  3.2.*: Two conne
1190: 63 74 69 6f 6e 73 20 74 6f 20 65 61 63 68 20 6f  ctions to each o
11a0: 66 20 73 65 76 65 72 61 6c 20 64 61 74 61 62 61  f several databa
11b0: 73 65 20 66 69 6c 65 73 20 28 74 68 61 74 0a 23  se files (that.#
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  are in the same 
11e0: 6d 75 6c 74 69 70 6c 65 78 20 67 72 6f 75 70 29  multiplex group)
11f0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  ..#.do_test mult
1200: 69 70 6c 65 78 2d 33 2e 31 2e 31 20 7b 0a 20 20  iplex-3.1.1 {.  
1210: 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74 65  multiplex_delete
1220: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74   test.db.  sqlit
1230: 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69  e3_multiplex_ini
1240: 74 69 61 6c 69 7a 65 20 22 22 20 31 0a 20 20 73  tialize "" 1.  s
1250: 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 78  qlite3_multiplex
1260: 5f 73 65 74 20 30 78 38 30 30 30 20 31 36 0a 7d  _set 0x8000 16.}
1270: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f   {SQLITE_OK}.do_
1280: 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d 33  test multiplex-3
1290: 2e 31 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  .1.2 {.  sqlite3
12a0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
12b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
12c0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
12d0: 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
12e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 64  journal_mode = d
12f0: 65 6c 65 74 65 3b 0a 20 20 20 20 50 52 41 47 4d  elete;.    PRAGM
1300: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
1310: 6f 66 66 3b 0a 20 20 20 20 43 52 45 41 54 45 20  off;.    CREATE 
1320: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
1330: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
1340: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1350: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b  ALUES(1, 'one');
1360: 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65  .  }.  file size
1370: 20 74 65 73 74 2e 64 62 0a 7d 20 7b 33 30 37 32   test.db.} {3072
1380: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
1390: 6c 65 78 2d 33 2e 31 2e 33 20 7b 0a 20 20 73 71  lex-3.1.3 {.  sq
13a0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
13b0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52  b.  execsql { CR
13c0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
13d0: 20 62 29 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64   b) } db2.} {}.d
13e0: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
13f0: 2d 33 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  -3.1.4 {.  execs
1400: 71 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c  ql { CREATE TABL
1410: 45 20 74 33 28 61 2c 20 62 29 20 7d 0a 7d 20 7b  E t3(a, b) }.} {
1420: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
1430: 6c 65 78 2d 33 2e 31 2e 35 20 7b 0a 20 20 63 61  lex-3.1.5 {.  ca
1440: 74 63 68 73 71 6c 20 7b 20 43 52 45 41 54 45 20  tchsql { CREATE 
1450: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29 20 7d  TABLE t3(a, b) }
1460: 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 74 33 20  .} {1 {table t3 
1470: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 7d 7d  already exists}}
1480: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
1490: 65 78 2d 33 2e 31 2e 36 20 7b 0a 20 20 64 62 20  ex-3.1.6 {.  db 
14a0: 63 6c 6f 73 65 0a 20 20 64 62 32 20 63 6c 6f 73  close.  db2 clos
14b0: 65 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  e.} {}..do_test 
14c0: 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e 31 61  multiplex-3.2.1a
14d0: 20 7b 0a 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f   {..  multiplex_
14e0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20  delete test.db. 
14f0: 20 6d 75 6c 74 69 70 6c 65 78 5f 64 65 6c 65 74   multiplex_delet
1500: 65 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 73 71  e test2.db..  sq
1510: 6c 69 74 65 33 20 64 62 31 61 20 74 65 73 74 2e  lite3 db1a test.
1520: 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  db.  sqlite3 db2
1530: 61 20 74 65 73 74 32 2e 64 62 0a 0a 20 20 66 6f  a test2.db..  fo
1540: 72 65 61 63 68 20 64 62 20 7b 64 62 31 61 20 64  reach db {db1a d
1550: 62 32 61 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  b2a} {.    execs
1560: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
1570: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
1580: 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  24;.      PRAGMA
1590: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
15a0: 64 65 6c 65 74 65 3b 0a 20 20 20 20 20 20 50 52  delete;.      PR
15b0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
15c0: 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 43 52   = off;.      CR
15d0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
15e0: 20 62 29 3b 0a 20 20 20 20 7d 20 24 64 62 0a 20   b);.    } $db. 
15f0: 20 7d 0a 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65   }..  list [file
1600: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b   size test.db] [
1610: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e  file size test2.
1620: 64 62 5d 0a 7d 20 7b 32 30 34 38 20 32 30 34 38  db].} {2048 2048
1630: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  }..do_test multi
1640: 70 6c 65 78 2d 33 2e 32 2e 31 62 20 7b 0a 20 20  plex-3.2.1b {.  
1650: 73 71 6c 69 74 65 33 20 64 62 31 62 20 74 65 73  sqlite3 db1b tes
1660: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
1670: 62 32 62 20 74 65 73 74 32 2e 64 62 0a 7d 20 7b  b2b test2.db.} {
1680: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  }..do_test multi
1690: 70 6c 65 78 2d 33 2e 32 2e 32 20 7b 20 65 78 65  plex-3.2.2 { exe
16a0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
16b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
16c0: 2c 20 27 79 27 29 20 7d 20 64 62 31 61 20 7d 20  , 'y') } db1a } 
16d0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  {}.do_test multi
16e0: 70 6c 65 78 2d 33 2e 32 2e 33 20 7b 20 65 78 65  plex-3.2.3 { exe
16f0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
1700: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 76 27  TO t1 VALUES('v'
1710: 2c 20 27 77 27 29 20 7d 20 64 62 31 62 20 7d 20  , 'w') } db1b } 
1720: 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  {}.do_test multi
1730: 70 6c 65 78 2d 33 2e 32 2e 34 20 7b 20 65 78 65  plex-3.2.4 { exe
1740: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
1750: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 74 27  TO t1 VALUES('t'
1760: 2c 20 27 75 27 29 20 7d 20 64 62 32 61 20 7d 20  , 'u') } db2a } 
1770: 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  {}.do_test multi
1780: 70 6c 65 78 2d 33 2e 32 2e 35 20 7b 20 65 78 65  plex-3.2.5 { exe
1790: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
17a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 72 27  TO t1 VALUES('r'
17b0: 2c 20 27 73 27 29 20 7d 20 64 62 32 62 20 7d 20  , 's') } db2b } 
17c0: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  {}..do_test mult
17d0: 69 70 6c 65 78 2d 33 2e 32 2e 36 20 7b 20 0a 20  iplex-3.2.6 { . 
17e0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
17f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1800: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29  (randomblob(500)
1810: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30  , randomblob(500
1820: 29 29 20 7d 20 64 62 31 61 0a 7d 20 7b 7d 0a 64  )) } db1a.} {}.d
1830: 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78  o_test multiplex
1840: 2d 33 2e 32 2e 37 20 7b 20 0a 20 20 65 78 65 63  -3.2.7 { .  exec
1850: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1860: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
1870: 6f 6d 62 6c 6f 62 28 35 30 30 29 2c 20 72 61 6e  omblob(500), ran
1880: 64 6f 6d 62 6c 6f 62 28 35 30 30 29 29 20 7d 20  domblob(500)) } 
1890: 64 62 31 62 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  db1b.} {}.do_tes
18a0: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 33 2e 32 2e  t multiplex-3.2.
18b0: 38 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 20 7b  8 { .  execsql {
18c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
18d0: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
18e0: 62 28 35 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  b(500), randombl
18f0: 6f 62 28 35 30 30 29 29 20 7d 20 64 62 32 61 0a  ob(500)) } db2a.
1900: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c  } {}.do_test mul
1910: 74 69 70 6c 65 78 2d 33 2e 32 2e 39 20 7b 20 0a  tiplex-3.2.9 { .
1920: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
1930: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1940: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30  S(randomblob(500
1950: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30  ), randomblob(50
1960: 30 29 29 20 7d 20 64 62 32 62 0a 7d 20 7b 7d 0a  0)) } db2b.} {}.
1970: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
1980: 65 78 2d 33 2e 33 2e 31 20 7b 20 0a 20 20 65 78  ex-3.3.1 { .  ex
1990: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
19a0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
19b0: 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 2c 20 72  ndomblob(500), r
19c0: 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 29 20  andomblob(500)) 
19d0: 7d 20 64 62 31 61 0a 20 20 65 78 65 63 73 71 6c  } db1a.  execsql
19e0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
19f0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
1a00: 6c 6f 62 28 35 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(500), random
1a10: 62 6c 6f 62 28 35 30 30 29 29 20 7d 20 64 62 31  blob(500)) } db1
1a20: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  b.  execsql { IN
1a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1a40: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  UES(randomblob(5
1a50: 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  00), randomblob(
1a60: 35 30 30 29 29 20 7d 20 64 62 32 61 0a 20 20 65  500)) } db2a.  e
1a70: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
1a80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
1a90: 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 2c 20  andomblob(500), 
1aa0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 29 29  randomblob(500))
1ab0: 20 7d 20 64 62 32 62 0a 7d 20 7b 7d 0a 0a 64 6f   } db2b.} {}..do
1ac0: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
1ad0: 33 2e 32 2e 58 20 7b 0a 20 20 66 6f 72 65 61 63  3.2.X {.  foreac
1ae0: 68 20 64 62 20 7b 64 62 31 61 20 64 62 32 61 20  h db {db1a db2a 
1af0: 64 62 32 62 20 64 62 31 62 7d 20 7b 20 63 61 74  db2b db1b} { cat
1b00: 63 68 20 7b 20 24 64 62 20 63 6c 6f 73 65 20 7d  ch { $db close }
1b10: 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   }.} {}..#------
1b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b60: 2d 2d 2d 0a 23 0a 0a 73 71 6c 69 74 65 33 5f 6d  ---.#..sqlite3_m
1b70: 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69 61 6c  ultiplex_initial
1b80: 69 7a 65 20 22 22 20 31 0a 73 71 6c 69 74 65 33  ize "" 1.sqlite3
1b90: 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 65 74 20 30  _multiplex_set 0
1ba0: 78 38 30 30 30 20 31 36 0a 0a 23 20 52 65 74 75  x8000 16..# Retu
1bb0: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c  rn a list of all
1bc0: 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
1bd0: 65 64 20 6d 75 6c 74 69 70 6c 65 78 73 2e 0a 70  ed multiplexs..p
1be0: 72 6f 63 20 6d 75 6c 74 69 70 6c 65 78 5f 6c 69  roc multiplex_li
1bf0: 73 74 20 7b 7d 20 7b 0a 20 20 73 65 74 20 61 6c  st {} {.  set al
1c00: 6c 71 20 7b 7d 0a 20 20 66 6f 72 65 61 63 68 20  lq {}.  foreach 
1c10: 71 20 5b 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69  q [sqlite3_multi
1c20: 70 6c 65 78 5f 64 75 6d 70 5d 20 7b 0a 20 20 20  plex_dump] {.   
1c30: 20 6c 61 70 70 65 6e 64 20 61 6c 6c 71 20 5b 6c   lappend allq [l
1c40: 69 6e 64 65 78 20 24 71 20 30 5d 0a 20 20 7d 0a  index $q 0].  }.
1c50: 20 20 72 65 74 75 72 6e 20 5b 6c 73 6f 72 74 20    return [lsort 
1c60: 24 61 6c 6c 71 5d 0a 7d 0a 0a 64 6f 5f 74 65 73  $allq].}..do_tes
1c70: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e  t multiplex-4.1.
1c80: 36 20 7b 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f  6 {.  multiplex_
1c90: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 0a  delete test2.db.
1ca0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
1cb0: 74 32 2e 64 62 0a 20 20 64 62 20 65 76 61 6c 20  t2.db.  db eval 
1cc0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32  {CREATE TABLE t2
1cd0: 28 78 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  (x); INSERT INTO
1ce0: 20 74 32 20 56 41 4c 55 45 53 28 27 74 61 62 2d   t2 VALUES('tab-
1cf0: 74 32 27 29 3b 7d 0a 20 20 73 65 74 20 72 65 73  t2');}.  set res
1d00: 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6c 69 73 74   [multiplex_list
1d10: 5d 0a 20 20 6c 69 73 74 20 5b 72 65 67 65 78 70  ].  list [regexp
1d20: 20 7b 74 65 73 74 32 2e 64 62 7d 20 24 72 65 73   {test2.db} $res
1d30: 5d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  ].} {1}.do_test 
1d40: 6d 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 36 61  multiplex-4.1.6a
1d50: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32   {.  sqlite3 db2
1d60: 20 74 65 73 74 32 2e 64 62 0a 20 20 64 62 32 20   test2.db.  db2 
1d70: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
1d80: 52 4f 4d 20 74 32 7d 0a 7d 20 7b 74 61 62 2d 74  ROM t2}.} {tab-t
1d90: 32 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  2}.do_test multi
1da0: 70 6c 65 78 2d 34 2e 31 2e 37 20 7b 0a 20 20 65  plex-4.1.7 {.  e
1db0: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
1dc0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 7a 65  NTO t2 VALUES(ze
1dd0: 72 6f 62 6c 6f 62 28 32 30 30 30 30 30 29 29 7d  roblob(200000))}
1de0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  .} {}.do_test mu
1df0: 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 38 20 7b 0a  ltiplex-4.1.8 {.
1e00: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
1e10: 73 74 32 2e 64 62 0a 20 20 64 62 32 20 65 76 61  st2.db.  db2 eva
1e20: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  l {SELECT count(
1e30: 2a 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 32  *) FROM t2}.} {2
1e40: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
1e50: 6c 65 78 2d 34 2e 31 2e 38 61 20 7b 0a 20 20 20  lex-4.1.8a {.   
1e60: 64 62 32 20 65 76 61 6c 20 7b 20 44 45 4c 45 54  db2 eval { DELET
1e70: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
1e80: 78 20 3d 20 27 74 61 62 2d 74 32 27 20 7d 0a 7d  x = 'tab-t2' }.}
1e90: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74   {}.do_test mult
1ea0: 69 70 6c 65 78 2d 34 2e 31 2e 38 62 20 7b 0a 20  iplex-4.1.8b {. 
1eb0: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
1ec0: 74 32 2e 64 62 0a 20 20 64 62 32 20 65 76 61 6c  t2.db.  db2 eval
1ed0: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
1ee0: 29 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 7d  ) FROM t2}.} {1}
1ef0: 0a 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69  ...do_test multi
1f00: 70 6c 65 78 2d 34 2e 31 2e 39 20 7b 0a 20 20 65  plex-4.1.9 {.  e
1f10: 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20 49  xecsql {INSERT I
1f20: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 7a 65  NTO t2 VALUES(ze
1f30: 72 6f 62 6c 6f 62 28 32 30 30 30 30 30 29 29 7d  roblob(200000))}
1f40: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d 75  .} {}.do_test mu
1f50: 6c 74 69 70 6c 65 78 2d 34 2e 31 2e 31 30 20 7b  ltiplex-4.1.10 {
1f60: 0a 20 20 73 65 74 20 72 65 73 20 5b 6d 75 6c 74  .  set res [mult
1f70: 69 70 6c 65 78 5f 6c 69 73 74 5d 0a 20 20 6c 69  iplex_list].  li
1f80: 73 74 20 5b 72 65 67 65 78 70 20 7b 74 65 73 74  st [regexp {test
1f90: 32 2e 64 62 7d 20 24 72 65 73 5d 0a 7d 20 7b 31  2.db} $res].} {1
1fa0: 7d 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70  }.do_test multip
1fb0: 6c 65 78 2d 34 2e 31 2e 31 31 20 7b 0a 20 20 64  lex-4.1.11 {.  d
1fc0: 62 32 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 72  b2 close.  set r
1fd0: 65 73 20 5b 6d 75 6c 74 69 70 6c 65 78 5f 6c 69  es [multiplex_li
1fe0: 73 74 5d 0a 20 20 6c 69 73 74 20 5b 72 65 67 65  st].  list [rege
1ff0: 78 70 20 7b 74 65 73 74 32 2e 64 62 7d 20 24 72  xp {test2.db} $r
2000: 65 73 5d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  es].} {1}.do_tes
2010: 74 20 6d 75 6c 74 69 70 6c 65 78 2d 34 2e 31 2e  t multiplex-4.1.
2020: 31 32 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  12 {.  db close.
2030: 20 20 6d 75 6c 74 69 70 6c 65 78 5f 6c 69 73 74    multiplex_list
2040: 0a 7d 20 7b 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  .} {}...#-------
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
20a0: 6e 67 20 74 65 73 74 73 20 74 65 73 74 20 74 68  ng tests test th
20b0: 61 74 20 74 68 65 20 6d 75 6c 74 69 70 6c 65 78  at the multiplex
20c0: 20 56 46 53 20 68 61 6e 64 6c 65 73 20 6d 61 6c   VFS handles mal
20d0: 6c 6f 63 20 61 6e 64 20 49 4f 20 0a 23 20 65 72  loc and IO .# er
20e0: 72 6f 72 73 2e 0a 23 0a 0a 73 71 6c 69 74 65 33  rors..#..sqlite3
20f0: 5f 6d 75 6c 74 69 70 6c 65 78 5f 69 6e 69 74 69  _multiplex_initi
2100: 61 6c 69 7a 65 20 22 22 20 31 0a 73 71 6c 69 74  alize "" 1.sqlit
2110: 65 33 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 65 74  e3_multiplex_set
2120: 20 30 78 38 30 30 30 20 31 36 0a 0a 64 6f 5f 66   0x8000 16..do_f
2130: 61 75 6c 74 73 69 6d 5f 74 65 73 74 20 6d 75 6c  aultsim_test mul
2140: 74 69 70 6c 65 78 2d 35 2e 31 20 2d 70 72 65 70  tiplex-5.1 -prep
2150: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   {.  catch {db c
2160: 6c 6f 73 65 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  lose}.} -body {.
2170: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
2180: 74 32 2e 64 62 0a 7d 0a 64 6f 5f 66 61 75 6c 74  t2.db.}.do_fault
2190: 73 69 6d 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  sim_test multipl
21a0: 65 78 2d 35 2e 32 20 2d 70 72 65 70 20 7b 0a 20  ex-5.2 -prep {. 
21b0: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
21c0: 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a 20 20 73 71  }.} -body {.  sq
21d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
21e0: 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63  .}..catch { db c
21f0: 6c 6f 73 65 20 7d 0a 6d 75 6c 74 69 70 6c 65 78  lose }.multiplex
2200: 5f 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  _delete test.db.
2210: 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  .do_test multipl
2220: 65 78 2d 35 2e 33 2e 70 72 65 70 20 7b 0a 20 20  ex-5.3.prep {.  
2230: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
2240: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
2250: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
2260: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 50  acuum = 1;.    P
2270: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
2280: 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
2290: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
22a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
22b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30 2c  TO t1 VALUES(10,
22c0: 20 7a 65 72 6f 62 6c 6f 62 28 31 32 30 30 29 29   zeroblob(1200))
22d0: 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d  ;.  }.  faultsim
22e0: 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a  _save_and_close.
22f0: 7d 20 7b 7d 0a 64 6f 5f 66 61 75 6c 74 73 69 6d  } {}.do_faultsim
2300: 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c 65 78 2d  _test multiplex-
2310: 35 2e 33 20 2d 70 72 65 70 20 7b 0a 20 20 66 61  5.3 -prep {.  fa
2320: 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61  ultsim_restore_a
2330: 6e 64 5f 72 65 6f 70 65 6e 0a 7d 20 2d 62 6f 64  nd_reopen.} -bod
2340: 79 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  y {.  execsql { 
2350: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d  DELETE FROM t1 }
2360: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75 6c 74  .}..do_test mult
2370: 69 70 6c 65 78 2d 35 2e 34 2e 31 20 7b 0a 20 20  iplex-5.4.1 {.  
2380: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
2390: 20 7d 0a 20 20 6d 75 6c 74 69 70 6c 65 78 5f 64   }.  multiplex_d
23a0: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20  elete test.db.  
23b0: 66 69 6c 65 20 6d 6b 64 69 72 20 74 65 73 74 2e  file mkdir test.
23c0: 64 62 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68  db.  list [catch
23d0: 20 7b 20 73 71 6c 69 74 65 33 20 64 62 20 74 65   { sqlite3 db te
23e0: 73 74 2e 64 62 20 7d 20 6d 73 67 5d 20 24 6d 73  st.db } msg] $ms
23f0: 67 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74  g.} {1 {unable t
2400: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
2410: 66 69 6c 65 7d 7d 0a 0a 64 6f 5f 66 61 75 6c 74  file}}..do_fault
2420: 73 69 6d 5f 74 65 73 74 20 6d 75 6c 74 69 70 6c  sim_test multipl
2430: 65 78 2d 35 2e 35 20 2d 70 72 65 70 20 7b 0a 20  ex-5.5 -prep {. 
2440: 20 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33   catch { sqlite3
2450: 5f 6d 75 6c 74 69 70 6c 65 78 5f 73 68 75 74 64  _multiplex_shutd
2460: 6f 77 6e 20 7d 0a 7d 20 2d 62 6f 64 79 20 7b 0a  own }.} -body {.
2470: 20 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70    sqlite3_multip
2480: 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 20 22  lex_initialize "
2490: 22 20 31 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  " 1.  sqlite3_mu
24a0: 6c 74 69 70 6c 65 78 5f 73 65 74 20 30 78 38 30  ltiplex_set 0x80
24b0: 30 30 20 31 36 0a 7d 0a 0a 63 61 74 63 68 20 7b  00 16.}..catch {
24c0: 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c   sqlite3_multipl
24d0: 65 78 5f 73 68 75 74 64 6f 77 6e 20 7d 0a 66 69  ex_shutdown }.fi
24e0: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.