/ Hex Artifact Content
Login

Artifact 48a645a7bb3a59a6fcf06a7364cfe5b655c336760de39068f7c241b0fc80d963:


0000: 23 20 32 30 30 39 20 4a 61 6e 75 61 72 79 20 33  # 2009 January 3
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 0a 23 0a 23 20 24 49 64 3a 20  ******.#.# $Id: 
0170: 73 61 76 65 70 6f 69 6e 74 36 2e 74 65 73 74 2c  savepoint6.test,
0180: 76 20 31 2e 34 20 32 30 30 39 2f 30 36 2f 30 35  v 1.4 2009/06/05
0190: 20 31 37 3a 30 39 3a 31 32 20 64 72 68 20 45 78   17:09:12 drh Ex
01a0: 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72  p $..set testdir
01b0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
01c0: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
01d0: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
01e0: 6c 0a 0a 70 72 6f 63 20 73 71 6c 20 7b 7a 53 71  l..proc sql {zSq
01f0: 6c 7d 20 7b 0a 20 20 69 66 20 7b 30 20 26 26 20  l} {.  if {0 && 
0200: 24 3a 3a 64 65 62 75 67 5f 6f 70 7d 20 7b 0a 20  $::debug_op} {. 
0210: 20 20 20 70 75 74 73 20 73 74 64 65 72 72 20 22     puts stderr "
0220: 24 7a 53 71 6c 20 3b 22 0a 20 20 20 20 66 6c 75  $zSql ;".    flu
0230: 73 68 20 73 74 64 65 72 72 0a 20 20 7d 0a 20 20  sh stderr.  }.  
0240: 75 70 6c 65 76 65 6c 20 64 62 20 65 76 61 6c 20  uplevel db eval 
0250: 5b 6c 69 73 74 20 24 7a 53 71 6c 5d 0a 20 20 23  [list $zSql].  #
0260: 70 75 74 73 20 73 74 64 65 72 72 20 22 24 7a 53  puts stderr "$zS
0270: 71 6c 20 3b 22 0a 7d 0a 0a 73 65 74 20 44 41 54  ql ;".}..set DAT
0280: 41 42 41 53 45 5f 53 43 48 45 4d 41 20 7b 0a 20  ABASE_SCHEMA {. 
0290: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
02a0: 61 63 75 75 6d 20 3d 20 69 6e 63 72 65 6d 65 6e  acuum = incremen
02b0: 74 61 6c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  tal;.    CREATE 
02c0: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a  TABLE t1(x, y);.
02d0: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
02e0: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
02f0: 28 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (x);.    CREATE 
0300: 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 79  INDEX i2 ON t1(y
0310: 29 3b 0a 7d 0a 0a 69 66 20 7b 30 3d 3d 5b 69 6e  );.}..if {0==[in
0320: 66 6f 20 65 78 69 73 74 73 20 3a 3a 47 28 73 61  fo exists ::G(sa
0330: 76 65 70 6f 69 6e 74 36 5f 69 74 65 72 61 74 69  vepoint6_iterati
0340: 6f 6e 73 29 5d 7d 20 7b 0a 20 20 73 65 74 20 3a  ons)]} {.  set :
0350: 3a 47 28 73 61 76 65 70 6f 69 6e 74 36 5f 69 74  :G(savepoint6_it
0360: 65 72 61 74 69 6f 6e 73 29 20 31 30 30 30 0a 7d  erations) 1000.}
0370: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
03c0: 49 6e 20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  In memory databa
03d0: 73 65 20 73 74 61 74 65 2e 0a 23 0a 23 20 3a 3a  se state..#.# ::
03e0: 6c 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 20  lSavepoint is a 
03f0: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
0400: 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
0410: 63 68 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  ch active savepo
0420: 69 6e 74 2e 20 54 68 65 0a 23 20 66 69 72 73 74  int. The.# first
0430: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69   entry in the li
0440: 73 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  st corresponds t
0450: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
0460: 74 6c 79 20 6f 70 65 6e 65 64 20 73 61 76 65 70  tly opened savep
0470: 6f 69 6e 74 2e 0a 23 20 45 61 63 68 20 65 6e 74  oint..# Each ent
0480: 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ry consists of t
0490: 77 6f 20 65 6c 65 6d 65 6e 74 73 3a 0a 23 0a 23  wo elements:.#.#
04a0: 20 20 20 31 2e 20 54 68 65 20 73 61 76 65 70 6f     1. The savepo
04b0: 69 6e 74 20 6e 61 6d 65 2e 0a 23 0a 23 20 20 20  int name..#.#   
04c0: 32 2e 20 41 20 73 65 72 69 61 6c 69 7a 65 64 20  2. A serialized 
04d0: 54 63 6c 20 61 72 72 61 79 20 72 65 70 72 65 73  Tcl array repres
04e0: 65 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  enting the conte
04f0: 6e 74 73 20 6f 66 20 74 61 62 6c 65 20 74 31 20  nts of table t1 
0500: 61 74 20 74 68 65 0a 23 20 20 20 20 20 20 73 74  at the.#      st
0510: 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
0520: 6f 69 6e 74 2e 20 54 68 65 20 6b 65 79 73 20 6f  oint. The keys o
0530: 66 20 74 68 65 20 61 72 72 61 79 20 61 72 65 20  f the array are 
0540: 74 68 65 20 78 20 76 61 6c 75 65 73 2e 20 54 68  the x values. Th
0550: 65 0a 23 20 20 20 20 20 20 76 61 6c 75 65 73 20  e.#      values 
0560: 61 72 65 20 74 68 65 20 79 20 76 61 6c 75 65 73  are the y values
0570: 2e 0a 23 20 20 0a 23 20 41 72 72 61 79 20 3a 3a  ..#  .# Array ::
0580: 61 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20  aEntry contains 
0590: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
05a0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 74  database table t
05b0: 31 2e 20 41 72 72 61 79 20 6b 65 79 73 20 61 72  1. Array keys ar
05c0: 65 0a 23 20 78 20 76 61 6c 75 65 73 2c 20 74 68  e.# x values, th
05d0: 65 20 61 72 72 61 79 20 64 61 74 61 20 76 61 6c  e array data val
05e0: 75 65 73 20 61 72 65 20 79 20 76 61 6c 75 65 73  ues are y values
05f0: 2e 0a 23 0a 73 65 74 20 6c 53 61 76 65 70 6f 69  ..#.set lSavepoi
0600: 6e 74 20 5b 6c 69 73 74 5d 0a 61 72 72 61 79 20  nt [list].array 
0610: 73 65 74 20 61 45 6e 74 72 79 20 5b 6c 69 73 74  set aEntry [list
0620: 5d 0a 0a 70 72 6f 63 20 78 5f 74 6f 5f 79 20 7b  ]..proc x_to_y {
0630: 78 7d 20 7b 0a 20 20 73 65 74 20 6e 43 68 61 72  x} {.  set nChar
0640: 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28   [expr int(rand(
0650: 29 2a 32 35 30 29 20 2b 20 32 35 30 5d 0a 20 20  )*250) + 250].  
0660: 73 65 74 20 73 74 72 20 22 20 24 6e 43 68 61 72  set str " $nChar
0670: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0680: 24 78 2e 20 24 6e 43 68 61 72 5d 22 0a 20 20 73  $x. $nChar]".  s
0690: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 73 74 72  tring range $str
06a0: 20 31 20 24 6e 43 68 61 72 0a 7d 0a 23 2d 2d 2d   1 $nChar.}.#---
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d 2d  -------..#------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0740: 2d 2d 2d 0a 23 20 50 72 6f 63 73 20 74 6f 20 6f  ---.# Procs to o
0750: 70 65 72 61 74 65 20 6f 6e 20 64 61 74 61 62 61  perate on databa
0760: 73 65 3a 0a 23 0a 23 20 20 20 73 61 76 65 70 6f  se:.#.#   savepo
0770: 69 6e 74 20 4e 41 4d 45 0a 23 20 20 20 72 6f 6c  int NAME.#   rol
0780: 6c 62 61 63 6b 20 20 4e 41 4d 45 0a 23 20 20 20  lback  NAME.#   
0790: 72 65 6c 65 61 73 65 20 20 20 4e 41 4d 45 0a 23  release   NAME.#
07a0: 0a 23 20 20 20 69 6e 73 65 72 74 5f 72 6f 77 73  .#   insert_rows
07b0: 20 58 56 41 4c 55 45 53 0a 23 20 20 20 64 65 6c   XVALUES.#   del
07c0: 65 74 65 5f 72 6f 77 73 20 58 56 41 4c 55 45 53  ete_rows XVALUES
07d0: 0a 23 0a 70 72 6f 63 20 73 61 76 65 70 6f 69 6e  .#.proc savepoin
07e0: 74 20 7b 7a 4e 61 6d 65 7d 20 7b 0a 20 20 69 66  t {zName} {.  if
07f0: 20 7b 24 3a 3a 64 65 62 75 67 5f 6f 70 7d 20 7b   {$::debug_op} {
0800: 20 70 75 74 73 20 73 74 64 65 72 72 20 22 73 61   puts stderr "sa
0810: 76 65 70 6f 69 6e 74 20 24 7a 4e 61 6d 65 22 20  vepoint $zName" 
0820: 3b 20 66 6c 75 73 68 20 73 74 64 65 72 72 20 7d  ; flush stderr }
0830: 0a 20 20 63 61 74 63 68 20 7b 20 73 71 6c 20 22  .  catch { sql "
0840: 53 41 56 45 50 4f 49 4e 54 20 24 7a 4e 61 6d 65  SAVEPOINT $zName
0850: 22 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a  " }.  lappend ::
0860: 6c 53 61 76 65 70 6f 69 6e 74 20 5b 6c 69 73 74  lSavepoint [list
0870: 20 24 7a 4e 61 6d 65 20 5b 61 72 72 61 79 20 67   $zName [array g
0880: 65 74 20 3a 3a 61 45 6e 74 72 79 5d 5d 0a 7d 0a  et ::aEntry]].}.
0890: 0a 70 72 6f 63 20 72 6f 6c 6c 62 61 63 6b 20 7b  .proc rollback {
08a0: 7a 4e 61 6d 65 7d 20 7b 0a 20 20 69 66 20 7b 24  zName} {.  if {$
08b0: 3a 3a 64 65 62 75 67 5f 6f 70 7d 20 7b 20 70 75  ::debug_op} { pu
08c0: 74 73 20 73 74 64 65 72 72 20 22 72 6f 6c 6c 62  ts stderr "rollb
08d0: 61 63 6b 20 24 7a 4e 61 6d 65 22 20 3b 20 66 6c  ack $zName" ; fl
08e0: 75 73 68 20 73 74 64 65 72 72 20 7d 0a 20 20 63  ush stderr }.  c
08f0: 61 74 63 68 20 7b 20 73 71 6c 20 22 52 4f 4c 4c  atch { sql "ROLL
0900: 42 41 43 4b 20 54 4f 20 24 7a 4e 61 6d 65 22 20  BACK TO $zName" 
0910: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 5b  }.  for {set i [
0920: 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  expr {[llength $
0930: 3a 3a 6c 53 61 76 65 70 6f 69 6e 74 5d 2d 31 7d  ::lSavepoint]-1}
0940: 5d 7d 20 7b 24 69 3e 3d 30 7d 20 7b 69 6e 63 72  ]} {$i>=0} {incr
0950: 20 69 20 2d 31 7d 20 7b 0a 20 20 20 20 73 65 74   i -1} {.    set
0960: 20 7a 53 61 76 65 70 6f 69 6e 74 20 5b 6c 69 6e   zSavepoint [lin
0970: 64 65 78 20 24 3a 3a 6c 53 61 76 65 70 6f 69 6e  dex $::lSavepoin
0980: 74 20 24 69 20 30 5d 0a 20 20 20 20 69 66 20 7b  t $i 0].    if {
0990: 24 7a 53 61 76 65 70 6f 69 6e 74 20 65 71 20 24  $zSavepoint eq $
09a0: 7a 4e 61 6d 65 7d 20 7b 0a 20 20 20 20 20 20 75  zName} {.      u
09b0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
09c0: 20 3a 3a 61 45 6e 74 72 79 0a 20 20 20 20 20 20   ::aEntry.      
09d0: 61 72 72 61 79 20 73 65 74 20 3a 3a 61 45 6e 74  array set ::aEnt
09e0: 72 79 20 5b 6c 69 6e 64 65 78 20 24 3a 3a 6c 53  ry [lindex $::lS
09f0: 61 76 65 70 6f 69 6e 74 20 24 69 20 31 5d 0a 0a  avepoint $i 1]..
0a00: 0a 20 20 20 20 20 20 69 66 20 7b 24 69 2b 31 20  .      if {$i+1 
0a10: 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 6c 53  < [llength $::lS
0a20: 61 76 65 70 6f 69 6e 74 5d 7d 20 7b 0a 20 20 20  avepoint]} {.   
0a30: 20 20 20 20 20 73 65 74 20 3a 3a 6c 53 61 76 65       set ::lSave
0a40: 70 6f 69 6e 74 20 5b 6c 72 65 70 6c 61 63 65 20  point [lreplace 
0a50: 24 3a 3a 6c 53 61 76 65 70 6f 69 6e 74 20 5b 65  $::lSavepoint [e
0a60: 78 70 72 20 24 69 2b 31 5d 20 65 6e 64 5d 0a 20  xpr $i+1] end]. 
0a70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
0a80: 61 6b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ak.    }.  }.}..
0a90: 70 72 6f 63 20 72 65 6c 65 61 73 65 20 7b 7a 4e  proc release {zN
0aa0: 61 6d 65 7d 20 7b 0a 20 20 69 66 20 7b 24 3a 3a  ame} {.  if {$::
0ab0: 64 65 62 75 67 5f 6f 70 7d 20 7b 20 70 75 74 73  debug_op} { puts
0ac0: 20 73 74 64 65 72 72 20 22 72 65 6c 65 61 73 65   stderr "release
0ad0: 20 24 7a 4e 61 6d 65 22 20 3b 20 66 6c 75 73 68   $zName" ; flush
0ae0: 20 73 74 64 65 72 72 20 7d 0a 20 20 63 61 74 63   stderr }.  catc
0af0: 68 20 7b 20 73 71 6c 20 22 52 45 4c 45 41 53 45  h { sql "RELEASE
0b00: 20 24 7a 4e 61 6d 65 22 20 7d 0a 20 20 66 6f 72   $zName" }.  for
0b10: 20 7b 73 65 74 20 69 20 5b 65 78 70 72 20 7b 5b   {set i [expr {[
0b20: 6c 6c 65 6e 67 74 68 20 24 3a 3a 6c 53 61 76 65  llength $::lSave
0b30: 70 6f 69 6e 74 5d 2d 31 7d 5d 7d 20 7b 24 69 3e  point]-1}]} {$i>
0b40: 3d 30 7d 20 7b 69 6e 63 72 20 69 20 2d 31 7d 20  =0} {incr i -1} 
0b50: 7b 0a 20 20 20 20 73 65 74 20 7a 53 61 76 65 70  {.    set zSavep
0b60: 6f 69 6e 74 20 5b 6c 69 6e 64 65 78 20 24 3a 3a  oint [lindex $::
0b70: 6c 53 61 76 65 70 6f 69 6e 74 20 24 69 20 30 5d  lSavepoint $i 0]
0b80: 0a 20 20 20 20 69 66 20 7b 24 7a 53 61 76 65 70  .    if {$zSavep
0b90: 6f 69 6e 74 20 65 71 20 24 7a 4e 61 6d 65 7d 20  oint eq $zName} 
0ba0: 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 6c 53  {.      set ::lS
0bb0: 61 76 65 70 6f 69 6e 74 20 5b 6c 72 65 70 6c 61  avepoint [lrepla
0bc0: 63 65 20 24 3a 3a 6c 53 61 76 65 70 6f 69 6e 74  ce $::lSavepoint
0bd0: 20 24 69 20 65 6e 64 5d 0a 20 20 20 20 20 20 62   $i end].      b
0be0: 72 65 61 6b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  reak.    }.  }..
0bf0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
0c00: 3a 3a 6c 53 61 76 65 70 6f 69 6e 74 5d 20 3d 3d  ::lSavepoint] ==
0c10: 20 30 7d 20 7b 0a 20 20 20 20 23 70 75 74 73 20   0} {.    #puts 
0c20: 73 74 64 65 72 72 20 22 2d 2d 20 45 6e 64 20 6f  stderr "-- End o
0c30: 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 21 21 21  f transaction!!!
0c40: 21 21 21 21 21 21 21 21 21 21 22 0a 20 20 7d 0a  !!!!!!!!!!".  }.
0c50: 7d 0a 0a 70 72 6f 63 20 69 6e 73 65 72 74 5f 72  }..proc insert_r
0c60: 6f 77 73 20 7b 6c 58 7d 20 7b 0a 20 20 69 66 20  ows {lX} {.  if 
0c70: 7b 24 3a 3a 64 65 62 75 67 5f 6f 70 7d 20 7b 20  {$::debug_op} { 
0c80: 70 75 74 73 20 73 74 64 65 72 72 20 22 69 6e 73  puts stderr "ins
0c90: 65 72 74 5f 72 6f 77 73 20 24 6c 58 22 20 3b 20  ert_rows $lX" ; 
0ca0: 66 6c 75 73 68 20 73 74 64 65 72 72 20 7d 0a 20  flush stderr }. 
0cb0: 20 66 6f 72 65 61 63 68 20 78 20 24 6c 58 20 7b   foreach x $lX {
0cc0: 0a 20 20 20 20 73 65 74 20 79 20 5b 78 5f 74 6f  .    set y [x_to
0cd0: 5f 79 20 24 78 5d 0a 0a 20 20 20 20 23 20 55 70  _y $x]..    # Up
0ce0: 64 61 74 65 20 64 61 74 61 62 61 73 65 20 5b 64  date database [d
0cf0: 62 5d 0a 20 20 20 20 73 71 6c 20 22 49 4e 53 45  b].    sql "INSE
0d00: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
0d10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 78 2c  TO t1 VALUES($x,
0d20: 20 27 24 79 27 29 22 0a 0a 20 20 20 20 23 20 55   '$y')"..    # U
0d30: 70 64 61 74 65 20 74 68 65 20 54 63 6c 20 64 61  pdate the Tcl da
0d40: 74 61 62 61 73 65 2e 0a 20 20 20 20 73 65 74 20  tabase..    set 
0d50: 3a 3a 61 45 6e 74 72 79 28 24 78 29 20 24 79 0a  ::aEntry($x) $y.
0d60: 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 64 65 6c 65    }.}..proc dele
0d70: 74 65 5f 72 6f 77 73 20 7b 6c 58 7d 20 7b 0a 20  te_rows {lX} {. 
0d80: 20 69 66 20 7b 24 3a 3a 64 65 62 75 67 5f 6f 70   if {$::debug_op
0d90: 7d 20 7b 20 70 75 74 73 20 73 74 64 65 72 72 20  } { puts stderr 
0da0: 22 64 65 6c 65 74 65 5f 72 6f 77 73 20 24 6c 58  "delete_rows $lX
0db0: 22 20 3b 20 66 6c 75 73 68 20 73 74 64 65 72 72  " ; flush stderr
0dc0: 20 7d 0a 20 20 66 6f 72 65 61 63 68 20 78 20 24   }.  foreach x $
0dd0: 6c 58 20 7b 0a 20 20 20 20 23 20 55 70 64 61 74  lX {.    # Updat
0de0: 65 20 64 61 74 61 62 61 73 65 20 5b 64 62 5d 0a  e database [db].
0df0: 20 20 20 20 73 71 6c 20 22 44 45 4c 45 54 45 20      sql "DELETE 
0e00: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20  FROM t1 WHERE x 
0e10: 3d 20 24 78 22 0a 0a 20 20 20 20 23 20 55 70 64  = $x"..    # Upd
0e20: 61 74 65 20 74 68 65 20 54 63 6c 20 64 61 74 61  ate the Tcl data
0e30: 62 61 73 65 2e 0a 20 20 20 20 75 6e 73 65 74 20  base..    unset 
0e40: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 61 45  -nocomplain ::aE
0e50: 6e 74 72 79 28 24 78 29 0a 20 20 7d 0a 7d 0a 23  ntry($x).  }.}.#
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d  ---------..#----
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 0a 23 20 50 72 6f 63 20 74 6f 20  -----.# Proc to 
0f00: 63 6f 6d 70 61 72 65 20 64 61 74 61 62 61 73 65  compare database
0f10: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 74 68   content with th
0f20: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
0f30: 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 23 0a 23 20  esentation..#.# 
0f40: 20 20 63 68 65 63 6b 64 62 0a 23 0a 70 72 6f 63    checkdb.#.proc
0f50: 20 63 68 65 63 6b 64 62 20 7b 7d 20 7b 0a 20 20   checkdb {} {.  
0f60: 73 65 74 20 6e 45 6e 74 72 79 20 5b 64 62 20 6f  set nEntry [db o
0f70: 6e 65 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  ne {SELECT count
0f80: 28 2a 29 20 46 52 4f 4d 20 74 31 7d 5d 0a 20 20  (*) FROM t1}].  
0f90: 73 65 74 20 6e 45 6e 74 72 79 32 20 5b 61 72 72  set nEntry2 [arr
0fa0: 61 79 20 73 69 7a 65 20 3a 3a 61 45 6e 74 72 79  ay size ::aEntry
0fb0: 5d 0a 20 20 69 66 20 7b 24 6e 45 6e 74 72 79 20  ].  if {$nEntry 
0fc0: 21 3d 20 24 6e 45 6e 74 72 79 32 7d 20 7b 0a 20  != $nEntry2} {. 
0fd0: 20 20 20 65 72 72 6f 72 20 22 24 6e 45 6e 74 72     error "$nEntr
0fe0: 79 20 65 6e 74 72 69 65 73 20 69 6e 20 64 61 74  y entries in dat
0ff0: 61 62 61 73 65 2c 20 24 6e 45 6e 74 72 79 32 20  abase, $nEntry2 
1000: 65 6e 74 72 69 65 73 20 69 6e 20 61 72 72 61 79  entries in array
1010: 22 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c 20  ".  }.  db eval 
1020: 7b 53 45 4c 45 43 54 20 78 2c 20 79 20 46 52 4f  {SELECT x, y FRO
1030: 4d 20 74 31 7d 20 7b 0a 20 20 20 20 69 66 20 7b  M t1} {.    if {
1040: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1050: 61 45 6e 74 72 79 28 24 78 29 5d 7d 20 7b 0a 20  aEntry($x)]} {. 
1060: 20 20 20 20 20 65 72 72 6f 72 20 22 45 6e 74 72       error "Entr
1070: 79 20 24 78 20 65 78 69 73 74 73 20 69 6e 20 64  y $x exists in d
1080: 61 74 61 62 61 73 65 2c 20 62 75 74 20 6e 6f 74  atabase, but not
1090: 20 69 6e 20 61 72 72 61 79 22 0a 20 20 20 20 7d   in array".    }
10a0: 0a 20 20 20 20 69 66 20 7b 24 3a 3a 61 45 6e 74  .    if {$::aEnt
10b0: 72 79 28 24 78 29 20 6e 65 20 24 79 7d 20 7b 0a  ry($x) ne $y} {.
10c0: 20 20 20 20 20 20 65 72 72 6f 72 20 22 45 6e 74        error "Ent
10d0: 72 79 20 24 78 20 69 73 20 73 65 74 20 74 6f 20  ry $x is set to 
10e0: 7b 24 79 7d 20 69 6e 20 64 61 74 61 62 61 73 65  {$y} in database
10f0: 2c 20 7b 24 3a 3a 61 45 6e 74 72 79 28 24 78 29  , {$::aEntry($x)
1100: 7d 20 69 6e 20 61 72 72 61 79 22 0a 20 20 20 20  } in array".    
1110: 7d 0a 20 20 7d 0a 0a 20 20 64 62 20 65 76 61 6c  }.  }..  db eval
1120: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
1130: 69 74 79 5f 63 68 65 63 6b 20 7d 0a 7d 0a 23 2d  ity_check }.}.#-
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 2d 2d 2d 2d 2d  --------..#-----
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 0a 23 20 50 72 6f 63 20 74 6f 20 72  ----.# Proc to r
11e0: 65 74 75 72 6e 20 72 61 6e 64 6f 6d 20 73 65 74  eturn random set
11f0: 20 6f 66 20 78 20 76 61 6c 75 65 73 2e 0a 23 0a   of x values..#.
1200: 23 20 20 20 72 61 6e 64 6f 6d 5f 69 6e 74 65 67  #   random_integ
1210: 65 72 73 0a 23 0a 70 72 6f 63 20 72 61 6e 64 6f  ers.#.proc rando
1220: 6d 5f 69 6e 74 65 67 65 72 73 20 7b 6e 52 65 73  m_integers {nRes
1230: 20 6e 52 61 6e 67 65 7d 20 7b 0a 20 20 73 65 74   nRange} {.  set
1240: 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 66 6f   ret [list].  fo
1250: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c  r {set i 0} {$i<
1260: 24 6e 52 65 73 7d 20 7b 69 6e 63 72 20 69 7d 20  $nRes} {incr i} 
1270: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  {.    lappend re
1280: 74 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64  t [expr int(rand
1290: 28 29 2a 24 6e 52 61 6e 67 65 29 5d 0a 20 20 7d  ()*$nRange)].  }
12a0: 0a 20 20 72 65 74 75 72 6e 20 24 72 65 74 0a 7d  .  return $ret.}
12b0: 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   .#-------------
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 0a 0a 73 65  ------------..se
1300: 74 20 3a 3a 64 65 62 75 67 5f 6f 70 20 30 0a 70  t ::debug_op 0.p
1310: 72 6f 63 20 64 65 62 75 67 5f 6f 70 73 20 7b 7d  roc debug_ops {}
1320: 20 7b 0a 20 20 73 65 74 20 3a 3a 64 65 62 75 67   {.  set ::debug
1330: 5f 6f 70 20 31 0a 7d 0a 0a 70 72 6f 63 20 64 61  _op 1.}..proc da
1340: 74 61 62 61 73 65 5f 6f 70 20 7b 7d 20 7b 0a 20  tabase_op {} {. 
1350: 20 73 65 74 20 69 20 5b 65 78 70 72 20 69 6e 74   set i [expr int
1360: 28 72 61 6e 64 28 29 2a 32 29 5d 20 0a 20 20 69  (rand()*2)] .  i
1370: 66 20 7b 24 69 3d 3d 30 7d 20 7b 0a 20 20 20 20  f {$i==0} {.    
1380: 69 6e 73 65 72 74 5f 72 6f 77 73 20 5b 72 61 6e  insert_rows [ran
1390: 64 6f 6d 5f 69 6e 74 65 67 65 72 73 20 31 30 30  dom_integers 100
13a0: 20 31 30 30 30 5d 0a 20 20 7d 0a 20 20 69 66 20   1000].  }.  if 
13b0: 7b 24 69 3d 3d 31 7d 20 7b 0a 20 20 20 20 64 65  {$i==1} {.    de
13c0: 6c 65 74 65 5f 72 6f 77 73 20 5b 72 61 6e 64 6f  lete_rows [rando
13d0: 6d 5f 69 6e 74 65 67 65 72 73 20 31 30 30 20 31  m_integers 100 1
13e0: 30 30 30 5d 0a 20 20 20 20 73 65 74 20 69 20 5b  000].    set i [
13f0: 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28 29 2a  expr int(rand()*
1400: 33 29 5d 20 0a 20 20 20 20 69 66 20 7b 24 69 3d  3)] .    if {$i=
1410: 3d 30 7d 20 7b 0a 20 20 20 20 20 20 73 71 6c 20  =0} {.      sql 
1420: 7b 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e  {PRAGMA incremen
1430: 74 61 6c 5f 76 61 63 75 75 6d 7d 0a 20 20 20 20  tal_vacuum}.    
1440: 7d 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 73 61  }.  }.}..proc sa
1450: 76 65 70 6f 69 6e 74 5f 6f 70 20 7b 7d 20 7b 0a  vepoint_op {} {.
1460: 20 20 73 65 74 20 6e 61 6d 65 73 20 7b 6f 6e 65    set names {one
1470: 20 74 77 6f 20 74 68 72 65 65 20 66 6f 75 72 20   two three four 
1480: 66 69 76 65 7d 0a 20 20 73 65 74 20 63 6d 64 73  five}.  set cmds
1490: 20 20 7b 73 61 76 65 70 6f 69 6e 74 20 73 61 76    {savepoint sav
14a0: 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74  epoint savepoint
14b0: 20 73 61 76 65 70 6f 69 6e 74 20 72 65 6c 65 61   savepoint relea
14c0: 73 65 20 72 6f 6c 6c 62 61 63 6b 7d 0a 0a 20 20  se rollback}..  
14d0: 73 65 74 20 43 20 5b 6c 69 6e 64 65 78 20 24 63  set C [lindex $c
14e0: 6d 64 73 20 5b 65 78 70 72 20 69 6e 74 28 72 61  mds [expr int(ra
14f0: 6e 64 28 29 2a 36 29 5d 5d 0a 20 20 73 65 74 20  nd()*6)]].  set 
1500: 4e 20 5b 6c 69 6e 64 65 78 20 24 6e 61 6d 65 73  N [lindex $names
1510: 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28   [expr int(rand(
1520: 29 2a 35 29 5d 5d 0a 0a 20 20 24 43 20 24 4e 0a  )*5)]]..  $C $N.
1530: 20 20 72 65 74 75 72 6e 20 6f 6b 0a 7d 0a 0a 65    return ok.}..e
1540: 78 70 72 20 73 72 61 6e 64 28 30 29 0a 0a 23 23  xpr srand(0)..##
1550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1590: 23 23 23 23 23 23 23 23 23 23 0a 23 23 23 23 23  ##########.#####
15a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15e0: 23 23 23 23 23 23 23 0a 23 20 53 74 61 72 74 20  #######.# Start 
15f0: 6f 66 20 74 65 73 74 20 63 61 73 65 73 2e 0a 0a  of test cases...
1600: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
1610: 74 36 2d 31 2e 31 20 7b 0a 20 20 73 71 6c 20 24  t6-1.1 {.  sql $
1620: 44 41 54 41 42 41 53 45 5f 53 43 48 45 4d 41 0a  DATABASE_SCHEMA.
1630: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 61 76  } {}.do_test sav
1640: 65 70 6f 69 6e 74 36 2d 31 2e 32 20 7b 0a 20 20  epoint6-1.2 {.  
1650: 69 6e 73 65 72 74 5f 72 6f 77 73 20 7b 0a 20 20  insert_rows {.  
1660: 20 20 34 39 37 20 31 36 36 20 32 33 30 20 33 35    497 166 230 35
1670: 35 20 37 37 39 20 35 38 38 20 33 39 34 20 33 31  5 779 588 394 31
1680: 37 20 32 39 30 20 34 37 35 20 33 36 32 20 31 39  7 290 475 362 19
1690: 33 20 38 30 35 20 38 35 31 20 35 36 34 20 0a 20  3 805 851 564 . 
16a0: 20 20 20 37 36 33 20 34 34 20 39 33 30 20 33 38     763 44 930 38
16b0: 39 20 38 31 39 20 37 36 35 20 37 36 30 20 39 36  9 819 765 760 96
16c0: 36 20 32 38 30 20 35 33 38 20 34 31 34 20 35 30  6 280 538 414 50
16d0: 30 20 31 38 20 32 35 20 32 38 37 20 33 32 30 20  0 18 25 287 320 
16e0: 0a 20 20 20 20 33 30 20 33 38 32 20 37 35 31 20  .    30 382 751 
16f0: 38 37 20 32 38 33 20 39 38 31 20 34 32 39 20 36  87 283 981 429 6
1700: 33 30 20 39 37 34 20 34 32 31 20 32 37 30 20 38  30 974 421 270 8
1710: 31 30 20 34 30 35 20 0a 20 20 7d 0a 0a 20 20 73  10 405 .  }..  s
1720: 61 76 65 70 6f 69 6e 74 20 6f 6e 65 0a 20 20 69  avepoint one.  i
1730: 6e 73 65 72 74 5f 72 6f 77 73 20 38 35 38 0a 20  nsert_rows 858. 
1740: 20 64 65 6c 65 74 65 5f 72 6f 77 73 20 39 33 30   delete_rows 930
1750: 0a 20 20 73 61 76 65 70 6f 69 6e 74 20 74 77 6f  .  savepoint two
1760: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 50 52  .    execsql {PR
1770: 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c  AGMA incremental
1780: 5f 76 61 63 75 75 6d 7d 0a 20 20 20 20 73 61 76  _vacuum}.    sav
1790: 65 70 6f 69 6e 74 20 74 68 72 65 65 0a 20 20 20  epoint three.   
17a0: 20 20 20 69 6e 73 65 72 74 5f 72 6f 77 73 20 31     insert_rows 1
17b0: 34 34 0a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  44.     rollback
17c0: 20 74 68 72 65 65 0a 20 20 20 20 72 6f 6c 6c 62   three.    rollb
17d0: 61 63 6b 20 74 77 6f 0a 20 20 72 65 6c 65 61 73  ack two.  releas
17e0: 65 20 6f 6e 65 0a 0a 20 20 65 78 65 63 73 71 6c  e one..  execsql
17f0: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
1800: 29 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 7b 34 34  ) FROM t1}.} {44
1810: 7d 0a 0a 66 6f 72 65 61 63 68 20 7a 53 65 74 75  }..foreach zSetu
1820: 70 20 5b 6c 69 73 74 20 7b 0a 20 20 73 65 74 20  p [list {.  set 
1830: 74 65 73 74 6e 61 6d 65 20 6e 6f 72 6d 61 6c 0a  testname normal.
1840: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
1850: 74 2e 64 62 0a 7d 20 7b 0a 20 20 69 66 20 7b 5b  t.db.} {.  if {[
1860: 77 61 6c 5f 69 73 5f 77 61 6c 5f 6d 6f 64 65 5d  wal_is_wal_mode]
1870: 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 73 65 74  } continue.  set
1880: 20 74 65 73 74 6e 61 6d 65 20 74 65 6d 70 64 62   testname tempdb
1890: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 22 22  .  sqlite3 db ""
18a0: 0a 7d 20 7b 0a 20 20 69 66 20 7b 5b 70 65 72 6d  .} {.  if {[perm
18b0: 75 74 61 74 69 6f 6e 5d 20 65 71 20 22 6a 6f 75  utation] eq "jou
18c0: 72 6e 61 6c 74 65 73 74 22 7d 20 7b 0a 20 20 20  rnaltest"} {.   
18d0: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 7d 0a 20 20   continue.  }.  
18e0: 73 65 74 20 74 65 73 74 6e 61 6d 65 20 6e 6f 73  set testname nos
18f0: 79 6e 63 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ync.  sqlite3 db
1900: 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 20 7b   test.db.  sql {
1910: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
1920: 6f 75 73 20 3d 20 6f 66 66 20 7d 0a 7d 20 7b 0a  ous = off }.} {.
1930: 20 20 73 65 74 20 74 65 73 74 6e 61 6d 65 20 73    set testname s
1940: 6d 61 6c 6c 63 61 63 68 65 0a 20 20 73 71 6c 69  mallcache.  sqli
1950: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
1960: 20 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61   sql { PRAGMA ca
1970: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
1980: 7d 5d 20 7b 0a 0a 20 20 75 6e 73 65 74 20 2d 6e  }] {..  unset -n
1990: 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 6c 53 61 76  ocomplain ::lSav
19a0: 65 70 6f 69 6e 74 0a 20 20 75 6e 73 65 74 20 2d  epoint.  unset -
19b0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 61 45 6e  nocomplain ::aEn
19c0: 74 72 79 0a 0a 20 20 63 61 74 63 68 20 7b 20 64  try..  catch { d
19d0: 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f 72 63  b close }.  forc
19e0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
19f0: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
1a00: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 65 76  .db-journal.  ev
1a10: 61 6c 20 24 7a 53 65 74 75 70 0a 20 20 73 71 6c  al $zSetup.  sql
1a20: 20 24 44 41 54 41 42 41 53 45 5f 53 43 48 45 4d   $DATABASE_SCHEM
1a30: 41 0a 0a 20 20 77 61 6c 5f 73 65 74 5f 6a 6f 75  A..  wal_set_jou
1a40: 72 6e 61 6c 5f 6d 6f 64 65 0a 0a 20 20 64 6f 5f  rnal_mode..  do_
1a50: 74 65 73 74 20 73 61 76 65 70 6f 69 6e 74 36 2d  test savepoint6-
1a60: 24 74 65 73 74 6e 61 6d 65 2e 73 65 74 75 70 20  $testname.setup 
1a70: 7b 0a 20 20 20 20 73 61 76 65 70 6f 69 6e 74 20  {.    savepoint 
1a80: 6f 6e 65 0a 20 20 20 20 69 6e 73 65 72 74 5f 72  one.    insert_r
1a90: 6f 77 73 20 5b 72 61 6e 64 6f 6d 5f 69 6e 74 65  ows [random_inte
1aa0: 67 65 72 73 20 31 30 30 20 31 30 30 30 5d 0a 20  gers 100 1000]. 
1ab0: 20 20 20 72 65 6c 65 61 73 65 20 6f 6e 65 0a 20     release one. 
1ac0: 20 20 20 63 68 65 63 6b 64 62 0a 20 20 7d 20 7b     checkdb.  } {
1ad0: 6f 6b 7d 0a 20 20 0a 20 20 66 6f 72 20 7b 73 65  ok}.  .  for {se
1ae0: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 3a 3a  t i 0} {$i < $::
1af0: 47 28 73 61 76 65 70 6f 69 6e 74 36 5f 69 74 65  G(savepoint6_ite
1b00: 72 61 74 69 6f 6e 73 29 7d 20 7b 69 6e 63 72 20  rations)} {incr 
1b10: 69 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  i} {.    do_test
1b20: 20 73 61 76 65 70 6f 69 6e 74 36 2d 24 74 65 73   savepoint6-$tes
1b30: 74 6e 61 6d 65 2e 24 69 2e 31 20 7b 0a 20 20 20  tname.$i.1 {.   
1b40: 20 20 20 73 61 76 65 70 6f 69 6e 74 5f 6f 70 0a     savepoint_op.
1b50: 20 20 20 20 20 20 63 68 65 63 6b 64 62 0a 20 20        checkdb.  
1b60: 20 20 7d 20 7b 6f 6b 7d 0a 20 20 0a 20 20 20 20    } {ok}.  .    
1b70: 64 6f 5f 74 65 73 74 20 73 61 76 65 70 6f 69 6e  do_test savepoin
1b80: 74 36 2d 24 74 65 73 74 6e 61 6d 65 2e 24 69 2e  t6-$testname.$i.
1b90: 32 20 7b 0a 20 20 20 20 20 20 64 61 74 61 62 61  2 {.      databa
1ba0: 73 65 5f 6f 70 0a 20 20 20 20 20 20 64 61 74 61  se_op.      data
1bb0: 62 61 73 65 5f 6f 70 0a 20 20 20 20 20 20 63 68  base_op.      ch
1bc0: 65 63 6b 64 62 0a 20 20 20 20 7d 20 7b 6f 6b 7d  eckdb.    } {ok}
1bd0: 0a 20 20 7d 0a 0a 20 20 77 61 6c 5f 63 68 65 63  .  }..  wal_chec
1be0: 6b 5f 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73  k_journal_mode s
1bf0: 61 76 65 70 6f 69 6e 74 36 2d 24 74 65 73 74 6e  avepoint6-$testn
1c00: 61 6d 65 2e 77 61 6c 6f 6b 0a 7d 0a 0a 75 6e 73  ame.walok.}..uns
1c10: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a  et -nocomplain :
1c20: 3a 6c 53 61 76 65 70 6f 69 6e 74 0a 75 6e 73 65  :lSavepoint.unse
1c30: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a  t -nocomplain ::
1c40: 61 45 6e 74 72 79 0a 0a 66 69 6e 69 73 68 5f 74  aEntry..finish_t
1c50: 65 73 74 0a                                      est.