/ Hex Artifact Content
Login

Artifact 530671ac706f6a1d0f4992dbdd33a86408330d03cd90fb9e82ecb1b27f5fd081:


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 54 65 73 74 73 20 66  ****.#.# Tests f
0170: 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  or transactions 
0180: 73 74 61 72 74 65 64 20 77 69 74 68 20 42 45 47  started with BEG
0190: 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 2e 20 54  IN CONCURRENT. T
01a0: 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  he tests in this
01b0: 0a 23 20 66 69 6c 65 20 66 6f 63 75 73 20 6f 6e  .# file focus on
01c0: 20 74 65 73 74 69 6e 67 20 74 68 61 74 20 64 65   testing that de
01d0: 66 65 72 72 65 64 20 70 61 67 65 20 61 6c 6c 6f  ferred page allo
01e0: 63 61 74 69 6f 6e 20 77 6f 72 6b 73 20 70 72 6f  cation works pro
01f0: 70 65 72 6c 79 2e 0a 23 0a 0a 73 65 74 20 74 65  perly..#..set te
0200: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0210: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0230: 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74  er.tcl.source $t
0240: 65 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f 6d 6d  estdir/lock_comm
0250: 6f 6e 2e 74 63 6c 0a 73 65 74 20 3a 3a 74 65 73  on.tcl.set ::tes
0260: 74 70 72 65 66 69 78 20 63 6f 6e 63 75 72 72 65  tprefix concurre
0270: 6e 74 33 0a 0a 69 66 20 7b 24 41 55 54 4f 56 41  nt3..if {$AUTOVA
0280: 43 55 55 4d 7d 20 7b 20 66 69 6e 69 73 68 5f 74  CUUM} { finish_t
0290: 65 73 74 20 3b 20 72 65 74 75 72 6e 20 7d 0a 69  est ; return }.i
02a0: 66 63 61 70 61 62 6c 65 20 21 63 6f 6e 63 75 72  fcapable !concur
02b0: 72 65 6e 74 20 7b 0a 20 20 66 69 6e 69 73 68 5f  rent {.  finish_
02c0: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
02d0: 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65  .db close.sqlite
02e0: 33 5f 73 68 75 74 64 6f 77 6e 0a 74 65 73 74 5f  3_shutdown.test_
02f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 20 78 4c 6f 67  sqlite3_log xLog
0300: 0a 70 72 6f 63 20 78 4c 6f 67 20 7b 65 72 72 6f  .proc xLog {erro
0310: 72 5f 63 6f 64 65 20 6d 73 67 7d 20 7b 0a 20 20  r_code msg} {.  
0320: 23 20 70 75 74 73 20 22 24 65 72 72 6f 72 5f 63  # puts "$error_c
0330: 6f 64 65 3a 20 24 6d 73 67 22 0a 20 20 23 20 45  ode: $msg".  # E
0340: 6e 61 62 6c 65 20 74 68 65 20 70 72 65 76 69 6f  nable the previo
0350: 75 73 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  us for debugging
0360: 0a 7d 0a 72 65 73 65 74 5f 64 62 0a 0a 70 72 6f  .}.reset_db..pro
0370: 63 20 63 72 65 61 74 65 5f 73 63 68 65 6d 61 20  c create_schema 
0380: 7b 7d 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  {} {.  db eval {
0390: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
03a0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
03b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
03c0: 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20  E t1(x, y);.    
03d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
03e0: 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54  x, y);.    CREAT
03f0: 45 20 54 41 42 4c 45 20 74 33 28 78 2c 20 79 29  E TABLE t3(x, y)
0400: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
0410: 4c 45 20 74 34 28 78 2c 20 79 29 3b 0a 0a 20 20  LE t4(x, y);..  
0420: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
0430: 31 20 4f 4e 20 74 31 28 79 2c 20 78 29 3b 0a 20  1 ON t1(y, x);. 
0440: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
0450: 69 32 20 4f 4e 20 74 32 28 79 2c 20 78 29 3b 0a  i2 ON t2(y, x);.
0460: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
0470: 20 69 33 20 4f 4e 20 74 33 28 79 2c 20 78 29 3b   i3 ON t3(y, x);
0480: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
0490: 58 20 69 34 20 4f 4e 20 74 34 28 79 2c 20 78 29  X i4 ON t4(y, x)
04a0: 3b 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 64 6f  ;.  }.}..proc do
04b0: 5f 73 71 6c 5f 6f 70 20 7b 69 54 62 6c 20 69 4f  _sql_op {iTbl iO
04c0: 70 7d 20 7b 0a 20 20 73 65 74 20 64 62 20 22 64  p} {.  set db "d
04d0: 62 24 69 54 62 6c 22 0a 0a 20 20 73 77 69 74 63  b$iTbl"..  switc
04e0: 68 20 24 69 4f 70 20 7b 0a 20 20 20 20 22 69 22  h $iOp {.    "i"
04f0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c   {.      set sql
0500: 20 22 0a 20 20 20 20 20 20 20 20 57 49 54 48 20   ".        WITH 
0510: 63 6e 74 28 69 29 20 41 53 20 28 53 45 4c 45 43  cnt(i) AS (SELEC
0520: 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  T 1 UNION ALL SE
0530: 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d 20 63 6e  LECT i+1 FROM cn
0540: 74 20 57 48 45 52 45 20 69 3c 31 30 29 0a 20 20  t WHERE i<10).  
0550: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0560: 4f 20 74 24 69 54 62 6c 20 53 45 4c 45 43 54 20  O t$iTbl SELECT 
0570: 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 2c  randomblob(800),
0580: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29   randomblob(800)
0590: 20 46 52 4f 4d 20 63 6e 74 3b 0a 20 20 20 20 20   FROM cnt;.     
05a0: 20 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 22 64   ".    }..    "d
05b0: 22 20 7b 0a 20 20 20 20 20 20 73 65 74 20 73 71  " {.      set sq
05c0: 6c 20 22 0a 20 20 20 20 20 20 20 20 44 45 4c 45  l ".        DELE
05d0: 54 45 20 46 52 4f 4d 20 74 24 69 54 62 6c 20 57  TE FROM t$iTbl W
05e0: 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20 28 0a  HERE rowid IN (.
05f0: 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
0600: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 24 69 54   rowid FROM t$iT
0610: 62 6c 20 4f 52 44 45 52 20 42 59 20 31 20 41 53  bl ORDER BY 1 AS
0620: 43 20 4c 49 4d 49 54 20 31 30 0a 20 20 20 20 20  C LIMIT 10.     
0630: 20 20 20 29 0a 20 20 20 20 20 20 22 0a 20 20 20     ).      ".   
0640: 20 7d 0a 0a 20 20 20 20 22 44 22 20 7b 0a 20 20   }..    "D" {.  
0650: 20 20 20 20 73 65 74 20 73 71 6c 20 22 0a 20 20      set sql ".  
0660: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
0670: 4d 20 74 24 69 54 62 6c 20 57 48 45 52 45 20 72  M t$iTbl WHERE r
0680: 6f 77 69 64 20 49 4e 20 28 0a 20 20 20 20 20 20  owid IN (.      
0690: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
06a0: 20 46 52 4f 4d 20 74 24 69 54 62 6c 20 6f 20 57   FROM t$iTbl o W
06b0: 48 45 52 45 20 28 0a 20 20 20 20 20 20 20 20 20  HERE (.         
06c0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
06d0: 2a 29 20 46 52 4f 4d 20 74 24 69 54 62 6c 20 69  *) FROM t$iTbl i
06e0: 20 57 48 45 52 45 20 69 2e 72 6f 77 69 64 3c 6f   WHERE i.rowid<o
06f0: 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20  .rowid.         
0700: 20 29 20 25 20 32 0a 20 20 20 20 20 20 20 20 29   ) % 2.        )
0710: 0a 20 20 20 20 20 20 22 0a 20 20 20 20 7d 0a 0a  .      ".    }..
0720: 20 20 20 20 22 49 22 20 7b 0a 20 20 20 20 20 20      "I" {.      
0730: 73 65 74 20 73 71 6c 20 22 0a 20 20 20 20 20 20  set sql ".      
0740: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 24    INSERT INTO t$
0750: 69 54 62 6c 20 53 45 4c 45 43 54 20 72 61 6e 64  iTbl SELECT rand
0760: 6f 6d 62 6c 6f 62 28 38 30 30 29 2c 20 72 61 6e  omblob(800), ran
0770: 64 6f 6d 62 6c 6f 62 28 38 30 30 29 20 46 52 4f  domblob(800) FRO
0780: 4d 20 74 24 69 54 62 6c 3b 0a 20 20 20 20 20 20  M t$iTbl;.      
0790: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ".    }..    def
07a0: 61 75 6c 74 20 7b 0a 20 20 20 20 20 20 65 72 72  ault {.      err
07b0: 6f 72 20 22 62 61 64 20 69 4f 70 20 70 61 72 61  or "bad iOp para
07c0: 6d 65 74 65 72 3a 20 24 69 4f 70 22 0a 20 20 20  meter: $iOp".   
07d0: 20 7d 0a 20 20 7d 0a 0a 20 20 24 64 62 20 65 76   }.  }..  $db ev
07e0: 61 6c 20 24 73 71 6c 0a 7d 0a 0a 0a 73 65 74 20  al $sql.}...set 
07f0: 44 42 4c 49 53 54 20 7b 64 62 31 20 64 62 32 20  DBLIST {db1 db2 
0800: 64 62 33 20 64 62 34 7d 20 0a 0a 63 72 65 61 74  db3 db4} ..creat
0810: 65 5f 73 63 68 65 6d 61 0a 66 6f 72 65 61 63 68  e_schema.foreach
0820: 20 7b 74 6e 20 6f 70 6c 69 73 74 7d 20 7b 0a 20   {tn oplist} {. 
0830: 20 31 20 20 7b 31 69 20 20 20 32 69 20 20 20 33   1  {1i   2i   3
0840: 69 20 20 20 34 69 7d 20 0a 20 20 32 20 20 7b 31  i   4i} .  2  {1
0850: 69 69 69 20 32 69 69 69 20 33 69 69 69 20 34 69  iii 2iii 3iii 4i
0860: 69 69 7d 0a 20 20 33 20 20 7b 31 64 20 20 20 32  ii}.  3  {1d   2
0870: 64 20 20 20 33 64 20 20 20 34 64 7d 20 0a 20 20  d   3d   4d} .  
0880: 2e 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  -------------
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 34 20 20  ----------.  4  
08a0: 7b 31 69 7d 0a 20 20 35 20 20 7b 31 64 20 32 69  {1i}.  5  {1d 2i
08b0: 7d 0a 20 20 2e 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.  .  ---------
08c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
08d0: 20 36 20 20 7b 31 69 69 69 20 32 69 69 69 20 33   6  {1iii 2iii 3
08e0: 69 69 69 20 34 69 69 69 7d 0a 20 20 37 20 20 7b  iii 4iii}.  7  {
08f0: 31 64 69 20 20 32 69 64 20 20 33 69 69 69 20 34  1di  2id  3iii 4
0900: 64 64 64 7d 0a 20 20 38 20 20 7b 31 69 69 69 20  ddd}.  8  {1iii 
0910: 32 69 69 69 20 33 69 69 69 20 34 69 69 69 7d 0a  2iii 3iii 4iii}.
0920: 20 20 39 20 20 7b 31 44 20 20 32 49 49 7d 0a 20    9  {1D  2II}. 
0930: 20 31 30 20 7b 31 49 20 20 32 44 20 20 33 49 20   10 {1I  2D  3I 
0940: 20 34 44 7d 0a 20 20 31 31 20 7b 31 49 49 49 20   4D}.  11 {1III 
0950: 33 64 64 64 64 64 64 20 34 49 49 49 7d 0a 7d 20  3dddddd 4III}.} 
0960: 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  {.  if {[string 
0970: 72 61 6e 67 65 20 24 6f 70 6c 69 73 74 20 30 20  range $oplist 0 
0980: 30 5d 3d 3d 22 2d 22 7d 20 7b 0a 20 20 20 20 72  0]=="-"} {.    r
0990: 65 73 65 74 5f 64 62 0a 20 20 20 20 63 72 65 61  eset_db.    crea
09a0: 74 65 5f 73 63 68 65 6d 61 0a 20 20 20 20 63 6f  te_schema.    co
09b0: 6e 74 69 6e 75 65 0a 20 20 7d 0a 20 20 66 6f 72  ntinue.  }.  for
09c0: 65 61 63 68 20 64 62 20 24 44 42 4c 49 53 54 20  each db $DBLIST 
09d0: 7b 20 73 71 6c 69 74 65 33 20 24 64 62 20 74 65  { sqlite3 $db te
09e0: 73 74 2e 64 62 20 7d 0a 0a 20 20 64 6f 5f 74 65  st.db }..  do_te
09f0: 73 74 20 31 2e 24 74 6e 20 7b 0a 20 20 20 20 66  st 1.$tn {.    f
0a00: 6f 72 65 61 63 68 20 64 62 20 24 44 42 4c 49 53  oreach db $DBLIS
0a10: 54 20 7b 20 24 64 62 20 65 76 61 6c 20 22 42 45  T { $db eval "BE
0a20: 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 22 20  GIN CONCURRENT" 
0a30: 7d 20 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20  } ..    foreach 
0a40: 6f 70 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 20  op $oplist {.   
0a50: 20 20 20 73 65 74 20 69 54 62 6c 20 5b 73 74 72     set iTbl [str
0a60: 69 6e 67 20 72 61 6e 67 65 20 24 6f 70 20 30 20  ing range $op 0 
0a70: 30 5d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  0].      foreach
0a80: 20 63 68 61 72 20 5b 73 70 6c 69 74 20 5b 73 74   char [split [st
0a90: 72 69 6e 67 20 72 61 6e 67 65 20 24 6f 70 20 31  ring range $op 1
0aa0: 20 65 6e 64 5d 20 7b 7d 5d 20 7b 0a 20 20 20 20   end] {}] {.    
0ab0: 20 20 20 20 64 6f 5f 73 71 6c 5f 6f 70 20 24 69      do_sql_op $i
0ac0: 54 62 6c 20 24 63 68 61 72 0a 20 20 20 20 20 20  Tbl $char.      
0ad0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
0ae0: 65 61 63 68 20 64 62 20 24 44 42 4c 49 53 54 20  each db $DBLIST 
0af0: 7b 20 24 64 62 20 65 76 61 6c 20 22 43 4f 4d 4d  { $db eval "COMM
0b00: 49 54 22 20 7d 0a 20 20 20 20 64 62 20 65 76 61  IT" }.    db eva
0b10: 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72  l {PRAGMA integr
0b20: 69 74 79 5f 63 68 65 63 6b 7d 0a 20 20 7d 20 7b  ity_check}.  } {
0b30: 6f 6b 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 64  ok}..  foreach d
0b40: 62 20 24 44 42 4c 49 53 54 20 7b 20 0a 20 20 20  b $DBLIST { .   
0b50: 20 24 64 62 20 63 6c 6f 73 65 20 0a 20 20 7d 0a   $db close .  }.
0b60: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a  -------------.#.
0bb0: 70 72 6f 63 20 63 72 65 61 74 65 5f 73 63 68 65  proc create_sche
0bc0: 6d 61 32 20 7b 7d 20 7b 0a 20 20 64 62 20 65 76  ma2 {} {.  db ev
0bd0: 61 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  al {.    PRAGMA 
0be0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
0bf0: 61 6c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  al;.    CREATE T
0c00: 41 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45  ABLE t1(x INTEGE
0c10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  R PRIMARY KEY, y
0c20: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
0c30: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 79 29 3b  DEX i1 ON t1(y);
0c40: 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 72 61 6e  .  }.}..proc ran
0c50: 64 69 6e 74 20 7b 6e 4d 61 78 7d 20 7b 0a 20 20  dint {nMax} {.  
0c60: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
0c70: 61 62 73 28 72 61 6e 64 6f 6d 28 29 20 25 20 24  abs(random() % $
0c80: 6e 4d 61 78 29 7d 0a 7d 0a 0a 70 72 6f 63 20 64  nMax)}.}..proc d
0c90: 6f 5f 73 71 6c 5f 6f 70 32 20 7b 64 62 20 69 4f  o_sql_op2 {db iO
0ca0: 70 7d 20 7b 0a 20 20 73 77 69 74 63 68 20 2d 2d  p} {.  switch --
0cb0: 20 24 69 4f 70 20 7b 0a 20 20 20 20 69 20 7b 0a   $iOp {.    i {.
0cc0: 20 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 31        # Insert 1
0cd0: 20 72 6f 77 73 2e 0a 20 20 20 20 20 20 73 65 74   rows..      set
0ce0: 20 72 20 5b 72 61 6e 64 69 6e 74 20 31 30 30 30   r [randint 1000
0cf0: 30 30 30 30 30 30 5d 0a 20 20 20 20 20 20 73 65  000000].      se
0d00: 74 20 3a 3a 72 6f 77 73 28 24 72 29 20 31 0a 20  t ::rows($r) 1. 
0d10: 20 20 20 20 20 23 70 75 74 73 20 22 69 6e 73 65       #puts "inse
0d20: 72 74 20 72 6f 77 20 24 72 22 0a 20 20 20 20 20  rt row $r".     
0d30: 20 24 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45   $db eval { INSE
0d40: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
0d50: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 72 2c 20  O t1 VALUES($r, 
0d60: 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 29 29 3b  randomblob(50));
0d70: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 20   }.    }..    d 
0d80: 7b 0a 20 20 20 20 20 20 23 20 49 6e 73 65 72 74  {.      # Insert
0d90: 20 31 20 72 6f 77 0a 20 20 20 20 20 20 73 65 74   1 row.      set
0da0: 20 6b 65 79 73 20 5b 61 72 72 61 79 20 6e 61 6d   keys [array nam
0db0: 65 73 20 3a 3a 72 6f 77 73 5d 0a 20 20 20 20 20  es ::rows].     
0dc0: 20 73 65 74 20 72 20 5b 72 61 6e 64 69 6e 74 20   set r [randint 
0dd0: 5b 6c 6c 65 6e 67 74 68 20 24 6b 65 79 73 5d 5d  [llength $keys]]
0de0: 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 69 64  .      set rowid
0df0: 20 5b 6c 69 6e 64 65 78 20 24 6b 65 79 73 20 24   [lindex $keys $
0e00: 72 5d 0a 20 20 20 20 20 20 24 64 62 20 65 76 61  r].      $db eva
0e10: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
0e20: 74 31 20 57 48 45 52 45 20 78 3d 24 72 6f 77 69  t1 WHERE x=$rowi
0e30: 64 20 7d 0a 20 20 20 20 20 20 75 6e 73 65 74 20  d }.      unset 
0e40: 3a 3a 72 6f 77 73 28 24 72 6f 77 69 64 29 0a 20  ::rows($rowid). 
0e50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 66 6f 72 65     }.  }.}..fore
0e60: 61 63 68 20 7b 74 6e 20 6e 52 65 70 65 61 74 20  ach {tn nRepeat 
0e70: 6f 70 6c 69 73 74 7d 20 7b 0a 20 20 2d 20 2d 20  oplist} {.  - - 
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 31  ------------.  1
0ea0: 20 31 30 30 20 7b 20 31 69 69 69 69 69 69 69 69   100 { 1iiiiiiii
0eb0: 69 69 20 7d 0a 20 20 32 20 31 30 30 20 7b 20 31  ii }.  2 100 { 1
0ec0: 69 20 32 64 20 7d 0a 20 20 33 20 31 30 30 20 7b  i 2d }.  3 100 {
0ed0: 20 31 64 20 32 69 20 7d 0a 20 20 34 20 20 35 30   1d 2i }.  4  50
0ee0: 20 7b 20 31 64 20 32 69 20 33 64 20 7d 0a 20 20   { 1d 2i 3d }.  
0ef0: 35 20 35 30 30 20 7b 20 31 69 20 32 69 20 33 69  5 500 { 1i 2i 3i
0f00: 20 34 69 20 7d 0a 20 20 36 20 35 30 30 20 7b 20   4i }.  6 500 { 
0f10: 31 69 20 32 64 20 33 64 20 34 64 20 7d 0a 7d 20  1i 2d 3d 4d }.} 
0f20: 7b 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20  {.  if {[string 
0f30: 72 61 6e 67 65 20 24 6f 70 6c 69 73 74 20 30 20  range $oplist 0 
0f40: 30 5d 3d 3d 22 2d 22 7d 20 7b 0a 20 20 20 20 61  0]=="-"} {.    a
0f50: 72 72 61 79 20 75 6e 73 65 74 20 72 6f 77 73 0a  rray unset rows.
0f60: 20 20 20 20 72 65 73 65 74 5f 64 62 0a 20 20 20      reset_db.   
0f70: 20 63 72 65 61 74 65 5f 73 63 68 65 6d 61 32 0a   create_schema2.
0f80: 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d      continue.  }
0f90: 0a 0a 20 20 66 6f 72 65 61 63 68 20 64 62 20 24  ..  foreach db $
0fa0: 44 42 4c 49 53 54 20 7b 20 0a 20 20 20 20 73 71  DBLIST { .    sq
0fb0: 6c 69 74 65 33 20 24 64 62 20 74 65 73 74 2e 64  lite3 $db test.d
0fc0: 62 20 0a 20 20 20 20 73 65 74 20 73 74 61 74 73  b .    set stats
0fd0: 28 24 64 62 2c 30 29 20 30 0a 20 20 20 20 73 65  ($db,0) 0.    se
0fe0: 74 20 73 74 61 74 73 28 24 64 62 2c 31 29 20 30  t stats($db,1) 0
0ff0: 0a 20 20 7d 0a 20 20 61 72 72 61 79 20 75 6e 73  .  }.  array uns
1000: 65 74 20 75 73 65 64 0a 0a 20 20 64 6f 5f 74 65  et used..  do_te
1010: 73 74 20 32 2e 24 74 6e 20 7b 0a 0a 20 20 20 20  st 2.$tn {..    
1020: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
1030: 69 20 3c 20 24 6e 52 65 70 65 61 74 7d 20 7b 69  i < $nRepeat} {i
1040: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 66  ncr i} {.      f
1050: 6f 72 65 61 63 68 20 64 62 20 24 44 42 4c 49 53  oreach db $DBLIS
1060: 54 20 7b 20 24 64 62 20 65 76 61 6c 20 22 42 45  T { $db eval "BE
1070: 47 49 4e 20 43 4f 4e 43 55 52 52 45 4e 54 22 20  GIN CONCURRENT" 
1080: 7d 20 0a 0a 20 20 20 20 20 20 66 6f 72 65 61 63  } ..      foreac
1090: 68 20 6f 70 20 24 6f 70 6c 69 73 74 20 7b 0a 20  h op $oplist {. 
10a0: 20 20 20 20 20 20 20 73 65 74 20 69 44 62 20 5b         set iDb [
10b0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6f 70  string range $op
10c0: 20 30 20 30 5d 0a 20 20 20 20 20 20 20 20 73 65   0 0].        se
10d0: 74 20 75 73 65 64 28 64 62 24 69 44 62 29 20 31  t used(db$iDb) 1
10e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
10f0: 20 63 68 61 72 20 5b 73 70 6c 69 74 20 5b 73 74   char [split [st
1100: 72 69 6e 67 20 72 61 6e 67 65 20 24 6f 70 20 31  ring range $op 1
1110: 20 65 6e 64 5d 20 7b 7d 5d 20 7b 0a 20 20 20 20   end] {}] {.    
1120: 20 20 20 20 20 20 64 6f 5f 73 71 6c 5f 6f 70 32        do_sql_op2
1130: 20 22 64 62 24 69 44 62 22 20 24 63 68 61 72 0a   "db$iDb" $char.
1140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1150: 7d 0a 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  }..      foreach
1160: 20 64 62 20 24 44 42 4c 49 53 54 20 7b 20 0a 20   db $DBLIST { . 
1170: 20 20 20 20 20 20 20 73 65 74 20 72 63 20 5b 63         set rc [c
1180: 61 74 63 68 20 7b 20 24 64 62 20 65 76 61 6c 20  atch { $db eval 
1190: 43 4f 4d 4d 49 54 20 7d 20 6d 73 67 5d 0a 20 20  COMMIT } msg].  
11a0: 20 20 20 20 20 20 69 66 20 7b 24 72 63 7d 20 7b        if {$rc} {
11b0: 20 24 64 62 20 65 76 61 6c 20 52 4f 4c 4c 42 41   $db eval ROLLBA
11c0: 43 4b 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 63  CK }.        inc
11d0: 72 20 73 74 61 74 73 28 24 64 62 2c 24 72 63 29  r stats($db,$rc)
11e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11f0: 65 74 20 72 65 73 20 5b 64 62 20 65 76 61 6c 20  et res [db eval 
1200: 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  {PRAGMA integrit
1210: 79 5f 63 68 65 63 6b 7d 5d 0a 20 20 20 20 20 20  y_check}].      
1220: 69 66 20 7b 24 72 65 73 20 21 3d 20 22 6f 6b 22  if {$res != "ok"
1230: 7d 20 7b 20 70 75 74 73 20 22 61 66 74 65 72 20  } { puts "after 
1240: 24 64 62 20 24 72 63 3a 20 24 72 65 73 22 20 3b  $db $rc: $res" ;
1250: 20 61 66 74 65 72 20 31 30 30 30 30 30 30 20 7d   after 1000000 }
1260: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  .    }.  } {}.. 
1270: 20 66 6f 72 65 61 63 68 20 64 62 20 24 44 42 4c   foreach db $DBL
1280: 49 53 54 20 7b 20 0a 20 20 20 20 24 64 62 20 63  IST { .    $db c
1290: 6c 6f 73 65 20 0a 20 20 7d 0a 20 20 23 20 66 6f  lose .  }.  # fo
12a0: 72 65 61 63 68 20 6b 20 5b 6c 73 6f 72 74 20 5b  reach k [lsort [
12b0: 61 72 72 61 79 20 6e 61 6d 65 73 20 75 73 65 64  array names used
12c0: 5d 5d 20 7b 0a 20 20 23 20 20 20 70 75 74 73 20  ]] {.  #   puts 
12d0: 22 24 6b 3a 20 24 73 74 61 74 73 28 24 6b 2c 30  "$k: $stats($k,0
12e0: 29 20 63 6f 6d 6d 69 74 74 65 64 2c 20 24 73 74  ) committed, $st
12f0: 61 74 73 28 24 6b 2c 31 29 20 72 6f 6c 6c 65 64  ats($k,1) rolled
1300: 20 62 61 63 6b 22 0a 20 20 23 20 7d 0a 7d 0a 0a   back".  # }.}..
1310: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.