/ Hex Artifact Content
Login

Artifact 9dfbeb0a323733fe1d13443371734bb94a674dbf777f464365475903873111f8:


0000: 23 20 32 30 31 35 20 4a 75 6c 79 20 32 36 0a 23  # 2015 July 26.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 23 20 4d 69 73 63 65 6c 6c  ****.#.# Miscell
0170: 61 6e 65 6f 75 73 20 74 65 73 74 73 20 66 6f 72  aneous tests for
0180: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   transactions st
0190: 61 72 74 65 64 20 77 69 74 68 20 42 45 47 49 4e  arted with BEGIN
01a0: 20 43 4f 4e 43 55 52 52 45 4e 54 2e 20 0a 23 0a   CONCURRENT. .#.
01b0: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
01c0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
01d0: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
01e0: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f  ir/tester.tcl.so
01f0: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 6c 6f  urce $testdir/lo
0200: 63 6b 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f  ck_common.tcl.so
0210: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 77 61  urce $testdir/wa
0220: 6c 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 65 74  l_common.tcl.set
0230: 20 3a 3a 74 65 73 74 70 72 65 66 69 78 20 63 6f   ::testprefix co
0240: 6e 63 75 72 72 65 6e 74 32 0a 0a 69 66 63 61 70  ncurrent2..ifcap
0250: 61 62 6c 65 20 21 63 6f 6e 63 75 72 72 65 6e 74  able !concurrent
0260: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0270: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f  .  return.}..do_
0280: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
0290: 20 74 6e 20 7b 0a 0a 20 20 64 6f 5f 74 65 73 74   tn {..  do_test
02a0: 20 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73   1.$tn.1 {.    s
02b0: 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47  ql1 {.      PRAG
02c0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
02d0: 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 43 52 45  = wal;.      CRE
02e0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
02f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
0300: 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20 7d  BLE t2(y);.    }
0310: 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f  .  } {wal}.  do_
0320: 74 65 73 74 20 31 2e 24 74 6e 2e 35 20 7b 20 73  test 1.$tn.5 { s
0330: 71 6c 33 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  ql3 { PRAGMA int
0340: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d  egrity_check } }
0350: 20 7b 6f 6b 7d 0a 0a 20 20 23 20 54 65 73 74 20   {ok}..  # Test 
0360: 74 68 61 74 20 61 6e 20 43 4f 4e 43 55 52 52 45  that an CONCURRE
0370: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  NT transaction t
0380: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 2f 66 72  hat allocates/fr
0390: 65 65 73 20 6e 6f 20 70 61 67 65 73 20 64 6f 65  ees no pages doe
03a0: 73 0a 20 20 23 20 6e 6f 74 20 63 6f 6e 66 6c 69  s.  # not confli
03b0: 63 74 20 77 69 74 68 20 61 20 74 72 61 6e 73 61  ct with a transa
03c0: 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20  ction that does 
03d0: 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 73 2e 0a  allocate pages..
03e0: 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e    do_test 1.$tn.
03f0: 32 20 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  2  {.    sql1 { 
0400: 0a 20 20 20 20 20 20 42 45 47 49 4e 20 43 4f 4e  .      BEGIN CON
0410: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 20 20 20  CURRENT;.       
0420: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0430: 56 41 4c 55 45 53 28 34 29 3b 0a 20 20 20 20 7d  VALUES(4);.    }
0440: 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20 20  .    sql2 {.    
0450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0460: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
0470: 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20 7d  ob(1500));.    }
0480: 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
0490: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a    COMMIT;.    }.
04a0: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
04b0: 20 31 2e 24 74 6e 2e 35 20 7b 20 73 71 6c 33 20   1.$tn.5 { sql3 
04c0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
04d0: 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b  ty_check } } {ok
04e0: 7d 0a 20 20 0a 20 20 23 20 42 75 74 20 74 68 61  }.  .  # But tha
04f0: 74 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  t an CONCURRENT 
0500: 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
0510: 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 61   conflict with a
0520: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23   transaction.  #
0530: 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74   that modifies t
0540: 68 65 20 64 62 20 73 63 68 65 6d 61 2e 0a 20 20  he db schema..  
0550: 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e 33 20  do_test 1.$tn.3 
0560: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
0570: 20 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55 52      BEGIN CONCUR
0580: 52 45 4e 54 3b 0a 20 20 20 20 20 20 20 20 49 4e  RENT;.        IN
0590: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
05a0: 55 45 53 28 35 29 3b 0a 20 20 20 20 7d 0a 20 20  UES(5);.    }.  
05b0: 20 20 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 43    sql2 {.      C
05c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 7a  REATE TABLE t3(z
05d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 73  );.    }.    lis
05e0: 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 31 20  t [catch { sql1 
05f0: 43 4f 4d 4d 49 54 20 7d 20 6d 73 67 5d 20 24 6d  COMMIT } msg] $m
0600: 73 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  sg.  } {1 {datab
0610: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
0620: 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e    do_test 1.$tn.
0630: 35 20 7b 20 73 71 6c 33 20 7b 20 50 52 41 47 4d  5 { sql3 { PRAGM
0640: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
0650: 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 0a 20 20  k } } {ok}.  .  
0660: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 43  # Test that an C
0670: 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
0680: 63 74 69 6f 6e 20 74 68 61 74 20 61 6c 6c 6f 63  ction that alloc
0690: 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
06a0: 65 20 70 61 67 65 20 0a 20 20 23 20 64 6f 65 73  e page .  # does
06b0: 20 6e 6f 74 20 63 6f 6e 66 6c 69 63 74 20 77 69   not conflict wi
06c0: 74 68 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  th a transaction
06d0: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
06e0: 6e 6f 20 70 61 67 65 73 2e 0a 20 20 64 6f 5f 74  no pages..  do_t
06f0: 65 73 74 20 31 2e 24 74 6e 2e 34 20 20 7b 0a 20  est 1.$tn.4  {. 
0700: 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20     sql1 { .     
0710: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20   ROLLBACK;.     
0720: 20 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e   BEGIN CONCURREN
0730: 54 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  T;.        INSER
0740: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0750: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30  (randomblob(1500
0760: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
0770: 6c 32 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  l2 {.      INSER
0780: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
0790: 28 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (8);.    }.    s
07a0: 71 6c 31 20 7b 0a 20 20 20 20 20 20 43 4f 4d 4d  ql1 {.      COMM
07b0: 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  IT;.    }.  } {}
07c0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74  ..  do_test 1.$t
07d0: 6e 2e 35 20 7b 20 73 71 6c 33 20 7b 20 50 52 41  n.5 { sql3 { PRA
07e0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
07f0: 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a  eck } } {ok}.}..
0800: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0810: 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65  est tn {.  do_te
0820: 73 74 20 32 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  st 2.$tn.1 {.   
0830: 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52   sql1 {.      PR
0840: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
0850: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 43  e = wal;.      C
0860: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
0870: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 20 20   UNIQUE);.      
0880: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
0890: 79 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 7d  y UNIQUE);.    }
08a0: 0a 20 20 7d 20 7b 77 61 6c 7d 0a 0a 20 20 64 6f  .  } {wal}..  do
08b0: 5f 74 65 73 74 20 32 2e 24 74 6e 2e 32 20 20 7b  _test 2.$tn.2  {
08c0: 0a 20 20 20 20 73 71 6c 31 20 7b 20 0a 20 20 20  .    sql1 { .   
08d0: 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55 52 52     BEGIN CONCURR
08e0: 45 4e 54 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  ENT;.        INS
08f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0900: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ES(randomblob(15
0910: 30 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  00));.    }.    
0920: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 49 4e 53  sql2 {.      INS
0930: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
0940: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ES(randomblob(15
0950: 30 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  00));.    }.    
0960: 73 71 6c 31 20 43 4f 4d 4d 49 54 0a 20 20 7d 20  sql1 COMMIT.  } 
0970: 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e  {}..  do_test 2.
0980: 24 74 6e 2e 33 20 7b 20 73 71 6c 33 20 7b 20 50  $tn.3 { sql3 { P
0990: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
09a0: 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 0a  check } } {ok}..
09b0: 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 74 6e 2e    do_test 2.$tn.
09c0: 34 20 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20  4  {.    sql1 { 
09d0: 0a 20 20 20 20 20 20 42 45 47 49 4e 20 43 4f 4e  .      BEGIN CON
09e0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 20 20 20  CURRENT;.       
09f0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
0a00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20  .    }.    sql2 
0a10: 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  {.      DELETE F
0a20: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20  ROM t2;.    }.  
0a30: 20 20 73 71 6c 31 20 43 4f 4d 4d 49 54 0a 20 20    sql1 COMMIT.  
0a40: 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  } {}..  do_test 
0a50: 32 2e 24 74 6e 2e 35 20 7b 20 73 71 6c 33 20 7b  2.$tn.5 { sql3 {
0a60: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
0a70: 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d  y_check } } {ok}
0a80: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24 74  ..  do_test 2.$t
0a90: 6e 2e 36 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.6 {.    sql1 {
0aa0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0ab0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
0ac0: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
0ad0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0ae0: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
0af0: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20  omblob(1500));. 
0b00: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0b10: 20 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t2 VALUES(rando
0b20: 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20  mblob(1500));.  
0b30: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0b40: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31  t1 WHERE rowid=1
0b50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
0b60: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20  1 {.      BEGIN 
0b70: 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20 20  CONCURRENT;.    
0b80: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0b90: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 3d 32  t1 WHERE rowid=2
0ba0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
0bb0: 32 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  2 {.      DELETE
0bc0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
0bd0: 0a 20 20 20 20 73 71 6c 31 20 43 4f 4d 4d 49 54  .    sql1 COMMIT
0be0: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 74 65  .  } {}..  do_te
0bf0: 73 74 20 32 2e 24 74 6e 2e 37 20 7b 20 73 71 6c  st 2.$tn.7 { sql
0c00: 33 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  3 { PRAGMA integ
0c10: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b  rity_check } } {
0c20: 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ok}.}..#--------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c70: 2d 0a 23 20 57 68 65 6e 20 61 6e 20 43 4f 4e 43  -.# When an CONC
0c80: 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69  URRENT transacti
0c90: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  on is opened on 
0ca0: 61 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  a database, the 
0cb0: 6e 46 72 65 65 20 61 6e 64 20 0a 23 20 69 54 72  nFree and .# iTr
0cc0: 75 6e 6b 20 68 65 61 64 65 72 20 66 69 65 6c 64  unk header field
0cd0: 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20  s of the cached 
0ce0: 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
0cf0: 31 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 0a  1 are both set .
0d00: 23 20 74 6f 20 30 2e 20 54 68 69 73 20 61 6c 6c  # to 0. This all
0d10: 6f 77 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e  ows an CONCURREN
0d20: 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  T transaction to
0d30: 20 75 73 65 20 69 74 73 20 6f 77 6e 20 70 72 69   use its own pri
0d40: 76 61 74 65 20 0a 23 20 66 72 65 65 2d 70 61 67  vate .# free-pag
0d50: 65 2d 6c 69 73 74 2c 20 77 68 69 63 68 20 69 73  e-list, which is
0d60: 20 6d 65 72 67 65 64 20 77 69 74 68 20 74 68 65   merged with the
0d70: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
0d80: 72 65 65 2d 6c 69 73 74 20 77 68 65 6e 0a 23 20  ree-list when.# 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a  is committed..#.
0db0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
0dc0: 74 65 73 74 73 20 63 68 65 63 6b 20 74 68 61 74  tests check that
0dd0: 20 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20 61 72   nFree/iTrunk ar
0de0: 65 20 63 6f 72 72 65 63 74 6c 79 20 72 65 73 74  e correctly rest
0df0: 6f 72 65 64 20 69 66 0a 23 20 61 6e 20 43 4f 4e  ored if.# an CON
0e00: 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74  CURRENT transact
0e10: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
0e20: 63 6b 2c 20 61 6e 64 20 74 68 61 74 20 73 61 76  ck, and that sav
0e30: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 73  epoint rollbacks
0e40: 0a 23 20 74 68 61 74 20 6f 63 63 75 72 20 77 69  .# that occur wi
0e50: 74 68 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  thin CONCURRENT 
0e60: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 64 6f 20  transactions do 
0e70: 6e 6f 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  not incorrectly 
0e80: 72 65 73 74 6f 72 65 0a 23 20 74 68 65 73 65 20  restore.# these 
0e90: 66 69 65 6c 64 73 20 74 6f 20 74 68 65 69 72 20  fields to their 
0ea0: 6f 6e 2d 64 69 73 6b 20 76 61 6c 75 65 73 2e 0a  on-disk values..
0eb0: 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78  #.reset_db.do_ex
0ec0: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 30 20 7b  ecsql_test 3.0 {
0ed0: 0a 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  .  PRAGMA journa
0ee0: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
0ef0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0f00: 78 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20  x, y);.  INSERT 
0f10: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
0f20: 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 2c  andomblob(1500),
0f30: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30   randomblob(1500
0f40: 29 29 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  ));.  DELETE FRO
0f50: 4d 20 74 31 3b 0a 7d 20 7b 77 61 6c 7d 0a 0a 64  M t1;.} {wal}..d
0f60: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33  o_execsql_test 3
0f70: 2e 31 20 7b 0a 20 20 42 45 47 49 4e 20 43 4f 4e  .1 {.  BEGIN CON
0f80: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 49 4e 53  CURRENT;.    INS
0f90: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0fa0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 52 4f 4c 4c  ES(1, 2);.  ROLL
0fb0: 42 41 43 4b 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63  BACK;.}..do_exec
0fc0: 73 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b 20 50  sql_test 3.2 { P
0fd0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
0fe0: 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 0a 64 6f 5f  check } {ok}.do_
0ff0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 33  execsql_test 3.3
1000: 20 7b 20 50 52 41 47 4d 41 20 66 72 65 65 6c 69   { PRAGMA freeli
1010: 73 74 5f 63 6f 75 6e 74 20 7d 20 7b 32 7d 0a 0a  st_count } {2}..
1020: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1030: 33 2e 34 2e 31 20 7b 0a 20 20 42 45 47 49 4e 20  3.4.1 {.  BEGIN 
1040: 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20 20  CONCURRENT;.    
1050: 50 52 41 47 4d 41 20 66 72 65 65 6c 69 73 74 5f  PRAGMA freelist_
1060: 63 6f 75 6e 74 3b 0a 7d 20 7b 32 7d 0a 64 6f 5f  count;.} {2}.do_
1070: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 34  execsql_test 3.4
1080: 2e 32 20 7b 0a 20 20 53 41 56 45 50 4f 49 4e 54  .2 {.  SAVEPOINT
1090: 20 78 79 7a 3b 0a 20 20 20 20 49 4e 53 45 52 54   xyz;.    INSERT
10a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
10b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
10c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 50 52 41  , NULL);.    PRA
10d0: 47 4d 41 20 66 72 65 65 6c 69 73 74 5f 63 6f 75  GMA freelist_cou
10e0: 6e 74 3b 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  nt;.} {0}.do_exe
10f0: 63 73 71 6c 5f 74 65 73 74 20 33 2e 34 2e 33 20  csql_test 3.4.3 
1100: 7b 0a 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  {.  ROLLBACK TO 
1110: 78 79 7a 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65  xyz;.} {}.do_exe
1120: 63 73 71 6c 5f 74 65 73 74 20 33 2e 34 2e 34 20  csql_test 3.4.4 
1130: 7b 20 50 52 41 47 4d 41 20 66 72 65 65 6c 69 73  { PRAGMA freelis
1140: 74 5f 63 6f 75 6e 74 20 7d 20 7b 30 7d 0a 64 6f  t_count } {0}.do
1150: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
1160: 34 2e 35 20 7b 20 43 4f 4d 4d 49 54 3b 20 50 52  4.5 { COMMIT; PR
1170: 41 47 4d 41 20 66 72 65 65 6c 69 73 74 5f 63 6f  AGMA freelist_co
1180: 75 6e 74 20 7d 20 7b 32 7d 0a 64 6f 5f 65 78 65  unt } {2}.do_exe
1190: 63 73 71 6c 5f 74 65 73 74 20 33 2e 34 2e 36 20  csql_test 3.4.6 
11a0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
11b0: 74 79 5f 63 68 65 63 6b 20 7d 20 7b 6f 6b 7d 0a  ty_check } {ok}.
11c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
11d0: 20 33 2e 35 2e 31 20 7b 0a 20 20 42 45 47 49 4e   3.5.1 {.  BEGIN
11e0: 20 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20   CONCURRENT;.   
11f0: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78   UPDATE t1 SET x
1200: 3d 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 20  =randomblob(10) 
1210: 57 48 45 52 45 20 79 3d 35 35 35 3b 0a 20 20 20  WHERE y=555;.   
1220: 20 50 52 41 47 4d 41 20 66 72 65 65 6c 69 73 74   PRAGMA freelist
1230: 5f 63 6f 75 6e 74 3b 0a 7d 20 7b 30 7d 0a 64 6f  _count;.} {0}.do
1240: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
1250: 35 2e 32 20 7b 0a 20 20 52 4f 4c 4c 42 41 43 4b  5.2 {.  ROLLBACK
1260: 3b 0a 20 20 50 52 41 47 4d 41 20 66 72 65 65 6c  ;.  PRAGMA freel
1270: 69 73 74 5f 63 6f 75 6e 74 3b 0a 7d 20 7b 32 7d  ist_count;.} {2}
1280: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1290: 20 33 2e 35 2e 33 20 7b 20 50 52 41 47 4d 41 20   3.5.3 { PRAGMA 
12a0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
12b0: 7d 20 7b 6f 6b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  } {ok}..#-------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1300: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 6e  --.# Test that n
1310: 6f 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  othing goes wron
1320: 67 20 69 66 20 61 6e 20 43 4f 4e 43 55 52 52 45  g if an CONCURRE
1330: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  NT transaction a
1340: 6c 6c 6f 63 61 74 65 73 20 61 0a 23 20 70 61 67  llocates a.# pag
1350: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
1360: 74 68 65 20 66 69 6c 65 2c 20 66 72 65 65 73 20  the file, frees 
1370: 69 74 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  it within the sa
1380: 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  me transaction, 
1390: 61 6e 64 0a 23 20 74 68 65 6e 20 68 61 73 20 74  and.# then has t
13a0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 61 6d 65 20  o move the same 
13b0: 70 61 67 65 20 74 6f 20 61 76 6f 69 64 20 61 20  page to avoid a 
13c0: 63 6f 6e 66 6c 69 63 74 20 6f 6e 20 43 4f 4d 4d  conflict on COMM
13d0: 49 54 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c  IT..#.do_multicl
13e0: 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20  ient_test tn {. 
13f0: 20 64 6f 5f 74 65 73 74 20 34 2e 24 74 6e 2e 31   do_test 4.$tn.1
1400: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
1410: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
1420: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
1430: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
1440: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 43  E t1(x);.      C
1450: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
1460: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  );.    }.  } {wa
1470: 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 34 2e  l}..  do_test 4.
1480: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.2 {.    sql1
1490: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20 43   {.      BEGIN C
14a0: 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 20  ONCURRENT;.     
14b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
14c0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
14d0: 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20 20  lob(1500));.    
14e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14f0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
1500: 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20  blob(1500));.   
1510: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
1520: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20   t1 WHERE rowid 
1530: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1540: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 49 4e 53  sql2 {.      INS
1550: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
1560: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ES(randomblob(15
1570: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
1580: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1590: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30  S(randomblob(150
15a0: 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  0));.      INSER
15b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
15c0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30  (randomblob(1500
15d0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
15e0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
15f0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
1600: 29 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  );.      DELETE 
1610: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 72 6f  FROM t2 WHERE ro
1620: 77 69 64 20 49 4e 20 28 31 2c 20 32 29 3b 0a 20  wid IN (1, 2);. 
1630: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 31 20 43     }..    sql1 C
1640: 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a  OMMIT.  } {}.}..
1650: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
16a0: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
16b0: 20 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20   tn {.  do_test 
16c0: 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71  5.$tn.1 {.    sq
16d0: 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  l1 {.      PRAGM
16e0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
16f0: 20 77 61 6c 3b 0a 20 20 20 20 20 20 43 52 45 41   wal;.      CREA
1700: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
1710: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
1720: 4c 45 20 74 32 28 78 29 3b 0a 20 20 20 20 20 20  LE t2(x);.      
1730: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1740: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
1750: 28 31 35 30 30 29 29 3b 0a 20 20 20 20 20 20 50  (1500));.      P
1760: 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74  RAGMA page_count
1770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c  ;.    }.  } {wal
1780: 20 34 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 35   4}..  do_test 5
1790: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71 6c  .$tn.2 {.    sql
17a0: 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20  1 {.      BEGIN 
17b0: 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20 20  CONCURRENT;.    
17c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
17d0: 74 32 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t2 VALUES(random
17e0: 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20 20 20  blob(1500));.   
17f0: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
1800: 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  _count;.    }.  
1810: 7d 20 7b 35 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  } {5}..  do_test
1820: 20 35 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73   5.$tn.3 {.    s
1830: 71 6c 32 20 7b 20 0a 20 20 20 20 20 20 44 45 4c  ql2 { .      DEL
1840: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ETE FROM t1;.   
1850: 20 20 20 50 52 41 47 4d 41 20 66 72 65 65 6c 69     PRAGMA freeli
1860: 73 74 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20  st_count;.      
1870: 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
1880: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  t;.    }.  } {1 
1890: 34 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 35 2e  4}..  do_test 5.
18a0: 24 74 6e 2e 34 20 7b 20 73 71 6c 31 20 43 4f 4d  $tn.4 { sql1 COM
18b0: 4d 49 54 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  MIT } {}.  do_te
18c0: 73 74 20 35 2e 24 74 6e 2e 35 20 7b 20 73 71 6c  st 5.$tn.5 { sql
18d0: 33 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  3 { PRAGMA integ
18e0: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b  rity_check } } {
18f0: 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ok}.}..#--------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1940: 2d 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65  -.#.do_multiclie
1950: 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64  nt_test tn {.  d
1960: 6f 5f 74 65 73 74 20 36 2e 24 74 6e 2e 31 20 7b  o_test 6.$tn.1 {
1970: 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20  .    sql1 {.    
1980: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
1990: 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20  _mode = wal;.   
19a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
19b0: 74 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53  t1(x);.      INS
19c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
19d0: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35  ES(randomblob(15
19e0: 30 30 29 29 3b 0a 20 20 20 20 20 20 50 52 41 47  00));.      PRAG
19f0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
1a00: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  t;.    }.  } {wa
1a10: 6c 20 30 20 35 20 35 7d 0a 0a 20 20 64 6f 5f 74  l 0 5 5}..  do_t
1a20: 65 73 74 20 36 2e 24 74 6e 2e 32 20 7b 0a 20 20  est 6.$tn.2 {.  
1a30: 20 20 73 71 6c 31 20 7b 20 0a 20 20 20 20 20 20    sql1 { .      
1a40: 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54  BEGIN CONCURRENT
1a50: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
1a60: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1a70: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29  randomblob(1500)
1a80: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
1a90: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1aa0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 35 30 30  (randomblob(1500
1ab0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  ));.    }.  } {}
1ac0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 36 2e 24 74  ..  do_test 6.$t
1ad0: 6e 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  n.3 {.    sql2 {
1ae0: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
1af0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1b00: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
1b10: 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a 20  omblob(1500));. 
1b20: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
1b30: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
1b40: 64 6f 6d 62 6c 6f 62 28 31 35 30 30 29 29 3b 0a  domblob(1500));.
1b50: 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20        COMMIT;.  
1b60: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f    }.  } {}..  do
1b70: 5f 74 65 73 74 20 36 2e 24 74 6e 2e 34 20 7b 20  _test 6.$tn.4 { 
1b80: 0a 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68  .    list [catch
1b90: 20 7b 20 73 71 6c 31 20 43 4f 4d 4d 49 54 20 7d   { sql1 COMMIT }
1ba0: 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 7d 20 7b   msg] $msg.  } {
1bb0: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
1bc0: 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
1bd0: 74 20 36 2e 24 74 6e 2e 35 20 7b 20 73 71 6c 33  t 6.$tn.5 { sql3
1be0: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
1bf0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f  ity_check } } {o
1c00: 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 36 2e 24  k}.  do_test 6.$
1c10: 74 6e 2e 35 20 7b 20 73 71 6c 33 20 7b 20 53 45  tn.5 { sql3 { SE
1c20: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 66 72  LECT count(*) fr
1c30: 6f 6d 20 74 31 20 7d 20 7d 20 7b 33 7d 0a 7d 0a  om t1 } } {3}.}.
1c40: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1c90: 73 74 20 74 68 61 74 20 69 66 20 61 20 63 6f 72  st that if a cor
1ca0: 72 75 70 74 20 77 61 6c 2d 69 6e 64 65 78 2d 68  rupt wal-index-h
1cb0: 65 61 64 65 72 20 69 73 20 65 6e 63 6f 75 6e 74  eader is encount
1cc0: 65 72 65 64 20 77 68 65 6e 20 61 74 74 65 6d 70  ered when attemp
1cd0: 74 69 6e 67 0a 23 20 74 6f 20 63 6f 6d 6d 69 74  ting.# to commit
1ce0: 20 61 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72   a CONCURRENT tr
1cf0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 74  ansaction, the t
1d00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
1d10: 74 20 63 6f 6d 6d 69 74 74 65 64 0a 23 20 28 6f  t committed.# (o
1d20: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 20 61  r rolled back) a
1d30: 6e 64 20 74 68 61 74 20 53 51 4c 49 54 45 5f 42  nd that SQLITE_B
1d40: 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 69 73 20  USY_SNAPSHOT is 
1d50: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d60: 75 73 65 72 2e 0a 23 0a 63 61 74 63 68 20 7b 20  user..#.catch { 
1d70: 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65  db close }.force
1d80: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 74  delete test.db.t
1d90: 65 73 74 76 66 73 20 74 76 66 73 0a 73 71 6c 69  estvfs tvfs.sqli
1da0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
1db0: 76 66 73 20 74 76 66 73 0a 64 6f 5f 65 78 65 63  vfs tvfs.do_exec
1dc0: 73 71 6c 5f 74 65 73 74 20 37 2e 31 20 7b 0a 20  sql_test 7.1 {. 
1dd0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
1de0: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 42 45  mode = wal;.  BE
1df0: 47 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20  GIN;.    CREATE 
1e00: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 50  TABLE t1(a, b, P
1e10: 52 49 4d 41 52 59 20 4b 45 59 28 61 29 29 3b 0a  RIMARY KEY(a));.
1e20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1e30: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
1e40: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1e50: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
1e60: 3b 0a 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 42 45  ;.  COMMIT;.  BE
1e70: 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 3b 0a  GIN CONCURRENT;.
1e80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1e90: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
1ea0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1eb0: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29   t1 VALUES(7, 8)
1ec0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1ed0: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 77 61 6c 20 31  ROM t1;.} {wal 1
1ee0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 7d 0a   2 3 4 5 6 7 8}.
1ef0: 0a 23 20 43 6f 72 72 75 70 74 20 74 68 65 20 77  .# Corrupt the w
1f00: 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 0a  al-index header.
1f10: 69 6e 63 72 5f 74 76 66 73 5f 68 64 72 20 74 65  incr_tvfs_hdr te
1f20: 73 74 2e 64 62 20 31 31 20 31 0a 0a 64 6f 5f 63  st.db 11 1..do_c
1f30: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 37 2e 32  atchsql_test 7.2
1f40: 2e 31 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 7b 31  .1 { COMMIT } {1
1f50: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
1f60: 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 37  cked}}.do_test 7
1f70: 2e 32 2e 32 20 7b 20 73 71 6c 69 74 65 33 5f 65  .2.2 { sqlite3_e
1f80: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20  xtended_errcode 
1f90: 64 62 20 7d 20 53 51 4c 49 54 45 5f 42 55 53 59  db } SQLITE_BUSY
1fa0: 5f 53 4e 41 50 53 48 4f 54 0a 0a 64 6f 5f 65 78  _SNAPSHOT..do_ex
1fb0: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 33 2e 31  ecsql_test 7.3.1
1fc0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
1fd0: 4f 4d 20 74 31 3b 0a 20 20 52 4f 4c 4c 42 41 43  OM t1;.  ROLLBAC
1fe0: 4b 3b 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  K;.} {1 2 3 4 5 
1ff0: 36 20 37 20 38 7d 0a 64 6f 5f 65 78 65 63 73 71  6 7 8}.do_execsq
2000: 6c 5f 74 65 73 74 20 37 2e 33 2e 32 20 7b 0a 20  l_test 7.3.2 {. 
2010: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2020: 31 3b 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a  1;.} {1 2 3 4}..
2030: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 65 73  ----------.# Tes
2080: 74 20 74 68 61 74 20 22 50 52 41 47 4d 41 20 69  t that "PRAGMA i
2090: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 20  ntegrity_check" 
20a0: 77 6f 72 6b 73 20 77 69 74 68 69 6e 20 61 20 63  works within a c
20b0: 6f 6e 63 75 72 72 65 6e 74 20 0a 23 20 74 72 61  oncurrent .# tra
20c0: 6e 73 61 63 74 69 6f 6e 2e 20 57 69 74 68 69 6e  nsaction. Within
20d0: 20 61 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72   a concurrent tr
20e0: 61 6e 73 61 63 74 69 6f 6e 2c 20 22 50 52 41 47  ansaction, "PRAG
20f0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2100: 63 6b 22 0a 23 20 69 73 20 75 6e 61 62 6c 65 20  ck".# is unable 
2110: 74 6f 20 64 65 74 65 63 74 20 75 6e 75 73 65 64  to detect unused
2120: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 2c   database pages,
2130: 20 62 75 74 20 63 61 6e 20 64 65 74 65 63 74 20   but can detect 
2140: 6f 74 68 65 72 20 74 79 70 65 73 0a 23 20 6f 66  other types.# of
2150: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23 0a 72   corruption..#.r
2160: 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73  eset_db.do_execs
2170: 71 6c 5f 74 65 73 74 20 38 2e 31 20 7b 0a 20 20  ql_test 8.1 {.  
2180: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2190: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 43 52 45  ode = wal;.  CRE
21a0: 41 54 45 20 54 41 42 4c 45 20 6b 76 28 6b 20 49  ATE TABLE kv(k I
21b0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
21c0: 45 59 2c 20 76 20 55 4e 49 51 55 45 29 3b 0a 20  EY, v UNIQUE);. 
21d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 76 20   INSERT INTO kv 
21e0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 72 61 6e  VALUES(NULL, ran
21f0: 64 6f 6d 62 6c 6f 62 28 37 35 30 29 29 3b 0a 20  domblob(750));. 
2200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 76 20   INSERT INTO kv 
2210: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e  SELECT NULL, ran
2220: 64 6f 6d 62 6c 6f 62 28 37 35 30 29 20 46 52 4f  domblob(750) FRO
2230: 4d 20 6b 76 3b 0a 20 20 49 4e 53 45 52 54 20 49  M kv;.  INSERT I
2240: 4e 54 4f 20 6b 76 20 53 45 4c 45 43 54 20 4e 55  NTO kv SELECT NU
2250: 4c 4c 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 37  LL, randomblob(7
2260: 35 30 29 20 46 52 4f 4d 20 6b 76 3b 0a 20 20 49  50) FROM kv;.  I
2270: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 76 20 53 45  NSERT INTO kv SE
2280: 4c 45 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f  LECT NULL, rando
2290: 6d 62 6c 6f 62 28 37 35 30 29 20 46 52 4f 4d 20  mblob(750) FROM 
22a0: 6b 76 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  kv;.  INSERT INT
22b0: 4f 20 6b 76 20 53 45 4c 45 43 54 20 4e 55 4c 4c  O kv SELECT NULL
22c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 37 35 30  , randomblob(750
22d0: 29 20 46 52 4f 4d 20 6b 76 3b 0a 20 20 49 4e 53  ) FROM kv;.  INS
22e0: 45 52 54 20 49 4e 54 4f 20 6b 76 20 53 45 4c 45  ERT INTO kv SELE
22f0: 43 54 20 4e 55 4c 4c 2c 20 72 61 6e 64 6f 6d 62  CT NULL, randomb
2300: 6c 6f 62 28 37 35 30 29 20 46 52 4f 4d 20 6b 76  lob(750) FROM kv
2310: 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  ;.  DELETE FROM 
2320: 6b 76 20 57 48 45 52 45 20 72 6f 77 69 64 25 32  kv WHERE rowid%2
2330: 3b 0a 20 20 50 52 41 47 4d 41 20 66 72 65 65 6c  ;.  PRAGMA freel
2340: 69 73 74 5f 63 6f 75 6e 74 3b 0a 7d 20 7b 77 61  ist_count;.} {wa
2350: 6c 20 33 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  l 34}.do_execsql
2360: 5f 74 65 73 74 20 38 2e 32 20 7b 20 50 52 41 47  _test 8.2 { PRAG
2370: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2380: 63 6b 20 7d 20 6f 6b 0a 64 6f 5f 65 78 65 63 73  ck } ok.do_execs
2390: 71 6c 5f 74 65 73 74 20 38 2e 33 20 7b 20 0a 20  ql_test 8.3 { . 
23a0: 20 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e   BEGIN CONCURREN
23b0: 54 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  T;.    PRAGMA in
23c0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 7d  tegrity_check;.}
23d0: 20 7b 6f 6b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {ok}.do_execsql
23e0: 5f 74 65 73 74 20 38 2e 34 20 7b 20 0a 20 20 20  _test 8.4 { .   
23f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 76 20   INSERT INTO kv 
2400: 56 41 4c 55 45 53 28 31 31 30 30 2c 20 31 31 30  VALUES(1100, 110
2410: 30 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  0);.    PRAGMA i
2420: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
2430: 7d 20 7b 6f 6b 7d 0a 64 6f 5f 65 78 65 63 73 71  } {ok}.do_execsq
2440: 6c 5f 74 65 73 74 20 38 2e 35 20 7b 20 0a 20 20  l_test 8.5 { .  
2450: 43 4f 4d 4d 49 54 3b 0a 20 20 50 52 41 47 4d 41  COMMIT;.  PRAGMA
2460: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2470: 3b 0a 7d 20 7b 6f 6b 7d 0a 0a 23 2d 2d 2d 2d 2d  ;.} {ok}..#-----
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
24d0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
24e0: 73 61 63 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  sactions do not 
24f0: 61 6c 6c 6f 77 20 66 6f 72 65 69 67 6e 2d 6b 65  allow foreign-ke
2500: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 23 20  y constraints.# 
2510: 74 6f 20 62 65 20 62 79 70 61 73 73 65 64 2e 0a  to be bypassed..
2520: 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74  #.do_multiclient
2530: 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f  _test tn {.  do_
2540: 74 65 73 74 20 39 2e 24 74 6e 2e 31 20 7b 0a 20  test 9.$tn.1 {. 
2550: 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20     sql1 {.      
2560: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2570: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20  ode = wal;.     
2580: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 70 70   CREATE TABLE pp
2590: 28 69 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (i INTEGER PRIMA
25a0: 52 59 20 4b 45 59 2c 20 6a 29 3b 0a 20 20 20 20  RY KEY, j);.    
25b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
25c0: 63 28 61 2c 20 62 20 52 45 46 45 52 45 4e 43 45  c(a, b REFERENCE
25d0: 53 20 70 70 29 3b 0a 0a 20 20 20 20 20 20 57 49  S pp);..      WI
25e0: 54 48 20 73 65 71 28 69 29 20 41 53 20 28 53 45  TH seq(i) AS (SE
25f0: 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c  LECT 1 UNION ALL
2600: 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d   SELECT i+1 FROM
2610: 20 73 65 71 20 57 48 45 52 45 20 69 3c 31 30 30   seq WHERE i<100
2620: 29 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ).      INSERT I
2630: 4e 54 4f 20 70 70 20 53 45 4c 45 43 54 20 69 2c  NTO pp SELECT i,
2640: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
2650: 29 20 46 52 4f 4d 20 73 65 71 3b 0a 0a 20 20 20  ) FROM seq;..   
2660: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
2670: 6e 5f 6b 65 79 73 20 3d 20 31 3b 0a 20 20 20 20  n_keys = 1;.    
2680: 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 0a 0a 20 20  }.  } {wal}...  
2690: 64 6f 5f 74 65 73 74 20 39 2e 24 74 6e 2e 32 2e  do_test 9.$tn.2.
26a0: 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  1 {.    sql1 {. 
26b0: 20 20 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55       BEGIN CONCU
26c0: 52 52 45 4e 54 3b 0a 20 20 20 20 20 20 20 20 49  RRENT;.        I
26d0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41  NSERT INTO cc VA
26e0: 4c 55 45 53 28 34 32 2c 20 34 32 29 3b 0a 20 20  LUES(42, 42);.  
26f0: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
2700: 74 65 73 74 20 39 2e 24 74 6e 2e 32 2e 32 20 7b  test 9.$tn.2.2 {
2710: 0a 20 20 20 20 73 71 6c 32 20 7b 20 44 45 4c 45  .    sql2 { DELE
2720: 54 45 20 46 52 4f 4d 20 70 70 20 57 48 45 52 45  TE FROM pp WHERE
2730: 20 69 3d 34 32 20 7d 0a 20 20 20 20 6c 69 73 74   i=42 }.    list
2740: 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 31 20 43   [catch { sql1 C
2750: 4f 4d 4d 49 54 20 7d 20 6d 73 67 5d 20 24 6d 73  OMMIT } msg] $ms
2760: 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  g.  } {1 {databa
2770: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
2780: 20 64 6f 5f 74 65 73 74 20 39 2e 24 74 6e 2e 32   do_test 9.$tn.2
2790: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 31 20 52 4f  .3 {.    sql1 RO
27a0: 4c 4c 42 41 43 4b 0a 20 20 7d 20 7b 7d 0a 0a 20  LLBACK.  } {}.. 
27b0: 20 64 6f 5f 74 65 73 74 20 39 2e 24 74 6e 2e 33   do_test 9.$tn.3
27c0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a  .1 {.    sql1 {.
27d0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72        PRAGMA for
27e0: 65 69 67 6e 5f 6b 65 79 73 20 3d 20 30 3b 0a 20  eign_keys = 0;. 
27f0: 20 20 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55       BEGIN CONCU
2800: 52 52 45 4e 54 3b 0a 20 20 20 20 20 20 20 20 49  RRENT;.        I
2810: 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41  NSERT INTO cc VA
2820: 4c 55 45 53 28 34 33 2c 20 34 33 29 3b 0a 20 20  LUES(43, 43);.  
2830: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
2840: 74 65 73 74 20 39 2e 24 74 6e 2e 33 2e 32 20 7b  test 9.$tn.3.2 {
2850: 0a 20 20 20 20 73 71 6c 32 20 7b 20 44 45 4c 45  .    sql2 { DELE
2860: 54 45 20 46 52 4f 4d 20 70 70 20 57 48 45 52 45  TE FROM pp WHERE
2870: 20 69 3d 34 33 20 7d 0a 20 20 20 20 6c 69 73 74   i=43 }.    list
2880: 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 31 20 43   [catch { sql1 C
2890: 4f 4d 4d 49 54 20 7d 20 6d 73 67 5d 20 24 6d 73  OMMIT } msg] $ms
28a0: 67 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20  g.  } {0 {}}..  
28b0: 64 6f 5f 74 65 73 74 20 39 2e 24 74 6e 2e 34 2e  do_test 9.$tn.4.
28c0: 31 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  1 {.    sql1 {. 
28d0: 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65       PRAGMA fore
28e0: 69 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20  ign_keys = on;. 
28f0: 20 20 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55       BEGIN CONCU
2900: 52 52 45 4e 54 3b 0a 20 20 20 20 20 20 20 20 49  RRENT;.        I
2910: 4e 53 45 52 54 20 49 4e 54 4f 20 63 63 20 56 41  NSERT INTO cc VA
2920: 4c 55 45 53 28 34 34 2c 20 34 34 29 3b 0a 20 20  LUES(44, 44);.  
2930: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
2940: 74 65 73 74 20 39 2e 24 74 6e 2e 34 2e 32 20 7b  test 9.$tn.4.2 {
2950: 0a 20 20 20 20 73 71 6c 32 20 7b 20 44 45 4c 45  .    sql2 { DELE
2960: 54 45 20 46 52 4f 4d 20 70 70 20 57 48 45 52 45  TE FROM pp WHERE
2970: 20 69 3d 31 20 7d 0a 20 20 20 20 6c 69 73 74 20   i=1 }.    list 
2980: 5b 63 61 74 63 68 20 7b 20 73 71 6c 31 20 43 4f  [catch { sql1 CO
2990: 4d 4d 49 54 20 7d 20 6d 73 67 5d 20 24 6d 73 67  MMIT } msg] $msg
29a0: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 7d 0a 0a 23  .  } {0 {}}.}..#
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
2a00: 20 74 68 61 74 20 65 76 65 6e 20 69 66 20 61 20   that even if a 
2a10: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a20: 20 61 70 70 65 61 72 73 20 62 65 66 6f 72 65 20   appears before 
2a30: 61 6c 6c 20 77 72 69 74 65 73 20 77 69 74 68 69  all writes withi
2a40: 6e 0a 23 20 61 20 43 4f 4e 43 55 52 52 45 4e 54  n.# a CONCURRENT
2a50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2a60: 65 20 70 61 67 65 73 20 69 74 20 72 65 61 64 73  e pages it reads
2a70: 20 61 72 65 20 73 74 69 6c 6c 20 63 6f 6e 73 69   are still consi
2a80: 64 65 72 65 64 20 77 68 65 6e 0a 23 20 63 6f 6e  dered when.# con
2a90: 73 69 64 65 72 69 6e 67 20 77 68 65 74 68 65 72  sidering whether
2aa0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 74 72 61 6e   or not the tran
2ab0: 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  saction may be c
2ac0: 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a 64 6f 5f 6d  ommitted..#.do_m
2ad0: 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
2ae0: 74 6e 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 31  tn {.  do_test 1
2af0: 30 2e 24 74 6e 2e 31 2e 31 20 7b 0a 20 20 20 20  0.$tn.1.1 {.    
2b00: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 50 52 41  sql1 {.      PRA
2b10: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
2b20: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 43 52   = wal;.      CR
2b30: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29  EATE TABLE t1(a)
2b40: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
2b50: 41 42 4c 45 20 74 32 28 62 29 3b 0a 20 20 20 20  ABLE t2(b);.    
2b60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2b70: 33 28 63 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  3(c);.      INSE
2b80: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2b90: 53 28 31 29 2c 20 28 32 29 2c 20 28 33 29 3b 0a  S(1), (2), (3);.
2ba0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2bb0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 29 2c 20  O t2 VALUES(1), 
2bc0: 28 32 29 2c 20 28 33 29 3b 0a 20 20 20 20 20 20  (2), (3);.      
2bd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2be0: 41 4c 55 45 53 28 31 29 2c 20 28 32 29 2c 20 28  ALUES(1), (2), (
2bf0: 33 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77  3);.    }.  } {w
2c00: 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31  al}..  do_test 1
2c10: 30 2e 24 74 6e 2e 31 2e 32 20 7b 0a 20 20 20 20  0.$tn.1.2 {.    
2c20: 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 42 45 47  sql1 {.      BEG
2c30: 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20  IN CONCURRENT;. 
2c40: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
2c50: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
2c60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2c70: 56 41 4c 55 45 53 28 34 29 3b 0a 20 20 20 20 7d  VALUES(4);.    }
2c80: 0a 20 20 7d 20 7b 31 20 32 20 33 7d 0a 0a 20 20  .  } {1 2 3}..  
2c90: 64 6f 5f 74 65 73 74 20 31 30 2e 24 74 6e 2e 31  do_test 10.$tn.1
2ca0: 2e 33 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .3 {.    sql2 { 
2cb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2cc0: 41 4c 55 45 53 28 34 29 20 7d 0a 20 20 20 20 6c  ALUES(4) }.    l
2cd0: 69 73 74 20 5b 63 61 74 63 68 20 7b 73 71 6c 31  ist [catch {sql1
2ce0: 20 43 4f 4d 4d 49 54 7d 20 6d 73 67 5d 20 24 6d   COMMIT} msg] $m
2cf0: 73 67 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  sg.  } {1 {datab
2d00: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
2d10: 20 20 73 71 6c 31 20 52 4f 4c 4c 42 41 43 4b 0a    sql1 ROLLBACK.
2d20: 0a 20 20 23 20 49 6e 20 74 68 69 73 20 63 61 73  .  # In this cas
2d30: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 22  e, because the "
2d40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2d50: 22 20 69 73 20 66 69 72 73 74 20 73 74 65 70 70  " is first stepp
2d60: 65 64 20 62 65 66 6f 72 65 0a 20 20 23 20 74 68  ed before.  # th
2d70: 65 20 22 42 45 47 49 4e 20 43 4f 4e 43 55 52 52  e "BEGIN CONCURR
2d80: 45 4e 54 22 2c 20 74 68 65 20 70 61 67 65 73 20  ENT", the pages 
2d90: 69 74 20 72 65 61 64 73 20 61 72 65 20 6e 6f 74  it reads are not
2da0: 20 72 65 63 6f 72 64 65 64 20 62 79 20 74 68 65   recorded by the
2db0: 0a 20 20 23 20 70 61 67 65 72 20 6f 62 6a 65 63  .  # pager objec
2dc0: 74 2e 20 41 6e 64 20 73 6f 20 74 68 65 20 74 72  t. And so the tr
2dd0: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
2de0: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 54 65 63 68   committed. Tech
2df0: 6e 69 63 61 6c 6c 79 0a 20 20 23 20 74 68 69 73  nically.  # this
2e00: 20 62 65 68 61 76 69 6f 75 72 20 28 74 68 65 20   behaviour (the 
2e10: 65 66 66 65 63 74 20 6f 66 20 61 6e 20 6f 6e 67  effect of an ong
2e20: 6f 69 6e 67 20 53 45 4c 45 43 54 20 6f 6e 20 61  oing SELECT on a
2e30: 20 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e   BEGIN CONCURREN
2e40: 54 0a 20 20 23 20 74 72 61 6e 73 61 63 61 74 69  T.  # transacati
2e50: 6f 6e 29 20 69 73 20 75 6e 64 65 66 69 6e 65 64  on) is undefined
2e60: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
2e70: 31 30 2e 24 74 6e 2e 32 2e 31 20 7b 0a 20 20 20  10.$tn.2.1 {.   
2e80: 20 63 6f 64 65 31 20 7b 0a 20 20 20 20 20 20 73   code1 {.      s
2e90: 65 74 20 3a 3a 73 74 6d 74 20 5b 73 71 6c 69 74  et ::stmt [sqlit
2ea0: 65 33 5f 70 72 65 70 61 72 65 20 64 62 20 22 53  e3_prepare db "S
2eb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
2ec0: 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 20 20 20   -1 dummy].     
2ed0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a   sqlite3_step $:
2ee0: 3a 73 74 6d 74 0a 20 20 20 20 7d 0a 20 20 7d 20  :stmt.    }.  } 
2ef0: 7b 53 51 4c 49 54 45 5f 52 4f 57 7d 0a 20 20 64  {SQLITE_ROW}.  d
2f00: 6f 5f 74 65 73 74 20 31 30 2e 24 74 6e 2e 32 2e  o_test 10.$tn.2.
2f10: 32 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20  2 {.    sql1 {. 
2f20: 20 20 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55       BEGIN CONCU
2f30: 52 52 45 4e 54 3b 20 0a 20 20 20 20 20 20 20 20  RRENT; .        
2f40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
2f50: 41 4c 55 45 53 28 34 29 3b 0a 20 20 20 20 7d 0a  ALUES(4);.    }.
2f60: 20 20 20 20 63 6f 64 65 31 20 7b 0a 20 20 20 20      code1 {.    
2f70: 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d    set res [list]
2f80: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72  .      lappend r
2f90: 65 73 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75  es [sqlite3_colu
2fa0: 6d 6e 5f 69 6e 74 20 24 3a 3a 73 74 6d 74 20 30  mn_int $::stmt 0
2fb0: 5d 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b 5b  ].      while {[
2fc0: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a  sqlite3_step $::
2fd0: 73 74 6d 74 5d 3d 3d 22 53 51 4c 49 54 45 5f 52  stmt]=="SQLITE_R
2fe0: 4f 57 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c  OW"} {.        l
2ff0: 61 70 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69  append res [sqli
3000: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 24  te3_column_int $
3010: 3a 3a 73 74 6d 74 20 30 5d 0a 20 20 20 20 20 20  ::stmt 0].      
3020: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
3030: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 73 74 6d 74  finalize $::stmt
3040: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 0a 20  .      set res. 
3050: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20     }.  } {1 2 3 
3060: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 30 2e  4}.  do_test 10.
3070: 24 74 6e 2e 32 2e 33 20 7b 0a 20 20 20 20 73 71  $tn.2.3 {.    sq
3080: 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l2 { INSERT INTO
3090: 20 74 31 20 56 41 4c 55 45 53 28 35 29 20 7d 0a   t1 VALUES(5) }.
30a0: 20 20 20 20 73 71 6c 31 20 43 4f 4d 4d 49 54 0a      sql1 COMMIT.
30b0: 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 4d 6f 72 65    } {}..  # More
30c0: 20 74 65 73 74 73 20 73 75 72 72 6f 75 6e 64 69   tests surroundi
30d0: 6e 67 20 6c 6f 6e 67 2d 6c 69 76 65 64 20 70 72  ng long-lived pr
30e0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
30f0: 73 20 61 6e 64 20 63 6f 6e 63 75 72 72 65 6e 74  s and concurrent
3100: 0a 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  # transaction
3110: 73 2e 0a 20 20 64 6f 5f 74 65 73 74 20 31 30 2e  s..  do_test 10.
3120: 24 74 6e 2e 33 2e 31 20 7b 0a 20 20 20 20 73 71  $tn.3.1 {.    sq
3130: 6c 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  l1 {.      BEGIN
3140: 20 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20   CONCURRENT;.   
3150: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
3160: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 43 4f 4d  OM t1;.      COM
3170: 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  MIT;.    }.    s
3180: 71 6c 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49  ql1 {.      BEGI
3190: 4e 20 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20  N CONCURRENT;.  
31a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
31b0: 4f 20 74 32 20 56 41 4c 55 45 53 28 35 29 3b 0a  O t2 VALUES(5);.
31c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b      }.    sql2 {
31d0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
31e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 29 3b  TO t1 VALUES(5);
31f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 31 20  .    }.    sql1 
3200: 43 4f 4d 4d 49 54 0a 20 20 20 20 73 71 6c 33 20  COMMIT.    sql3 
3210: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
3220: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
3230: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 7d 0a    } {1 2 3 4 5}.
3240: 20 20 64 6f 5f 74 65 73 74 20 31 30 2e 24 74 6e    do_test 10.$tn
3250: 2e 33 2e 32 20 7b 0a 20 20 20 20 73 71 6c 31 20  .3.2 {.    sql1 
3260: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 20 43 4f  {.      BEGIN CO
3270: 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 20 20  NCURRENT;.      
3280: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3290: 74 31 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  t1;.      ROLLBA
32a0: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  CK;.    }.    sq
32b0: 6c 31 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  l1 {.      BEGIN
32c0: 20 43 4f 4e 43 55 52 52 45 4e 54 3b 0a 20 20 20   CONCURRENT;.   
32d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
32e0: 20 74 32 20 56 41 4c 55 45 53 28 36 29 3b 0a 20   t2 VALUES(6);. 
32f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a     }.    sql2 {.
3300: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3310: 4f 20 74 31 20 56 41 4c 55 45 53 28 36 29 3b 0a  O t1 VALUES(6);.
3320: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 31 20 43      }.    sql1 C
3330: 4f 4d 4d 49 54 0a 20 20 20 20 73 71 6c 33 20 7b  OMMIT.    sql3 {
3340: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3350: 32 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  2 }.  } {1 2 3 4
3360: 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20   5 6}.  do_test 
3370: 31 30 2e 24 74 6e 2e 33 2e 33 20 7b 0a 20 20 20  10.$tn.3.3 {.   
3380: 20 73 71 6c 31 20 7b 20 42 45 47 49 4e 20 43 4f   sql1 { BEGIN CO
3390: 4e 43 55 52 52 45 4e 54 20 7d 0a 20 20 20 20 63  NCURRENT }.    c
33a0: 6f 64 65 31 20 7b 0a 20 20 20 20 20 20 73 65 74  ode1 {.      set
33b0: 20 3a 3a 73 74 6d 74 20 5b 73 71 6c 69 74 65 33   ::stmt [sqlite3
33c0: 5f 70 72 65 70 61 72 65 20 64 62 20 22 53 45 4c  _prepare db "SEL
33d0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 2d  ECT * FROM t1" -
33e0: 31 20 64 75 6d 6d 79 5d 0a 20 20 20 20 20 20 73  1 dummy].      s
33f0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 73  qlite3_step $::s
3400: 74 6d 74 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  tmt.    }.    sq
3410: 6c 31 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  l1 {.      INSER
3420: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
3430: 28 37 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  (7);.      SELEC
3440: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20  T * FROM t3;.   
3450: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
3460: 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55 52 52     BEGIN CONCURR
3470: 45 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ENT;.    }.    s
3480: 71 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  ql2 { INSERT INT
3490: 4f 20 74 33 20 56 41 4c 55 45 53 28 35 29 20 7d  O t3 VALUES(5) }
34a0: 0a 20 20 20 20 63 6f 64 65 31 20 7b 20 73 71 6c  .    code1 { sql
34b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a  ite3_finalize $:
34c0: 3a 73 74 6d 74 20 7d 0a 20 20 20 20 73 71 6c 31  :stmt }.    sql1
34d0: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
34e0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 38  INTO t2 VALUES(8
34f0: 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b  );.      COMMIT;
3500: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a  .    }.  } {}.}.
3510: 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f  .do_multiclient_
3520: 74 65 73 74 20 74 6e 20 7b 0a 20 20 64 6f 5f 74  test tn {.  do_t
3530: 65 73 74 20 31 31 2e 24 74 6e 2e 31 20 7b 0a 20  est 11.$tn.1 {. 
3540: 20 20 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20     sql1 {.      
3550: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
3560: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20  ode = wal;.     
3570: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3580: 28 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  (a);.    }.  } {
3590: 77 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  wal}..  do_test 
35a0: 31 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 63  11.$tn.2 {.    c
35b0: 6f 64 65 31 20 7b 20 73 71 6c 69 74 65 33 5f 77  ode1 { sqlite3_w
35c0: 61 6c 5f 69 6e 66 6f 20 64 62 20 6d 61 69 6e 20  al_info db main 
35d0: 7d 0a 20 20 7d 20 7b 30 20 32 7d 0a 0a 20 20 64  }.  } {0 2}..  d
35e0: 6f 5f 74 65 73 74 20 31 31 2e 24 74 6e 2e 33 20  o_test 11.$tn.3 
35f0: 7b 0a 20 20 20 20 73 71 6c 31 20 7b 20 49 4e 53  {.    sql1 { INS
3600: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3610: 45 53 28 31 29 20 7d 0a 20 20 20 20 63 6f 64 65  ES(1) }.    code
3620: 31 20 7b 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  1 { sqlite3_wal_
3630: 69 6e 66 6f 20 64 62 20 6d 61 69 6e 20 7d 0a 20  info db main }. 
3640: 20 7d 20 7b 32 20 33 7d 0a 0a 20 20 64 6f 5f 74   } {2 3}..  do_t
3650: 65 73 74 20 31 31 2e 24 74 6e 2e 34 20 7b 0a 20  est 11.$tn.4 {. 
3660: 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54     sql2 { INSERT
3670: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3680: 32 29 20 7d 0a 20 20 20 20 63 6f 64 65 32 20 7b  2) }.    code2 {
3690: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 69 6e 66   sqlite3_wal_inf
36a0: 6f 20 64 62 32 20 6d 61 69 6e 20 7d 0a 20 20 7d  o db2 main }.  }
36b0: 20 7b 33 20 34 7d 0a 0a 20 20 64 6f 5f 74 65 73   {3 4}..  do_tes
36c0: 74 20 31 31 2e 24 74 6e 2e 35 20 7b 0a 20 20 20  t 11.$tn.5 {.   
36d0: 20 73 71 6c 31 20 7b 20 50 52 41 47 4d 41 20 77   sql1 { PRAGMA w
36e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
36f0: 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52      sql2 { INSER
3700: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3710: 28 33 29 20 7d 0a 20 20 20 20 63 6f 64 65 32 20  (3) }.    code2 
3720: 7b 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 69 6e  { sqlite3_wal_in
3730: 66 6f 20 64 62 32 20 6d 61 69 6e 20 7d 0a 20 20  fo db2 main }.  
3740: 7d 20 7b 30 20 31 7d 0a 7d 0a 0a 72 65 73 65 74  } {0 1}.}..reset
3750: 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  _db.do_execsql_t
3760: 65 73 74 20 31 32 2e 30 20 7b 0a 20 20 50 52 41  est 12.0 {.  PRA
3770: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
3780: 20 3d 20 77 61 6c 3b 0a 20 20 43 52 45 41 54 45   = wal;.  CREATE
3790: 20 54 41 42 4c 45 20 74 78 28 61 20 49 4e 54 45   TABLE tx(a INTE
37a0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
37b0: 20 62 29 3b 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f   b);.} {wal}.do_
37c0: 74 65 73 74 20 31 32 2e 31 20 7b 0a 20 20 66 6f  test 12.1 {.  fo
37d0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20  r {set i 0} {$i 
37e0: 3c 20 35 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  < 50} {incr i} {
37f0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3800: 20 20 20 20 20 42 45 47 49 4e 20 43 4f 4e 43 55       BEGIN CONCU
3810: 52 52 45 4e 54 3b 0a 20 20 20 20 20 20 49 4e 53  RRENT;.      INS
3820: 45 52 54 20 49 4e 54 4f 20 74 78 28 62 29 20 56  ERT INTO tx(b) V
3830: 41 4c 55 45 53 28 20 72 61 6e 64 6f 6d 62 6c 6f  ALUES( randomblo
3840: 62 28 20 31 32 30 30 20 29 20 29 3b 0a 20 20 20  b( 1200 ) );.   
3850: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d     COMMIT;.    }
3860: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
3870: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
3880: 65 20 7d 0a 7d 20 7b 31 30 32 34 7d 0a 64 6f 5f  e }.} {1024}.do_
3890: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 32 2e  execsql_test 12.
38a0: 32 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  2 {.  DELETE FRO
38b0: 4d 20 74 78 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20  M tx;.}.do_test 
38c0: 31 32 2e 33 20 7b 0a 20 20 66 6f 72 20 7b 73 65  12.3 {.  for {se
38d0: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 35 30 7d  t i 0} {$i < 50}
38e0: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
38f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3900: 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54  BEGIN CONCURRENT
3910: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3920: 4e 54 4f 20 74 78 28 62 29 20 56 41 4c 55 45 53  NTO tx(b) VALUES
3930: 28 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 20 31 32  ( randomblob( 12
3940: 30 30 20 29 20 29 3b 0a 20 20 20 20 20 20 43 4f  00 ) );.      CO
3950: 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MMIT;.    }.  }.
3960: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
3970: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 7d 0a 7d  MA page_size }.}
3980: 20 7b 31 30 32 34 7d 0a 64 6f 5f 65 78 65 63 73   {1024}.do_execs
3990: 71 6c 5f 74 65 73 74 20 31 32 2e 34 20 7b 0a 20  ql_test 12.4 {. 
39a0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 78 3b   DELETE FROM tx;
39b0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 31 32 2e 35 20  .}.do_test 12.5 
39c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45  {.  execsql { BE
39d0: 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 20 7d  GIN CONCURRENT }
39e0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
39f0: 20 7b 24 69 20 3c 20 35 30 30 30 7d 20 7b 69 6e   {$i < 5000} {in
3a00: 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63  cr i} {.    exec
3a10: 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  sql {.      INSE
3a20: 52 54 20 49 4e 54 4f 20 74 78 28 62 29 20 56 41  RT INTO tx(b) VA
3a30: 4c 55 45 53 28 20 72 61 6e 64 6f 6d 62 6c 6f 62  LUES( randomblob
3a40: 28 20 31 32 30 30 20 29 20 29 3b 0a 20 20 20 20  ( 1200 ) );.    
3a50: 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  }.  }.  execsql 
3a60: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 65 78 65  { COMMIT }.  exe
3a70: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 70 61  csql { PRAGMA pa
3a80: 67 65 5f 73 69 7a 65 20 7d 0a 7d 20 7b 31 30 32  ge_size }.} {102
3a90: 34 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  4}...finish_test
3aa0: 0a                                               .