/ Hex Artifact Content
Login

Artifact 401064236d3cf86b7edc01c586d7c5554f48553946fbfa1a3af35d7e47dce9e3:


0000: 23 20 32 30 31 34 20 4f 63 74 6f 62 65 72 20 32  # 2014 October 2
0010: 31 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  1.#.# 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 23 20 54 68 69 73  *******.#.# This
0170: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0180: 65 73 74 73 20 66 6f 72 20 74 68 65 20 52 42 55  ests for the RBU
0190: 20 6d 6f 64 75 6c 65 2e 20 53 70 65 63 69 66 69   module. Specifi
01a0: 63 61 6c 6c 79 2c 20 69 74 20 74 65 73 74 73 20  cally, it tests 
01b0: 74 68 65 0a 23 20 6f 75 74 63 6f 6d 65 20 6f 66  the.# outcome of
01c0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6c 69 65   some other clie
01d0: 6e 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  nt writing to th
01e0: 65 20 64 61 74 61 62 61 73 65 20 77 68 69 6c 65  e database while
01f0: 20 61 6e 20 52 42 55 20 75 70 64 61 74 65 0a 23   an RBU update.#
0200: 20 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69 65   is being applie
0210: 64 2e 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65  d...if {![info e
0220: 78 69 73 74 73 20 74 65 73 74 64 69 72 5d 7d 20  xists testdir]} 
0230: 7b 0a 20 20 73 65 74 20 74 65 73 74 64 69 72 20  {.  set testdir 
0240: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65  [file join [file
0250: 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
0260: 63 72 69 70 74 5d 5d 20 2e 2e 20 2e 2e 20 74 65  cript]] .. .. te
0270: 73 74 5d 0a 7d 0a 73 6f 75 72 63 65 20 24 74 65  st].}.source $te
0280: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
0290: 0a 73 65 74 20 3a 3a 74 65 73 74 70 72 65 66 69  .set ::testprefi
02a0: 78 20 72 62 75 36 0a 0a 70 72 6f 63 20 73 65 74  x rbu6..proc set
02b0: 75 70 5f 74 65 73 74 20 7b 7d 20 7b 0a 20 20 72  up_test {} {.  r
02c0: 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73 71  eset_db.  execsq
02d0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
02e0: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
02f0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
0300: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
0310: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
0320: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0330: 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a  KEY, b UNIQUE);.
0340: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0350: 20 74 33 28 61 20 49 4e 54 45 47 45 52 20 50 52   t3(a INTEGER PR
0360: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55 4e 49  IMARY KEY, b UNI
0370: 51 55 45 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63  QUE);.  }.  db c
0380: 6c 6f 73 65 0a 0a 20 20 66 6f 72 63 65 64 65 6c  lose..  forcedel
0390: 65 74 65 20 72 62 75 2e 64 62 0a 20 20 73 71 6c  ete rbu.db.  sql
03a0: 69 74 65 33 20 72 62 75 20 72 62 75 2e 64 62 0a  ite3 rbu rbu.db.
03b0: 20 20 72 62 75 20 65 76 61 6c 20 7b 0a 20 20 20    rbu eval {.   
03c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 61   CREATE TABLE da
03d0: 74 61 5f 74 31 28 61 2c 20 62 2c 20 72 62 75 5f  ta_t1(a, b, rbu_
03e0: 63 6f 6e 74 72 6f 6c 29 3b 0a 20 20 20 20 43 52  control);.    CR
03f0: 45 41 54 45 20 54 41 42 4c 45 20 64 61 74 61 5f  EATE TABLE data_
0400: 74 32 28 61 2c 20 62 2c 20 72 62 75 5f 63 6f 6e  t2(a, b, rbu_con
0410: 74 72 6f 6c 29 3b 0a 20 20 20 20 43 52 45 41 54  trol);.    CREAT
0420: 45 20 54 41 42 4c 45 20 64 61 74 61 5f 74 33 28  E TABLE data_t3(
0430: 61 2c 20 62 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  a, b, rbu_contro
0440: 6c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l);.    INSERT I
0450: 4e 54 4f 20 64 61 74 61 5f 74 31 20 56 41 4c 55  NTO data_t1 VALU
0460: 45 53 28 31 2c 20 27 74 31 27 2c 20 30 29 3b 0a  ES(1, 't1', 0);.
0470: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0480: 64 61 74 61 5f 74 32 20 56 41 4c 55 45 53 28 32  data_t2 VALUES(2
0490: 2c 20 27 74 32 27 2c 20 30 29 3b 0a 20 20 20 20  , 't2', 0);.    
04a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 61 74 61  INSERT INTO data
04b0: 5f 74 33 20 56 41 4c 55 45 53 28 33 2c 20 27 74  _t3 VALUES(3, 't
04c0: 33 27 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 62  3', 0);.  }.  rb
04d0: 75 20 63 6c 6f 73 65 0a 7d 0a 0a 23 20 54 65 73  u close.}..# Tes
04e0: 74 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  t the outcome of
04f0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6c 69 65   some other clie
0500: 6e 74 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  nt writing the d
0510: 62 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f 61  b while the *-oa
0520: 6c 20 0a 23 20 66 69 6c 65 20 69 73 20 62 65 69  l .# file is bei
0530: 6e 67 20 67 65 6e 65 72 61 74 65 64 2e 20 4f 6e  ng generated. On
0540: 63 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  ce this has happ
0550: 65 6e 65 64 2c 20 74 68 65 20 75 70 64 61 74 65  ened, the update
0560: 20 63 61 6e 6e 6f 74 20 62 65 0a 23 20 70 72 6f   cannot be.# pro
0570: 67 72 65 73 73 65 64 2e 0a 23 0a 66 6f 72 20 7b  gressed..#.for {
0580: 73 65 74 20 6e 53 74 65 70 20 31 7d 20 7b 24 6e  set nStep 1} {$n
0590: 53 74 65 70 20 3c 20 38 7d 20 7b 69 6e 63 72 20  Step < 8} {incr 
05a0: 6e 53 74 65 70 7d 20 7b 0a 20 20 64 6f 5f 74 65  nStep} {.  do_te
05b0: 73 74 20 31 2e 24 6e 53 74 65 70 2e 31 20 7b 0a  st 1.$nStep.1 {.
05c0: 20 20 20 20 73 65 74 75 70 5f 74 65 73 74 0a 20      setup_test. 
05d0: 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 72 62     sqlite3rbu rb
05e0: 75 20 74 65 73 74 2e 64 62 20 72 62 75 2e 64 62  u test.db rbu.db
05f0: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
0600: 30 7d 20 7b 24 69 3c 24 6e 53 74 65 70 7d 20 7b  0} {$i<$nStep} {
0610: 69 6e 63 72 20 69 7d 20 7b 72 62 75 20 73 74 65  incr i} {rbu ste
0620: 70 7d 0a 0a 20 20 20 20 72 62 75 20 63 6c 6f 73  p}..    rbu clos
0630: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  e.    sqlite3 db
0640: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
0650: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0660: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
0670: 27 68 65 6c 6c 6f 27 29 20 7d 0a 20 20 20 20 73  'hello') }.    s
0680: 71 6c 69 74 65 33 72 62 75 20 72 62 75 20 74 65  qlite3rbu rbu te
0690: 73 74 2e 64 62 20 72 62 75 2e 64 62 0a 20 20 20  st.db rbu.db.   
06a0: 20 72 62 75 20 73 74 65 70 0a 20 20 7d 20 7b 53   rbu step.  } {S
06b0: 51 4c 49 54 45 5f 42 55 53 59 7d 0a 20 20 64 6f  QLITE_BUSY}.  do
06c0: 5f 74 65 73 74 20 31 2e 24 6e 53 74 65 70 2e 32  _test 1.$nStep.2
06d0: 20 7b 0a 20 20 20 20 72 62 75 20 73 74 65 70 0a   {.    rbu step.
06e0: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 42 55 53 59    } {SQLITE_BUSY
06f0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 6e  }.  do_test 1.$n
0700: 53 74 65 70 2e 33 20 7b 0a 20 20 20 20 6c 69 73  Step.3 {.    lis
0710: 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  t [file exists t
0720: 65 73 74 2e 64 62 2d 6f 61 6c 5d 20 5b 66 69 6c  est.db-oal] [fil
0730: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
0740: 2d 77 61 6c 5d 0a 20 20 7d 20 7b 31 20 30 7d 0a  -wal].  } {1 0}.
0750: 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 6e 53 74    do_test 1.$nSt
0760: 65 70 2e 34 20 7b 0a 20 20 20 20 6c 69 73 74 20  ep.4 {.    list 
0770: 5b 63 61 74 63 68 20 7b 20 72 62 75 20 63 6c 6f  [catch { rbu clo
0780: 73 65 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20  se } msg] $msg. 
0790: 20 7d 20 7b 31 20 7b 53 51 4c 49 54 45 5f 42 55   } {1 {SQLITE_BU
07a0: 53 59 20 2d 20 64 61 74 61 62 61 73 65 20 6d 6f  SY - database mo
07b0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 72 62  dified during rb
07c0: 75 20 75 70 64 61 74 65 7d 7d 0a 7d 0a 0a 23 20  u update}}.}..# 
07d0: 54 65 73 74 20 74 68 65 20 6f 75 74 63 6f 6d 65  Test the outcome
07e0: 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   of some other c
07f0: 6c 69 65 6e 74 20 77 72 69 74 69 6e 67 20 74 68  lient writing th
0800: 65 20 64 62 20 61 66 74 65 72 20 74 68 65 20 2a  e db after the *
0810: 2d 6f 61 6c 0a 23 20 66 69 6c 65 20 68 61 73 20  -oal.# file has 
0820: 62 65 65 6e 20 63 6f 70 69 65 64 20 74 6f 20 74  been copied to t
0830: 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e 20 4f  he *-wal path. O
0840: 6e 63 65 20 74 68 69 73 20 68 61 73 20 68 61 70  nce this has hap
0850: 70 65 6e 65 64 2c 20 61 6e 79 0a 23 20 6f 74 68  pened, any.# oth
0860: 65 72 20 63 6c 69 65 6e 74 20 77 72 69 74 69 6e  er client writin
0870: 67 20 74 6f 20 74 68 65 20 64 62 20 63 61 75 73  g to the db caus
0880: 65 73 20 52 42 55 20 74 6f 20 63 6f 6e 73 69 64  es RBU to consid
0890: 65 72 20 69 74 73 20 6a 6f 62 20 66 69 6e 69 73  er its job finis
08a0: 68 65 64 2e 0a 23 0a 66 6f 72 20 7b 73 65 74 20  hed..#.for {set 
08b0: 6e 53 74 65 70 20 38 7d 20 7b 24 6e 53 74 65 70  nStep 8} {$nStep
08c0: 20 3c 20 32 30 7d 20 7b 69 6e 63 72 20 6e 53 74   < 20} {incr nSt
08d0: 65 70 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ep} {.  do_test 
08e0: 31 2e 24 6e 53 74 65 70 2e 31 20 7b 0a 20 20 20  1.$nStep.1 {.   
08f0: 20 73 65 74 75 70 5f 74 65 73 74 0a 20 20 20 20   setup_test.    
0900: 73 71 6c 69 74 65 33 72 62 75 20 72 62 75 20 74  sqlite3rbu rbu t
0910: 65 73 74 2e 64 62 20 72 62 75 2e 64 62 0a 20 20  est.db rbu.db.  
0920: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
0930: 7b 24 69 3c 24 6e 53 74 65 70 7d 20 7b 69 6e 63  {$i<$nStep} {inc
0940: 72 20 69 7d 20 7b 72 62 75 20 73 74 65 70 7d 0a  r i} {rbu step}.
0950: 20 20 20 20 72 62 75 20 63 6c 6f 73 65 0a 20 20      rbu close.  
0960: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
0970: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
0980: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
0990: 31 20 56 41 4c 55 45 53 28 35 2c 20 27 68 65 6c  1 VALUES(5, 'hel
09a0: 6c 6f 27 29 20 7d 0a 20 20 20 20 73 71 6c 69 74  lo') }.    sqlit
09b0: 65 33 72 62 75 20 72 62 75 20 74 65 73 74 2e 64  e3rbu rbu test.d
09c0: 62 20 72 62 75 2e 64 62 0a 20 20 20 20 72 62 75  b rbu.db.    rbu
09d0: 20 73 74 65 70 0a 20 20 7d 20 7b 53 51 4c 49 54   step.  } {SQLIT
09e0: 45 5f 44 4f 4e 45 7d 0a 20 20 64 6f 5f 74 65 73  E_DONE}.  do_tes
09f0: 74 20 31 2e 24 6e 53 74 65 70 2e 32 20 7b 0a 20  t 1.$nStep.2 {. 
0a00: 20 20 20 72 62 75 20 73 74 65 70 0a 20 20 7d 20     rbu step.  } 
0a10: 7b 53 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 20 20  {SQLITE_DONE}.  
0a20: 64 6f 5f 74 65 73 74 20 31 2e 24 6e 53 74 65 70  do_test 1.$nStep
0a30: 2e 33 20 7b 0a 20 20 20 20 66 69 6c 65 20 65 78  .3 {.    file ex
0a40: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6f 61 6c  ists test.db-oal
0a50: 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65  .  } {0}.  do_te
0a60: 73 74 20 31 2e 24 6e 53 74 65 70 2e 34 20 7b 0a  st 1.$nStep.4 {.
0a70: 20 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20      list [catch 
0a80: 7b 20 72 62 75 20 63 6c 6f 73 65 20 7d 20 6d 73  { rbu close } ms
0a90: 67 5d 20 24 6d 73 67 0a 20 20 7d 20 7b 30 20 53  g] $msg.  } {0 S
0aa0: 51 4c 49 54 45 5f 44 4f 4e 45 7d 0a 0a 20 20 64  QLITE_DONE}..  d
0ab0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0ac0: 2e 24 6e 53 74 65 70 2e 35 20 7b 0a 20 20 20 20  .$nStep.5 {.    
0ad0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0ae0: 3b 0a 20 20 7d 20 7b 31 20 74 31 20 35 20 68 65  ;.  } {1 t1 5 he
0af0: 6c 6c 6f 7d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f  llo}.}...finish_
0b00: 74 65 73 74 0a                                   test.