/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f:


0000: 23 20 32 30 30 38 20 4a 75 6e 65 20 39 0a 23 0a  # 2008 June 9.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 0a 23 20 54 65 73 74 20 74 68 61  ***.#.# Test tha
0170: 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  t it is possible
0180: 20 74 6f 20 68 61 76 65 20 74 77 6f 20 6f 70 65   to have two ope
0190: 6e 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73 20 6f  n blob handles o
01a0: 6e 20 61 20 73 69 6e 67 6c 65 0a 23 20 62 6c 6f  n a single.# blo
01b0: 62 20 6f 62 6a 65 63 74 2e 0a 23 0a 23 20 24 49  b object..#.# $I
01c0: 64 3a 20 69 6e 63 72 62 6c 6f 62 32 2e 74 65 73  d: incrblob2.tes
01d0: 74 2c 76 20 31 2e 31 31 20 32 30 30 39 2f 30 36  t,v 1.11 2009/06
01e0: 2f 32 39 20 30 36 3a 30 30 3a 33 37 20 64 61 6e  /29 06:00:37 dan
01f0: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 23  ielk1977 Exp $.#
0200: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0210: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0220: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0230: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
0240: 69 66 63 61 70 61 62 6c 65 20 7b 21 61 75 74 6f  ifcapable {!auto
0250: 76 61 63 75 75 6d 20 7c 7c 20 21 70 72 61 67 6d  vacuum || !pragm
0260: 61 20 7c 7c 20 21 69 6e 63 72 62 6c 6f 62 7d 20  a || !incrblob} 
0270: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  {.  finish_test.
0280: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 74    return.}..do_t
0290: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e  est incrblob2-1.
02a0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
02b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
02c0: 20 62 6c 6f 62 73 28 69 64 20 49 4e 54 45 47 45   blobs(id INTEGE
02d0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64  R PRIMARY KEY, d
02e0: 61 74 61 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49  ata BLOB);.    I
02f0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f 62 73  NSERT INTO blobs
0300: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 7a 65   VALUES(NULL, ze
0310: 72 6f 62 6c 6f 62 28 35 30 30 30 29 29 3b 0a 20  roblob(5000));. 
0320: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
0330: 6c 6f 62 73 20 56 41 4c 55 45 53 28 4e 55 4c 4c  lobs VALUES(NULL
0340: 2c 20 7a 65 72 6f 62 6c 6f 62 28 35 30 30 30 29  , zeroblob(5000)
0350: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0360: 54 4f 20 62 6c 6f 62 73 20 56 41 4c 55 45 53 28  TO blobs VALUES(
0370: 4e 55 4c 4c 2c 20 7a 65 72 6f 62 6c 6f 62 28 35  NULL, zeroblob(5
0380: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
0390: 54 20 49 4e 54 4f 20 62 6c 6f 62 73 20 56 41 4c  T INTO blobs VAL
03a0: 55 45 53 28 4e 55 4c 4c 2c 20 7a 65 72 6f 62 6c  UES(NULL, zerobl
03b0: 6f 62 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 7d  ob(5000));.  }.}
03c0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 69 4f 66   {}..foreach iOf
03d0: 66 73 65 74 20 5b 6c 69 73 74 20 30 20 32 35 36  fset [list 0 256
03e0: 20 34 30 39 34 5d 20 7b 0a 20 20 64 6f 5f 74 65   4094] {.  do_te
03f0: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e 24  st incrblob2-1.$
0400: 69 4f 66 66 73 65 74 2e 31 20 7b 0a 20 20 20 20  iOffset.1 {.    
0410: 73 65 74 20 66 64 20 5b 64 62 20 69 6e 63 72 62  set fd [db incrb
0420: 6c 6f 62 20 62 6c 6f 62 73 20 64 61 74 61 20 31  lob blobs data 1
0430: 5d 0a 20 20 20 20 70 75 74 73 20 24 66 64 20 22  ].    puts $fd "
0440: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78  [string repeat x
0450: 20 24 69 4f 66 66 73 65 74 5d 53 51 4c 69 74 65   $iOffset]SQLite
0460: 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 22 0a   version 3.6.0".
0470: 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20      close $fd.  
0480: 7d 20 7b 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73  } {}.  .  do_tes
0490: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e 24 69  t incrblob2-1.$i
04a0: 4f 66 66 73 65 74 2e 32 20 7b 0a 20 20 20 20 73  Offset.2 {.    s
04b0: 65 74 20 66 64 31 20 5b 64 62 20 69 6e 63 72 62  et fd1 [db incrb
04c0: 6c 6f 62 20 62 6c 6f 62 73 20 64 61 74 61 20 31  lob blobs data 1
04d0: 5d 0a 20 20 20 20 73 65 74 20 66 64 32 20 5b 64  ].    set fd2 [d
04e0: 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73  b incrblob blobs
04f0: 20 64 61 74 61 20 31 5d 0a 20 20 20 20 66 63 6f   data 1].    fco
0500: 6e 66 69 67 75 72 65 20 24 66 64 31 20 2d 62 75  nfigure $fd1 -bu
0510: 66 66 65 72 69 6e 67 20 6e 6f 6e 65 0a 20 20 20  ffering none.   
0520: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64 32   fconfigure $fd2
0530: 20 2d 62 75 66 66 65 72 69 6e 67 20 6e 6f 6e 65   -buffering none
0540: 0a 20 20 20 20 69 66 20 7b 24 69 4f 66 66 73 65  .    if {$iOffse
0550: 74 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20  t != 0} {.      
0560: 73 65 65 6b 20 24 66 64 32 20 24 69 4f 66 66 73  seek $fd2 $iOffs
0570: 65 74 20 73 74 61 72 74 0a 20 20 20 20 20 20 73  et start.      s
0580: 65 65 6b 20 24 66 64 31 20 24 69 4f 66 66 73 65  eek $fd1 $iOffse
0590: 74 20 73 74 61 72 74 0a 20 20 20 20 7d 0a 20 20  t start.    }.  
05a0: 20 20 72 65 61 64 20 24 66 64 31 20 36 0a 20 20    read $fd1 6.  
05b0: 7d 20 7b 53 51 4c 69 74 65 7d 0a 20 20 0a 20 20  } {SQLite}.  .  
05c0: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
05d0: 32 2d 31 2e 24 69 4f 66 66 73 65 74 2e 33 20 7b  2-1.$iOffset.3 {
05e0: 0a 20 20 20 20 72 65 61 64 20 24 66 64 32 20 36  .    read $fd2 6
05f0: 0a 20 20 7d 20 7b 53 51 4c 69 74 65 7d 0a 20 20  .  } {SQLite}.  
0600: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .  do_test incrb
0610: 6c 6f 62 32 2d 31 2e 24 69 4f 66 66 73 65 74 2e  lob2-1.$iOffset.
0620: 34 20 7b 0a 20 20 20 20 73 65 65 6b 20 24 66 64  4 {.    seek $fd
0630: 32 20 24 69 4f 66 66 73 65 74 20 73 74 61 72 74  2 $iOffset start
0640: 0a 20 20 20 20 73 65 65 6b 20 24 66 64 31 20 24  .    seek $fd1 $
0650: 69 4f 66 66 73 65 74 20 73 74 61 72 74 0a 20 20  iOffset start.  
0660: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
0670: 65 20 24 66 64 32 20 22 65 74 69 4c 51 53 22 0a  e $fd2 "etiLQS".
0680: 20 20 7d 20 7b 7d 0a 0a 20 20 0a 20 20 64 6f 5f    } {}..  .  do_
0690: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31  test incrblob2-1
06a0: 2e 24 69 4f 66 66 73 65 74 2e 35 20 7b 0a 20 20  .$iOffset.5 {.  
06b0: 20 20 73 65 65 6b 20 24 66 64 31 20 24 69 4f 66    seek $fd1 $iOf
06c0: 66 73 65 74 20 73 74 61 72 74 0a 20 20 20 20 72  fset start.    r
06d0: 65 61 64 20 24 66 64 31 20 36 0a 20 20 7d 20 7b  ead $fd1 6.  } {
06e0: 65 74 69 4c 51 53 7d 0a 20 20 0a 20 20 64 6f 5f  etiLQS}.  .  do_
06f0: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31  test incrblob2-1
0700: 2e 24 69 4f 66 66 73 65 74 2e 36 20 7b 0a 20 20  .$iOffset.6 {.  
0710: 20 20 73 65 65 6b 20 24 66 64 32 20 24 69 4f 66    seek $fd2 $iOf
0720: 66 73 65 74 20 73 74 61 72 74 0a 20 20 20 20 72  fset start.    r
0730: 65 61 64 20 24 66 64 32 20 36 0a 20 20 7d 20 7b  ead $fd2 6.  } {
0740: 65 74 69 4c 51 53 7d 0a 20 20 0a 20 20 64 6f 5f  etiLQS}.  .  do_
0750: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31  test incrblob2-1
0760: 2e 24 69 4f 66 66 73 65 74 2e 37 20 7b 0a 20 20  .$iOffset.7 {.  
0770: 20 20 73 65 65 6b 20 24 66 64 31 20 24 69 4f 66    seek $fd1 $iOf
0780: 66 73 65 74 20 73 74 61 72 74 0a 20 20 20 20 72  fset start.    r
0790: 65 61 64 20 24 66 64 31 20 36 0a 20 20 7d 20 7b  ead $fd1 6.  } {
07a0: 65 74 69 4c 51 53 7d 0a 20 20 0a 20 20 64 6f 5f  etiLQS}.  .  do_
07b0: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31  test incrblob2-1
07c0: 2e 24 69 4f 66 66 73 65 74 2e 38 20 7b 0a 20 20  .$iOffset.8 {.  
07d0: 20 20 63 6c 6f 73 65 20 24 66 64 31 0a 20 20 20    close $fd1.   
07e0: 20 63 6c 6f 73 65 20 24 66 64 32 0a 20 20 7d 20   close $fd2.  } 
07f0: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0840: 2d 0a 0a 66 6f 72 65 61 63 68 20 69 4f 66 66 73  -..foreach iOffs
0850: 65 74 20 5b 6c 69 73 74 20 30 20 32 35 36 20 34  et [list 0 256 4
0860: 30 39 34 5d 20 7b 0a 0a 20 20 64 6f 5f 74 65 73  094] {..  do_tes
0870: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 32 2e 24 69  t incrblob2-2.$i
0880: 4f 66 66 73 65 74 2e 31 20 7b 0a 20 20 20 20 73  Offset.1 {.    s
0890: 65 74 20 66 64 31 20 5b 64 62 20 69 6e 63 72 62  et fd1 [db incrb
08a0: 6c 6f 62 20 62 6c 6f 62 73 20 64 61 74 61 20 31  lob blobs data 1
08b0: 5d 0a 20 20 20 20 73 65 65 6b 20 24 66 64 31 20  ].    seek $fd1 
08c0: 5b 65 78 70 72 20 24 69 4f 66 66 73 65 74 20 2d  [expr $iOffset -
08d0: 20 35 30 30 30 5d 20 65 6e 64 0a 20 20 20 20 66   5000] end.    f
08e0: 63 6f 6e 66 69 67 75 72 65 20 24 66 64 31 20 2d  configure $fd1 -
08f0: 62 75 66 66 65 72 69 6e 67 20 6e 6f 6e 65 0a 0a  buffering none..
0900: 20 20 20 20 73 65 74 20 66 64 32 20 5b 64 62 20      set fd2 [db 
0910: 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 64  incrblob blobs d
0920: 61 74 61 20 31 5d 0a 20 20 20 20 73 65 65 6b 20  ata 1].    seek 
0930: 24 66 64 32 20 5b 65 78 70 72 20 24 69 4f 66 66  $fd2 [expr $iOff
0940: 73 65 74 20 2d 20 35 30 30 30 5d 20 65 6e 64 0a  set - 5000] end.
0950: 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24      fconfigure $
0960: 66 64 32 20 2d 62 75 66 66 65 72 69 6e 67 20 6e  fd2 -buffering n
0970: 6f 6e 65 0a 0a 20 20 20 20 70 75 74 73 20 2d 6e  one..    puts -n
0980: 6f 6e 65 77 6c 69 6e 65 20 24 66 64 31 20 22 31  onewline $fd1 "1
0990: 32 33 34 35 36 22 0a 20 20 7d 20 7b 7d 0a 20 20  23456".  } {}.  
09a0: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .  do_test incrb
09b0: 6c 6f 62 32 2d 32 2e 24 69 4f 66 66 73 65 74 2e  lob2-2.$iOffset.
09c0: 32 20 7b 0a 20 20 20 20 72 65 61 64 20 24 66 64  2 {.    read $fd
09d0: 32 20 36 0a 20 20 7d 20 7b 31 32 33 34 35 36 7d  2 6.  } {123456}
09e0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72  ..  do_test incr
09f0: 62 6c 6f 62 32 2d 32 2e 24 69 4f 66 66 73 65 74  blob2-2.$iOffset
0a00: 2e 33 20 7b 0a 20 20 20 20 63 6c 6f 73 65 20 24  .3 {.    close $
0a10: 66 64 31 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  fd1.    close $f
0a20: 64 32 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f  d2.  } {}.}..do_
0a30: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 33  test incrblob2-3
0a40: 2e 31 20 7b 0a 20 20 73 65 74 20 66 64 31 20 5b  .1 {.  set fd1 [
0a50: 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62  db incrblob blob
0a60: 73 20 64 61 74 61 20 31 5d 0a 20 20 66 63 6f 6e  s data 1].  fcon
0a70: 66 69 67 75 72 65 20 24 66 64 31 20 2d 62 75 66  figure $fd1 -buf
0a80: 66 65 72 69 6e 67 20 6e 6f 6e 65 0a 7d 20 7b 7d  fering none.} {}
0a90: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
0aa0: 62 32 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63 73  b2-3.2 {.  execs
0ab0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
0ac0: 49 4e 54 4f 20 62 6c 6f 62 73 20 56 41 4c 55 45  INTO blobs VALUE
0ad0: 53 28 35 2c 20 7a 65 72 6f 62 6c 6f 62 28 31 30  S(5, zeroblob(10
0ae0: 32 34 30 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  240));.  }.} {}.
0af0: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
0b00: 32 2d 33 2e 33 20 7b 0a 20 20 73 65 74 20 72 63  2-3.3 {.  set rc
0b10: 20 5b 63 61 74 63 68 20 7b 20 72 65 61 64 20 24   [catch { read $
0b20: 66 64 31 20 36 20 7d 20 6d 73 67 5d 0a 20 20 6c  fd1 6 } msg].  l
0b30: 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b  ist $rc $msg.} {
0b40: 30 20 31 32 33 34 35 36 7d 0a 64 6f 5f 74 65 73  0 123456}.do_tes
0b50: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 33 2e 34 20  t incrblob2-3.4 
0b60: 7b 0a 20 20 63 6c 6f 73 65 20 24 66 64 31 0a 7d  {.  close $fd1.}
0b70: 20 7b 7d 0a 0a 23 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 2d 2d 2d  ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bc0: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
0bd0: 20 74 65 73 74 73 20 2d 20 69 6e 63 72 62 6c 6f   tests - incrblo
0be0: 62 32 2d 34 2e 2a 20 2d 20 74 65 73 74 20 74 68  b2-4.* - test th
0bf0: 61 74 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73 20  at blob handles 
0c00: 61 72 65 20 0a 23 20 69 6e 76 61 6c 69 64 61 74  are .# invalidat
0c10: 65 64 20 61 74 20 74 68 65 20 63 6f 72 72 65 63  ed at the correc
0c20: 74 20 74 69 6d 65 73 2e 0a 23 0a 64 6f 5f 74 65  t times..#.do_te
0c30: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e 31  st incrblob2-4.1
0c40: 20 7b 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f   {.  unset -noco
0c50: 6d 70 6c 61 69 6e 20 64 61 74 61 0a 20 20 64 62  mplain data.  db
0c60: 20 65 76 61 6c 20 42 45 47 49 4e 0a 20 20 64 62   eval BEGIN.  db
0c70: 20 65 76 61 6c 20 7b 20 43 52 45 41 54 45 20 54   eval { CREATE T
0c80: 41 42 4c 45 20 74 31 28 69 64 20 49 4e 54 45 47  ABLE t1(id INTEG
0c90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
0ca0: 64 61 74 61 20 42 4c 4f 42 29 3b 20 7d 0a 20 20  data BLOB); }.  
0cb0: 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b  for {set ii 1} {
0cc0: 24 69 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72  $ii < 100} {incr
0cd0: 20 69 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 64   ii} {.    set d
0ce0: 61 74 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65  ata [string repe
0cf0: 61 74 20 22 62 6c 6f 62 24 69 69 22 20 35 30 30  at "blob$ii" 500
0d00: 5d 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20  ].    db eval { 
0d10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0d20: 41 4c 55 45 53 28 24 69 69 2c 20 24 64 61 74 61  ALUES($ii, $data
0d30: 29 20 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61  ) }.  }.  db eva
0d40: 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 70  l COMMIT.} {}..p
0d50: 72 6f 63 20 61 62 6f 72 74 65 64 5f 68 61 6e 64  roc aborted_hand
0d60: 6c 65 73 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61  les {} {.  globa
0d70: 6c 20 68 61 6e 64 6c 65 73 0a 0a 20 20 73 65 74  l handles..  set
0d80: 20 61 62 6f 72 74 65 64 20 7b 7d 0a 20 20 66 6f   aborted {}.  fo
0d90: 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69  r {set ii 1} {$i
0da0: 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69  i < 100} {incr i
0db0: 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 74 72  i} {.    set str
0dc0: 20 22 62 6c 6f 62 24 69 69 22 0a 20 20 20 20 73   "blob$ii".    s
0dd0: 65 74 20 6e 42 79 74 65 20 5b 73 74 72 69 6e 67  et nByte [string
0de0: 20 6c 65 6e 67 74 68 20 24 73 74 72 5d 0a 20 20   length $str].  
0df0: 20 20 73 65 74 20 69 4f 66 66 73 65 74 20 5b 65    set iOffset [e
0e00: 78 70 72 20 24 6e 42 79 74 65 20 2a 20 24 69 69  xpr $nByte * $ii
0e10: 20 2a 20 32 5d 0a 0a 20 20 20 20 73 65 74 20 72   * 2]..    set r
0e20: 63 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65  c [catch {sqlite
0e30: 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24 68 61 6e  3_blob_read $han
0e40: 64 6c 65 73 28 24 69 69 29 20 24 69 4f 66 66 73  dles($ii) $iOffs
0e50: 65 74 20 24 6e 42 79 74 65 7d 20 6d 73 67 5d 0a  et $nByte} msg].
0e60: 20 20 20 20 69 66 20 7b 24 72 63 20 26 26 20 24      if {$rc && $
0e70: 6d 73 67 20 65 71 20 22 53 51 4c 49 54 45 5f 41  msg eq "SQLITE_A
0e80: 42 4f 52 54 22 7d 20 7b 0a 20 20 20 20 20 20 6c  BORT"} {.      l
0e90: 61 70 70 65 6e 64 20 61 62 6f 72 74 65 64 20 24  append aborted $
0ea0: 69 69 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ii.    } else {.
0eb0: 20 20 20 20 20 20 69 66 20 7b 24 72 63 20 7c 7c        if {$rc ||
0ec0: 20 24 6d 73 67 20 6e 65 20 24 73 74 72 7d 20 7b   $msg ne $str} {
0ed0: 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22  .        error "
0ee0: 62 6c 6f 62 20 24 69 69 3a 20 24 6d 73 67 22 0a  blob $ii: $msg".
0ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0f00: 7d 0a 20 20 73 65 74 20 61 62 6f 72 74 65 64 0a  }.  set aborted.
0f10: 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  }..do_test incrb
0f20: 6c 6f 62 32 2d 34 2e 32 20 7b 0a 20 20 66 6f 72  lob2-4.2 {.  for
0f30: 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69   {set ii 1} {$ii
0f40: 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 69   < 100} {incr ii
0f50: 7d 20 7b 0a 20 20 20 20 73 65 74 20 68 61 6e 64  } {.    set hand
0f60: 6c 65 73 28 24 69 69 29 20 5b 64 62 20 69 6e 63  les($ii) [db inc
0f70: 72 62 6c 6f 62 20 74 31 20 64 61 74 61 20 24 69  rblob t1 data $i
0f80: 69 5d 0a 20 20 7d 0a 20 20 61 62 6f 72 74 65 64  i].  }.  aborted
0f90: 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 7d 0a 0a 23  _handles.} {}..#
0fa0: 20 55 70 64 61 74 65 20 72 6f 77 20 33 2e 20 54   Update row 3. T
0fb0: 68 69 73 20 73 68 6f 75 6c 64 20 61 62 6f 72 74  his should abort
0fc0: 20 68 61 6e 64 6c 65 20 33 20 62 75 74 20 6c 65   handle 3 but le
0fd0: 61 76 65 20 61 6c 6c 20 6f 74 68 65 72 73 20 75  ave all others u
0fe0: 6e 74 6f 75 63 68 65 64 2e 0a 23 0a 64 6f 5f 74  ntouched..#.do_t
0ff0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e  est incrblob2-4.
1000: 33 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 55  3 {.  db eval {U
1010: 50 44 41 54 45 20 74 31 20 53 45 54 20 64 61 74  PDATE t1 SET dat
1020: 61 20 3d 20 64 61 74 61 20 7c 7c 20 27 27 20 57  a = data || '' W
1030: 48 45 52 45 20 69 64 20 3d 20 33 7d 0a 20 20 61  HERE id = 3}.  a
1040: 62 6f 72 74 65 64 5f 68 61 6e 64 6c 65 73 0a 7d  borted_handles.}
1050: 20 7b 33 7d 0a 0a 23 20 54 65 73 74 20 74 68 61   {3}..# Test tha
1060: 74 20 61 20 77 72 69 74 65 20 74 6f 20 68 61 6e  t a write to han
1070: 64 6c 65 20 33 20 61 6c 73 6f 20 72 65 74 75 72  dle 3 also retur
1080: 6e 73 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e  ns SQLITE_ABORT.
1090: 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .#.do_test incrb
10a0: 6c 6f 62 32 2d 34 2e 33 2e 31 20 7b 0a 20 20 73  lob2-4.3.1 {.  s
10b0: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73 71  et rc [catch {sq
10c0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
10d0: 20 24 3a 3a 68 61 6e 64 6c 65 73 28 33 29 20 31   $::handles(3) 1
10e0: 30 20 48 45 4c 4c 4f 7d 20 6d 73 67 5d 0a 20 20  0 HELLO} msg].  
10f0: 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20  list $rc $msg.} 
1100: 7b 31 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 7d  {1 SQLITE_ABORT}
1110: 0a 0a 23 20 44 65 6c 65 74 65 20 72 6f 77 20 31  ..# Delete row 1
1120: 34 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61  4. This should a
1130: 62 6f 72 74 20 68 61 6e 64 6c 65 20 36 20 62 75  bort handle 6 bu
1140: 74 20 6c 65 61 76 65 20 61 6c 6c 20 6f 74 68 65  t leave all othe
1150: 72 73 20 75 6e 74 6f 75 63 68 65 64 2e 0a 23 0a  rs untouched..#.
1160: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
1170: 32 2d 34 2e 34 20 7b 0a 20 20 64 62 20 65 76 61  2-4.4 {.  db eva
1180: 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  l {DELETE FROM t
1190: 31 20 57 48 45 52 45 20 69 64 20 3d 20 31 34 7d  1 WHERE id = 14}
11a0: 0a 20 20 61 62 6f 72 74 65 64 5f 68 61 6e 64 6c  .  aborted_handl
11b0: 65 73 0a 7d 20 7b 33 20 31 34 7d 0a 0a 23 20 43  es.} {3 14}..# C
11c0: 68 61 6e 67 65 20 74 68 65 20 72 6f 77 69 64 20  hange the rowid 
11d0: 6f 66 20 72 6f 77 20 31 35 20 74 6f 20 31 30 32  of row 15 to 102
11e0: 2e 20 53 68 6f 75 6c 64 20 61 62 6f 72 74 20 68  . Should abort h
11f0: 61 6e 64 6c 65 20 31 35 2e 0a 23 0a 64 6f 5f 74  andle 15..#.do_t
1200: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e  est incrblob2-4.
1210: 35 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 55  5 {.  db eval {U
1220: 50 44 41 54 45 20 74 31 20 53 45 54 20 69 64 20  PDATE t1 SET id 
1230: 3d 20 31 30 32 20 57 48 45 52 45 20 69 64 20 3d  = 102 WHERE id =
1240: 20 31 35 7d 0a 20 20 61 62 6f 72 74 65 64 5f 68   15}.  aborted_h
1250: 61 6e 64 6c 65 73 0a 7d 20 7b 33 20 31 34 20 31  andles.} {3 14 1
1260: 35 7d 0a 0a 23 20 43 6c 6f 62 62 65 72 20 72 6f  5}..# Clobber ro
1270: 77 20 39 32 20 75 73 69 6e 67 20 49 4e 53 45 52  w 92 using INSER
1280: 54 20 4f 52 20 52 45 50 4c 41 43 45 2e 0a 23 0a  T OR REPLACE..#.
1290: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
12a0: 32 2d 34 2e 36 20 7b 0a 20 20 64 62 20 65 76 61  2-4.6 {.  db eva
12b0: 6c 20 7b 49 4e 53 45 52 54 20 4f 52 20 52 45 50  l {INSERT OR REP
12c0: 4c 41 43 45 20 49 4e 54 4f 20 74 31 20 56 41 4c  LACE INTO t1 VAL
12d0: 55 45 53 28 39 32 2c 20 7a 65 72 6f 62 6c 6f 62  UES(92, zeroblob
12e0: 28 31 30 30 30 29 29 7d 0a 20 20 61 62 6f 72 74  (1000))}.  abort
12f0: 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 33 20  ed_handles.} {3 
1300: 31 34 20 31 35 20 39 32 7d 0a 0a 23 20 43 6c 6f  14 15 92}..# Clo
1310: 62 62 65 72 20 72 6f 77 20 36 35 20 75 73 69 6e  bber row 65 usin
1320: 67 20 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c  g UPDATE OR REPL
1330: 41 43 45 20 6f 6e 20 72 6f 77 20 33 35 2e 20 54  ACE on row 35. T
1340: 68 69 73 20 73 68 6f 75 6c 64 20 61 62 6f 72 74  his should abort
1350: 20 0a 23 20 68 61 6e 64 6c 65 73 20 33 35 20 61   .# handles 35 a
1360: 6e 64 20 36 35 2e 0a 23 0a 64 6f 5f 74 65 73 74  nd 65..#.do_test
1370: 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e 37 20 7b   incrblob2-4.7 {
1380: 0a 20 20 64 62 20 65 76 61 6c 20 7b 55 50 44 41  .  db eval {UPDA
1390: 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 31  TE OR REPLACE t1
13a0: 20 53 45 54 20 69 64 20 3d 20 36 35 20 57 48 45   SET id = 65 WHE
13b0: 52 45 20 69 64 20 3d 20 33 35 7d 0a 20 20 61 62  RE id = 35}.  ab
13c0: 6f 72 74 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20  orted_handles.} 
13d0: 7b 33 20 31 34 20 31 35 20 33 35 20 36 35 20 39  {3 14 15 35 65 9
13e0: 32 7d 0a 0a 23 20 49 6e 73 65 72 74 20 61 20 63  2}..# Insert a c
13f0: 6f 75 70 6c 65 20 6f 66 20 6e 65 77 20 72 6f 77  ouple of new row
1400: 73 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  s. This should n
1410: 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  ot invalidate an
1420: 79 20 68 61 6e 64 6c 65 73 2e 0a 23 0a 64 6f 5f  y handles..#.do_
1430: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34  test incrblob2-4
1440: 2e 39 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .9 {.  db eval {
1450: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1460: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 64 61 74 61  ELECT NULL, data
1470: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 61 62 6f 72   FROM t1}.  abor
1480: 74 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 33  ted_handles.} {3
1490: 20 31 34 20 31 35 20 33 35 20 36 35 20 39 32 7d   14 15 35 65 92}
14a0: 0a 0a 23 20 44 65 6c 65 74 65 20 61 6c 6c 20 72  ..# Delete all r
14b0: 6f 77 73 20 66 72 6f 6d 20 31 20 74 6f 20 32 35  ows from 1 to 25
14c0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 62  . This should ab
14d0: 6f 72 74 20 61 6c 6c 20 68 61 6e 64 6c 65 73 20  ort all handles 
14e0: 75 70 20 74 6f 20 32 35 2e 0a 23 0a 64 6f 5f 74  up to 25..#.do_t
14f0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e  est incrblob2-4.
1500: 39 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 44  9 {.  db eval {D
1510: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
1520: 45 52 45 20 69 64 20 3e 3d 31 20 41 4e 44 20 69  ERE id >=1 AND i
1530: 64 20 3c 3d 20 32 35 7d 0a 20 20 61 62 6f 72 74  d <= 25}.  abort
1540: 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 31 20  ed_handles.} {1 
1550: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
1560: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31  10 11 12 13 14 1
1570: 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30  5 16 17 18 19 20
1580: 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20   21 22 23 24 25 
1590: 33 35 20 36 35 20 39 32 7d 0a 0a 23 20 44 65 6c  35 65 92}..# Del
15a0: 65 74 65 20 74 68 65 20 77 68 6f 6c 65 20 74 61  ete the whole ta
15b0: 62 6c 65 20 28 74 68 69 73 20 77 69 6c 6c 20 75  ble (this will u
15c0: 73 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  se sqlite3BtreeC
15d0: 6c 65 61 72 54 61 62 6c 65 28 29 29 2e 20 41 6c  learTable()). Al
15e0: 6c 20 68 61 6e 64 6c 65 73 0a 23 20 73 68 6f 75  l handles.# shou
15f0: 6c 64 20 6e 6f 77 20 62 65 20 61 62 6f 72 74 65  ld now be aborte
1600: 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63  d..#.do_test inc
1610: 72 62 6c 6f 62 32 2d 34 2e 31 30 20 7b 0a 20 20  rblob2-4.10 {.  
1620: 64 62 20 65 76 61 6c 20 7b 44 45 4c 45 54 45 20  db eval {DELETE 
1630: 46 52 4f 4d 20 74 31 7d 0a 20 20 61 62 6f 72 74  FROM t1}.  abort
1640: 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 31 20  ed_handles.} {1 
1650: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
1660: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31  10 11 12 13 14 1
1670: 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30  5 16 17 18 19 20
1680: 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20   21 22 23 24 25 
1690: 32 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33  26 27 28 29 30 3
16a0: 31 20 33 32 20 33 33 20 33 34 20 33 35 20 33 36  1 32 33 34 35 36
16b0: 20 33 37 20 33 38 20 33 39 20 34 30 20 34 31 20   37 38 39 40 41 
16c0: 34 32 20 34 33 20 34 34 20 34 35 20 34 36 20 34  42 43 44 45 46 4
16d0: 37 20 34 38 20 34 39 20 35 30 20 35 31 20 35 32  7 48 49 50 51 52
16e0: 20 35 33 20 35 34 20 35 35 20 35 36 20 35 37 20   53 54 55 56 57 
16f0: 35 38 20 35 39 20 36 30 20 36 31 20 36 32 20 36  58 59 60 61 62 6
1700: 33 20 36 34 20 36 35 20 36 36 20 36 37 20 36 38  3 64 65 66 67 68
1710: 20 36 39 20 37 30 20 37 31 20 37 32 20 37 33 20   69 70 71 72 73 
1720: 37 34 20 37 35 20 37 36 20 37 37 20 37 38 20 37  74 75 76 77 78 7
1730: 39 20 38 30 20 38 31 20 38 32 20 38 33 20 38 34  9 80 81 82 83 84
1740: 20 38 35 20 38 36 20 38 37 20 38 38 20 38 39 20   85 86 87 88 89 
1750: 39 30 20 39 31 20 39 32 20 39 33 20 39 34 20 39  90 91 92 93 94 9
1760: 35 20 39 36 20 39 37 20 39 38 20 39 39 7d 0a 0a  5 96 97 98 99}..
1770: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
1780: 32 2d 34 2e 31 2e 58 20 7b 0a 20 20 66 6f 72 20  2-4.1.X {.  for 
1790: 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20  {set ii 1} {$ii 
17a0: 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d  < 100} {incr ii}
17b0: 20 7b 0a 20 20 20 20 63 6c 6f 73 65 20 24 68 61   {.    close $ha
17c0: 6e 64 6c 65 73 28 24 69 69 29 20 0a 20 20 7d 0a  ndles($ii) .  }.
17d0: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
1830: 67 20 74 65 73 74 73 20 2d 20 69 6e 63 72 62 6c  g tests - incrbl
1840: 6f 62 32 2d 35 2e 2a 20 2d 20 74 65 73 74 20 74  ob2-5.* - test t
1850: 68 61 74 20 69 6e 20 73 68 61 72 65 64 20 63 61  hat in shared ca
1860: 63 68 65 20 61 6e 20 6f 70 65 6e 0a 23 20 62 6c  che an open.# bl
1870: 6f 62 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  ob handle counts
1880: 20 61 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20   as a read-lock 
1890: 6f 6e 20 69 74 73 20 74 61 62 6c 65 2e 0a 23 0a  on its table..#.
18a0: 69 66 63 61 70 61 62 6c 65 20 73 68 61 72 65 64  ifcapable shared
18b0: 5f 63 61 63 68 65 20 7b 0a 20 20 64 62 20 63 6c  _cache {.  db cl
18c0: 6f 73 65 0a 20 20 73 65 74 20 3a 3a 65 6e 61 62  ose.  set ::enab
18d0: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20  le_shared_cache 
18e0: 5b 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  [sqlite3_enable_
18f0: 73 68 61 72 65 64 5f 63 61 63 68 65 20 31 5d 0a  shared_cache 1].
1900: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .  do_test incrb
1910: 6c 6f 62 32 2d 35 2e 31 20 7b 0a 20 20 20 20 73  lob2-5.1 {.    s
1920: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1930: 62 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  b.    sqlite3 db
1940: 32 20 74 65 73 74 2e 64 62 0a 0a 20 20 20 20 65  2 test.db..    e
1950: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
1960: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1970: 4c 55 45 53 28 31 2c 20 27 61 62 63 64 65 27 29  LUES(1, 'abcde')
1980: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a  ;.    }.  } {}..
1990: 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c    do_test incrbl
19a0: 6f 62 32 2d 35 2e 32 20 7b 0a 20 20 20 20 63 61  ob2-5.2 {.    ca
19b0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
19c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
19d0: 2c 20 27 66 67 68 69 6a 27 29 20 7d 20 64 62 32  , 'fghij') } db2
19e0: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20 64  .  } {0 {}}..  d
19f0: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
1a00: 2d 35 2e 33 20 7b 0a 20 20 20 20 73 65 74 20 62  -5.3 {.    set b
1a10: 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  lob [db incrblob
1a20: 20 74 31 20 64 61 74 61 20 31 5d 0a 20 20 20 20   t1 data 1].    
1a30: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
1a40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1a50: 28 33 2c 20 27 6b 6c 6d 6e 6f 27 29 20 7d 20 64  (3, 'klmno') } d
1a60: 62 32 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  b2.  } {1 {datab
1a70: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
1a80: 6b 65 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  ked}}..  do_test
1a90: 20 69 6e 63 72 62 6c 6f 62 32 2d 35 2e 34 20 7b   incrblob2-5.4 {
1aa0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 62 6c 6f 62  .    close $blob
1ab0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 42 45 47  .    execsql BEG
1ac0: 49 4e 20 64 62 32 0a 20 20 20 20 63 61 74 63 68  IN db2.    catch
1ad0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1ae0: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 27  O t1 VALUES(4, '
1af0: 70 71 72 73 74 27 29 20 7d 20 64 62 32 0a 20 20  pqrst') } db2.  
1b00: 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20 64 6f 5f 74  } {0 {}}..  do_t
1b10: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 35 2e  est incrblob2-5.
1b20: 35 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20 5b  5 {.    set rc [
1b30: 63 61 74 63 68 20 7b 20 64 62 20 69 6e 63 72 62  catch { db incrb
1b40: 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31  lob -readonly t1
1b50: 20 64 61 74 61 20 31 20 7d 20 6d 73 67 5d 0a 20   data 1 } msg]. 
1b60: 20 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67     list $rc $msg
1b70: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
1b80: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
1b90: 64 3a 20 74 31 7d 7d 0a 0a 20 20 64 6f 5f 74 65  d: t1}}..  do_te
1ba0: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 35 2e 36  st incrblob2-5.6
1bb0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1bc0: 20 50 52 41 47 4d 41 20 72 65 61 64 5f 75 6e 63   PRAGMA read_unc
1bd0: 6f 6d 6d 69 74 74 65 64 3d 31 20 7d 0a 20 20 20  ommitted=1 }.   
1be0: 20 73 65 74 20 62 6c 6f 62 20 5b 64 62 20 69 6e   set blob [db in
1bf0: 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79  crblob -readonly
1c00: 20 74 31 20 64 61 74 61 20 34 5d 0a 20 20 20 20   t1 data 4].    
1c10: 72 65 61 64 20 24 62 6c 6f 62 0a 20 20 7d 20 7b  read $blob.  } {
1c20: 70 71 72 73 74 7d 0a 0a 20 20 64 6f 5f 74 65 73  pqrst}..  do_tes
1c30: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 35 2e 37 20  t incrblob2-5.7 
1c40: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
1c50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1c60: 56 41 4c 55 45 53 28 33 2c 20 27 6b 6c 6d 6e 6f  VALUES(3, 'klmno
1c70: 27 29 20 7d 20 64 62 32 0a 20 20 7d 20 7b 30 20  ') } db2.  } {0 
1c80: 7b 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69  {}}..  do_test i
1c90: 6e 63 72 62 6c 6f 62 32 2d 35 2e 38 20 7b 0a 20  ncrblob2-5.8 {. 
1ca0: 20 20 20 63 6c 6f 73 65 20 24 62 6c 6f 62 0a 20     close $blob. 
1cb0: 20 7d 20 7b 7d 0a 0a 20 20 64 62 32 20 63 6c 6f   } {}..  db2 clo
1cc0: 73 65 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  se.  db close.  
1cd0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
1ce0: 68 61 72 65 64 5f 63 61 63 68 65 20 24 3a 3a 65  hared_cache $::e
1cf0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
1d00: 68 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  he.}..#---------
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
1d60: 67 20 74 65 73 74 73 20 2d 20 69 6e 63 72 62 6c  g tests - incrbl
1d70: 6f 62 32 2d 36 2e 2a 20 2d 20 74 65 73 74 20 61  ob2-6.* - test a
1d80: 20 73 70 65 63 69 66 69 63 20 73 63 65 6e 61 72   specific scenar
1d90: 69 6f 20 74 68 61 74 20 6d 69 67 68 74 0a 23 20  io that might.# 
1da0: 62 65 20 63 61 75 73 69 6e 67 20 61 6e 20 65 72  be causing an er
1db0: 72 6f 72 2e 0a 23 0a 73 71 6c 69 74 65 33 20 64  ror..#.sqlite3 d
1dc0: 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73  b test.db.do_tes
1dd0: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 36 2e 31 20  t incrblob2-6.1 
1de0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1df0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
1e00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1e10: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 7a  O t1 VALUES(1, z
1e20: 65 72 6f 62 6c 6f 62 28 31 30 30 29 29 3b 0a 20  eroblob(100));. 
1e30: 20 7d 0a 20 20 0a 20 20 73 65 74 20 72 64 48 61   }.  .  set rdHa
1e40: 6e 64 6c 65 20 5b 64 62 20 69 6e 63 72 62 6c 6f  ndle [db incrblo
1e50: 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20 64  b -readonly t1 d
1e60: 61 74 61 20 31 5d 0a 20 20 73 65 74 20 77 72 48  ata 1].  set wrH
1e70: 61 6e 64 6c 65 20 5b 64 62 20 69 6e 63 72 62 6c  andle [db incrbl
1e80: 6f 62 20 74 31 20 64 61 74 61 20 31 5d 0a 0a 20  ob t1 data 1].. 
1e90: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
1ea0: 61 64 20 24 72 64 48 61 6e 64 6c 65 20 30 20 31  ad $rdHandle 0 1
1eb0: 30 30 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  00..  sqlite3_bl
1ec0: 6f 62 5f 77 72 69 74 65 20 24 77 72 48 61 6e 64  ob_write $wrHand
1ed0: 6c 65 20 30 20 41 42 43 44 45 46 0a 0a 20 20 63  le 0 ABCDEF..  c
1ee0: 6c 6f 73 65 20 24 77 72 48 61 6e 64 6c 65 0a 20  lose $wrHandle. 
1ef0: 20 63 6c 6f 73 65 20 24 72 64 48 61 6e 64 6c 65   close $rdHandle
1f00: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 69  .} {}..do_test i
1f10: 6e 63 72 62 6c 6f 62 32 2d 36 2e 32 20 7b 0a 20  ncrblob2-6.2 {. 
1f20: 20 73 65 74 20 72 64 48 61 6e 64 6c 65 20 5b 64   set rdHandle [d
1f30: 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64  b incrblob -read
1f40: 6f 6e 6c 79 20 74 31 20 64 61 74 61 20 31 5d 0a  only t1 data 1].
1f50: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72    sqlite3_blob_r
1f60: 65 61 64 20 24 72 64 48 61 6e 64 6c 65 20 30 20  ead $rdHandle 0 
1f70: 32 0a 7d 20 7b 41 42 7d 0a 0a 69 66 20 7b 24 3a  2.} {AB}..if {$:
1f80: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 70 6f  :tcl_platform(po
1f90: 69 6e 74 65 72 53 69 7a 65 29 3e 3d 38 7d 20 7b  interSize)>=8} {
1fa0: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .  do_test incrb
1fb0: 6c 6f 62 32 2d 36 2e 32 62 20 7b 0a 20 20 20 20  lob2-6.2b {.    
1fc0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a  set rc [catch {.
1fd0: 20 20 20 20 20 20 23 20 50 72 69 6f 72 20 74 6f        # Prior to
1fe0: 20 32 30 31 35 2d 30 32 2d 30 37 2c 20 74 68 65   2015-02-07, the
1ff0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 75 73 65   following cause
2000: 64 20 61 20 73 65 67 66 61 75 6c 74 20 64 75 65  d a segfault due
2010: 20 74 6f 0a 20 20 20 20 20 20 23 20 69 6e 74 65   to.      # inte
2020: 67 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 20 20  ger overflow..  
2030: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
2040: 5f 72 65 61 64 20 24 72 64 48 61 6e 64 6c 65 20  _read $rdHandle 
2050: 32 31 34 37 34 38 33 36 34 37 20 32 31 34 37 34  2147483647 21474
2060: 38 33 36 34 37 0a 20 20 20 20 7d 20 65 72 72 6d  83647.    } errm
2070: 73 67 5d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72  sg].    if {[str
2080: 69 6e 67 20 6d 61 74 63 68 20 7b 6f 75 74 20 6f  ing match {out o
2090: 66 20 6d 65 6d 6f 72 79 20 69 6e 20 2a 74 65 73  f memory in *tes
20a0: 74 5f 62 6c 6f 62 2e 63 7d 20 24 65 72 72 6d 73  t_blob.c} $errms
20b0: 67 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  g]} {.      set 
20c0: 65 72 72 6d 73 67 20 53 51 4c 49 54 45 5f 45 52  errmsg SQLITE_ER
20d0: 52 4f 52 0a 20 20 20 20 7d 0a 20 20 20 20 6c 61  ROR.    }.    la
20e0: 70 70 65 6e 64 20 72 63 20 24 65 72 72 6d 73 67  ppend rc $errmsg
20f0: 0a 20 20 7d 20 7b 31 20 53 51 4c 49 54 45 5f 45  .  } {1 SQLITE_E
2100: 52 52 4f 52 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20  RROR}.}.do_test 
2110: 69 6e 63 72 62 6c 6f 62 32 2d 36 2e 32 63 20 7b  incrblob2-6.2c {
2120: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2130: 20 7b 0a 20 20 20 20 23 20 50 72 69 6f 72 20 74   {.    # Prior t
2140: 6f 20 32 30 31 35 2d 30 32 2d 30 37 2c 20 74 68  o 2015-02-07, th
2150: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 75 73  e following caus
2160: 65 64 20 61 20 73 65 67 66 61 75 6c 74 20 64 75  ed a segfault du
2170: 65 20 74 6f 0a 20 20 20 20 23 20 69 6e 74 65 67  e to.    # integ
2180: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 20 20 20  er overflow..   
2190: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
21a0: 61 64 20 24 72 64 48 61 6e 64 6c 65 20 32 31 34  ad $rdHandle 214
21b0: 37 34 38 33 36 34 37 20 31 30 30 0a 20 20 7d 20  7483647 100.  } 
21c0: 65 72 72 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  errmsg].  lappen
21d0: 64 20 72 63 20 24 65 72 72 6d 73 67 0a 7d 20 7b  d rc $errmsg.} {
21e0: 31 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a  1 SQLITE_ERROR}.
21f0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
2200: 62 32 2d 36 2e 33 20 7b 0a 20 20 73 65 74 20 77  b2-6.3 {.  set w
2210: 72 48 61 6e 64 6c 65 20 5b 64 62 20 69 6e 63 72  rHandle [db incr
2220: 62 6c 6f 62 20 74 31 20 64 61 74 61 20 31 5d 0a  blob t1 data 1].
2230: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
2240: 72 69 74 65 20 24 77 72 48 61 6e 64 6c 65 20 30  rite $wrHandle 0
2250: 20 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 0a 20 20 73 71   ZZZZZZZZZZ.  sq
2260: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20  lite3_blob_read 
2270: 24 72 64 48 61 6e 64 6c 65 20 32 20 34 0a 7d 20  $rdHandle 2 4.} 
2280: 7b 5a 5a 5a 5a 7d 0a 0a 64 6f 5f 74 65 73 74 20  {ZZZZ}..do_test 
2290: 69 6e 63 72 62 6c 6f 62 32 2d 36 2e 33 62 20 7b  incrblob2-6.3b {
22a0: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
22b0: 20 7b 0a 20 20 20 20 23 20 50 72 69 6f 72 20 74   {.    # Prior t
22c0: 6f 20 32 30 31 35 2d 30 32 2d 30 37 2c 20 74 68  o 2015-02-07, th
22d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 75 73  e following caus
22e0: 65 64 20 61 20 73 65 67 66 61 75 6c 74 20 64 75  ed a segfault du
22f0: 65 20 74 6f 0a 20 20 20 20 23 20 69 6e 74 65 67  e to.    # integ
2300: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 20 20 20  er overflow..   
2310: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
2320: 69 74 65 20 24 77 72 48 61 6e 64 6c 65 20 32 31  ite $wrHandle 21
2330: 34 37 34 38 33 36 34 37 20 59 59 59 59 59 59 59  47483647 YYYYYYY
2340: 59 59 59 59 59 59 59 59 59 59 59 0a 20 20 7d 20  YYYYYYYYYYY.  } 
2350: 65 72 72 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e  errmsg].  lappen
2360: 64 20 72 63 20 24 65 72 72 6d 73 67 0a 7d 20 7b  d rc $errmsg.} {
2370: 31 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a  1 SQLITE_ERROR}.
2380: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
2390: 32 2d 36 2e 33 63 20 7b 0a 20 20 73 71 6c 69 74  2-6.3c {.  sqlit
23a0: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24 72 64  e3_blob_read $rd
23b0: 48 61 6e 64 6c 65 20 32 20 34 0a 7d 20 7b 5a 5a  Handle 2 4.} {ZZ
23c0: 5a 5a 7d 0a 0a 0a 64 6f 5f 74 65 73 74 20 69 6e  ZZ}...do_test in
23d0: 63 72 62 6c 6f 62 32 2d 36 2e 34 20 7b 0a 20 20  crblob2-6.4 {.  
23e0: 63 6c 6f 73 65 20 24 77 72 48 61 6e 64 6c 65 0a  close $wrHandle.
23f0: 20 20 63 6c 6f 73 65 20 24 72 64 48 61 6e 64 6c    close $rdHandl
2400: 65 0a 7d 20 7b 7d 0a 0a 73 71 6c 69 74 65 33 5f  e.} {}..sqlite3_
2410: 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
2420: 20 31 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62   1.do_test incrb
2430: 6c 6f 62 32 2d 37 2e 31 20 7b 0a 20 20 64 62 20  lob2-7.1 {.  db 
2440: 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  eval {.    CREAT
2450: 45 20 54 41 42 4c 45 20 74 32 28 42 20 42 4c 4f  E TABLE t2(B BLO
2460: 42 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  B);.    INSERT I
2470: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 7a 65  NTO t2 VALUES(ze
2480: 72 6f 62 6c 6f 62 28 31 30 20 2a 20 31 30 32 34  roblob(10 * 1024
2490: 20 2a 20 31 30 32 34 29 29 3b 20 0a 20 20 7d 0a   * 1024)); .  }.
24a0: 20 20 65 78 70 72 20 7b 5b 73 71 6c 69 74 65 33    expr {[sqlite3
24b0: 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
24c0: 72 5d 3c 28 35 20 2a 20 31 30 32 34 20 2a 20 31  r]<(5 * 1024 * 1
24d0: 30 32 34 29 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f  024)}.} {1}..do_
24e0: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 37  test incrblob2-7
24f0: 2e 32 20 7b 0a 20 20 73 65 74 20 68 20 5b 64 62  .2 {.  set h [db
2500: 20 69 6e 63 72 62 6c 6f 62 20 74 32 20 42 20 31   incrblob t2 B 1
2510: 5d 0a 20 20 65 78 70 72 20 7b 5b 73 71 6c 69 74  ].  expr {[sqlit
2520: 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61  e3_memory_highwa
2530: 74 65 72 5d 3c 28 35 20 2a 20 31 30 32 34 20 2a  ter]<(5 * 1024 *
2540: 20 31 30 32 34 29 7d 0a 7d 20 7b 31 7d 0a 0a 64   1024)}.} {1}..d
2550: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
2560: 2d 37 2e 33 20 7b 0a 20 20 73 65 65 6b 20 24 68  -7.3 {.  seek $h
2570: 20 30 20 65 6e 64 0a 20 20 74 65 6c 6c 20 24 68   0 end.  tell $h
2580: 0a 7d 20 5b 65 78 70 72 20 31 30 20 2a 20 31 30  .} [expr 10 * 10
2590: 32 34 20 2a 20 31 30 32 34 5d 0a 0a 64 6f 5f 74  24 * 1024]..do_t
25a0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 37 2e  est incrblob2-7.
25b0: 34 20 7b 0a 20 20 65 78 70 72 20 7b 5b 73 71 6c  4 {.  expr {[sql
25c0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68  ite3_memory_high
25d0: 77 61 74 65 72 5d 3c 28 35 20 2a 20 31 30 32 34  water]<(5 * 1024
25e0: 20 2a 20 31 30 32 34 29 7d 0a 7d 20 7b 31 7d 0a   * 1024)}.} {1}.
25f0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
2600: 62 32 2d 37 2e 35 20 7b 0a 20 20 63 6c 6f 73 65  b2-7.5 {.  close
2610: 20 24 68 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d   $h.} {}..#-----
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
2670: 6c 6f 77 69 6e 67 20 74 65 73 74 73 2c 20 69 6e  lowing tests, in
2680: 63 72 62 6c 6f 62 32 2d 38 2e 2a 2c 20 74 65 73  crblob2-8.*, tes
2690: 74 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 20 74  t that nothing t
26a0: 65 72 72 69 62 6c 65 20 68 61 70 70 65 6e 73 0a  errible happens.
26b0: 23 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  # when a stateme
26c0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
26d0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68  s rolled back wh
26e0: 69 6c 65 20 74 68 65 72 65 20 61 72 65 20 6f 70  ile there are op
26f0: 65 6e 20 0a 23 20 69 6e 63 72 65 6d 65 6e 74 61  en .# incrementa
2700: 6c 2d 62 6c 6f 62 20 68 61 6e 64 6c 65 73 2e 20  l-blob handles. 
2710: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 61 6e 20  At one point an 
2720: 61 73 73 65 72 74 28 29 20 77 61 73 20 66 61 69  assert() was fai
2730: 6c 69 6e 67 20 77 68 65 6e 0a 23 20 74 68 69 73  ling when.# this
2740: 20 77 61 73 20 61 74 74 65 6d 70 74 65 64 2e 0a   was attempted..
2750: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  #.do_test incrbl
2760: 6f 62 32 2d 38 2e 31 20 7b 0a 20 20 65 78 65 63  ob2-8.1 {.  exec
2770: 73 71 6c 20 42 45 47 49 4e 0a 20 20 73 65 74 20  sql BEGIN.  set 
2780: 68 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 74  h [db incrblob t
2790: 32 20 42 20 31 5d 0a 20 20 73 65 74 20 72 63 20  2 B 1].  set rc 
27a0: 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20  [catch {.    db 
27b0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 72 6f 77  eval {SELECT row
27c0: 69 64 20 46 52 4f 4d 20 74 32 7d 20 7b 20 65 78  id FROM t2} { ex
27d0: 65 63 73 71 6c 20 22 44 52 4f 50 20 54 41 42 4c  ecsql "DROP TABL
27e0: 45 20 74 32 22 20 7d 0a 20 20 7d 20 6d 73 67 5d  E t2" }.  } msg]
27f0: 20 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73   .  list $rc $ms
2800: 67 0a 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65  g.} {1 {database
2810: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
2820: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  }}.do_test incrb
2830: 6c 6f 62 32 2d 38 2e 32 20 7b 0a 20 20 63 6c 6f  lob2-8.2 {.  clo
2840: 73 65 20 24 68 0a 20 20 65 78 65 63 73 71 6c 20  se $h.  execsql 
2850: 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 64 6f 5f 74  COMMIT.} {}.do_t
2860: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e  est incrblob2-8.
2870: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
2880: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2890: 20 74 33 28 61 20 49 4e 54 45 47 45 52 20 55 4e   t3(a INTEGER UN
28a0: 49 51 55 45 2c 20 62 20 54 45 58 54 29 3b 0a 20  IQUE, b TEXT);. 
28b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
28c0: 33 20 56 41 4c 55 45 53 28 31 2c 20 27 61 61 61  3 VALUES(1, 'aaa
28d0: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61  aaaaaaaaaaaaaaaa
28e0: 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a');.    INSERT 
28f0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 32  INTO t3 VALUES(2
2900: 2c 20 27 62 62 62 62 62 62 62 62 62 62 62 62 62  , 'bbbbbbbbbbbbb
2910: 62 62 62 62 62 62 62 27 29 3b 0a 20 20 20 20 49  bbbbbbb');.    I
2920: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
2930: 4c 55 45 53 28 33 2c 20 27 63 63 63 63 63 63 63  LUES(3, 'ccccccc
2940: 63 63 63 63 63 63 63 63 63 63 63 63 63 27 29 3b  ccccccccccccc');
2950: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2960: 20 74 33 20 56 41 4c 55 45 53 28 34 2c 20 27 64   t3 VALUES(4, 'd
2970: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64  dddddddddddddddd
2980: 64 64 64 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  ddd');.    INSER
2990: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
29a0: 28 35 2c 20 27 65 65 65 65 65 65 65 65 65 65 65  (5, 'eeeeeeeeeee
29b0: 65 65 65 65 65 65 65 65 65 27 29 3b 0a 20 20 7d  eeeeeeeee');.  }
29c0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  .} {}.do_test in
29d0: 63 72 62 6c 6f 62 32 2d 38 2e 34 20 7b 0a 20 20  crblob2-8.4 {.  
29e0: 65 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 20 20  execsql BEGIN.  
29f0: 73 65 74 20 68 20 5b 64 62 20 69 6e 63 72 62 6c  set h [db incrbl
2a00: 6f 62 20 74 33 20 62 20 33 5d 0a 20 20 73 71 6c  ob t3 b 3].  sql
2a10: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24  ite3_blob_read $
2a20: 68 20 30 20 32 30 0a 7d 20 7b 63 63 63 63 63 63  h 0 20.} {cccccc
2a30: 63 63 63 63 63 63 63 63 63 63 63 63 63 63 7d 0a  cccccccccccccc}.
2a40: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
2a50: 32 2d 38 2e 35 20 7b 0a 20 20 63 61 74 63 68 73  2-8.5 {.  catchs
2a60: 71 6c 20 7b 55 50 44 41 54 45 20 74 33 20 53 45  ql {UPDATE t3 SE
2a70: 54 20 61 20 3d 20 36 20 57 48 45 52 45 20 61 20  T a = 6 WHERE a 
2a80: 3e 20 33 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55  > 3}.} {1 {UNIQU
2a90: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
2aa0: 6c 65 64 3a 20 74 33 2e 61 7d 7d 0a 64 6f 5f 74  led: t3.a}}.do_t
2ab0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e  est incrblob2-8.
2ac0: 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
2ad0: 55 50 44 41 54 45 20 74 33 20 53 45 54 20 61 20  UPDATE t3 SET a 
2ae0: 3d 20 36 20 57 48 45 52 45 20 61 20 3e 20 33 7d  = 6 WHERE a > 3}
2af0: 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f  .} {1 {UNIQUE co
2b00: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  nstraint failed:
2b10: 20 74 33 2e 61 7d 7d 0a 64 6f 5f 74 65 73 74 20   t3.a}}.do_test 
2b20: 69 6e 63 72 62 6c 6f 62 32 2d 38 2e 37 20 7b 0a  incrblob2-8.7 {.
2b30: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72    sqlite3_blob_r
2b40: 65 61 64 20 24 68 20 30 20 32 30 0a 7d 20 7b 63  ead $h 0 20.} {c
2b50: 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63  cccccccccccccccc
2b60: 63 63 63 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63  ccc}.do_test inc
2b70: 72 62 6c 6f 62 32 2d 38 2e 38 20 7b 0a 20 20 63  rblob2-8.8 {.  c
2b80: 61 74 63 68 73 71 6c 20 7b 55 50 44 41 54 45 20  atchsql {UPDATE 
2b90: 74 33 20 53 45 54 20 61 20 3d 20 36 20 57 48 45  t3 SET a = 6 WHE
2ba0: 52 45 20 61 20 3d 20 33 20 4f 52 20 61 20 3d 20  RE a = 3 OR a = 
2bb0: 35 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20  5}.} {1 {UNIQUE 
2bc0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
2bd0: 64 3a 20 74 33 2e 61 7d 7d 0a 64 6f 5f 74 65 73  d: t3.a}}.do_tes
2be0: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e 39 20  t incrblob2-8.9 
2bf0: 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63  {.  set rc [catc
2c00: 68 20 7b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  h {sqlite3_blob_
2c10: 72 65 61 64 20 24 68 20 30 20 32 30 7d 20 6d 73  read $h 0 20} ms
2c20: 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d  g].  list $rc $m
2c30: 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 41  sg.} {1 SQLITE_A
2c40: 42 4f 52 54 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  BORT}.do_test in
2c50: 63 72 62 6c 6f 62 32 2d 38 2e 58 20 7b 0a 20 20  crblob2-8.X {.  
2c60: 63 6c 6f 73 65 20 24 68 0a 7d 20 7b 7d 0a 0a 66  close $h.} {}..f
2c70: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.