/ Hex Artifact Content
Login

Artifact c82a780356bdf4d0c77f1adf0ea888248904fc07:


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 38 20 32 30 30 38 2f 30 36 2f  t,v 1.8 2008/06/
01e0: 32 38 20 31 35 3a 33 33 3a 32 36 20 64 61 6e 69  28 15:33:26 dani
01f0: 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 23 0a  elk1977 Exp $.#.
0200: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0210: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0220: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0230: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 69  ir/tester.tcl..i
0240: 66 63 61 70 61 62 6c 65 20 7b 21 61 75 74 6f 76  fcapable {!autov
0250: 61 63 75 75 6d 20 7c 7c 20 21 70 72 61 67 6d 61  acuum || !pragma
0260: 20 7c 7c 20 21 69 6e 63 72 62 6c 6f 62 7d 20 7b   || !incrblob} {
0270: 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20  .  finish_test. 
0280: 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 74 65   return.}..do_te
0290: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e 30  st incrblob2-1.0
02a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
02b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
02c0: 62 6c 6f 62 73 28 69 64 20 49 4e 54 45 47 45 52  blobs(id INTEGER
02d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64 61   PRIMARY KEY, da
02e0: 74 61 20 42 4c 4f 42 29 3b 0a 20 20 20 20 49 4e  ta BLOB);.    IN
02f0: 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f 62 73 20  SERT INTO blobs 
0300: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 7a 65 72  VALUES(NULL, zer
0310: 6f 62 6c 6f 62 28 35 30 30 30 29 29 3b 0a 20 20  oblob(5000));.  
0320: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c    INSERT INTO bl
0330: 6f 62 73 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c  obs VALUES(NULL,
0340: 20 7a 65 72 6f 62 6c 6f 62 28 35 30 30 30 29 29   zeroblob(5000))
0350: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0360: 4f 20 62 6c 6f 62 73 20 56 41 4c 55 45 53 28 4e  O blobs VALUES(N
0370: 55 4c 4c 2c 20 7a 65 72 6f 62 6c 6f 62 28 35 30  ULL, zeroblob(50
0380: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
0390: 20 49 4e 54 4f 20 62 6c 6f 62 73 20 56 41 4c 55   INTO blobs VALU
03a0: 45 53 28 4e 55 4c 4c 2c 20 7a 65 72 6f 62 6c 6f  ES(NULL, zeroblo
03b0: 62 28 35 30 30 30 29 29 3b 0a 20 20 7d 0a 7d 20  b(5000));.  }.} 
03c0: 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 69 4f 66 66  {}..foreach iOff
03d0: 73 65 74 20 5b 6c 69 73 74 20 30 20 32 35 36 20  set [list 0 256 
03e0: 34 30 39 34 5d 20 7b 0a 20 20 64 6f 5f 74 65 73  4094] {.  do_tes
03f0: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e 24 69  t incrblob2-1.$i
0400: 4f 66 66 73 65 74 2e 31 20 7b 0a 20 20 20 20 73  Offset.1 {.    s
0410: 65 74 20 66 64 20 5b 64 62 20 69 6e 63 72 62 6c  et fd [db incrbl
0420: 6f 62 20 62 6c 6f 62 73 20 64 61 74 61 20 31 5d  ob blobs data 1]
0430: 0a 20 20 20 20 70 75 74 73 20 24 66 64 20 22 5b  .    puts $fd "[
0440: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 78 20  string repeat x 
0450: 24 69 4f 66 66 73 65 74 5d 53 51 4c 69 74 65 20  $iOffset]SQLite 
0460: 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 22 0a 20  version 3.6.0". 
0470: 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 7d     close $fd.  }
0480: 20 7b 7d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74   {}.  .  do_test
0490: 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e 24 69 4f   incrblob2-1.$iO
04a0: 66 66 73 65 74 2e 32 20 7b 0a 20 20 20 20 73 65  ffset.2 {.    se
04b0: 74 20 66 64 31 20 5b 64 62 20 69 6e 63 72 62 6c  t fd1 [db incrbl
04c0: 6f 62 20 62 6c 6f 62 73 20 64 61 74 61 20 31 5d  ob blobs data 1]
04d0: 0a 20 20 20 20 73 65 74 20 66 64 32 20 5b 64 62  .    set fd2 [db
04e0: 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20   incrblob blobs 
04f0: 64 61 74 61 20 31 5d 0a 20 20 20 20 66 63 6f 6e  data 1].    fcon
0500: 66 69 67 75 72 65 20 24 66 64 31 20 2d 62 75 66  figure $fd1 -buf
0510: 66 65 72 69 6e 67 20 6e 6f 6e 65 0a 20 20 20 20  fering none.    
0520: 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64 32 20  fconfigure $fd2 
0530: 2d 62 75 66 66 65 72 69 6e 67 20 6e 6f 6e 65 0a  -buffering none.
0540: 20 20 20 20 69 66 20 7b 24 69 4f 66 66 73 65 74      if {$iOffset
0550: 20 21 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20 73   != 0} {.      s
0560: 65 65 6b 20 24 66 64 32 20 24 69 4f 66 66 73 65  eek $fd2 $iOffse
0570: 74 20 73 74 61 72 74 0a 20 20 20 20 20 20 73 65  t start.      se
0580: 65 6b 20 24 66 64 31 20 24 69 4f 66 66 73 65 74  ek $fd1 $iOffset
0590: 20 73 74 61 72 74 0a 20 20 20 20 7d 0a 20 20 20   start.    }.   
05a0: 20 72 65 61 64 20 24 66 64 31 20 36 0a 20 20 7d   read $fd1 6.  }
05b0: 20 7b 53 51 4c 69 74 65 7d 0a 20 20 0a 20 20 64   {SQLite}.  .  d
05c0: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
05d0: 2d 31 2e 24 69 4f 66 66 73 65 74 2e 33 20 7b 0a  -1.$iOffset.3 {.
05e0: 20 20 20 20 72 65 61 64 20 24 66 64 32 20 36 0a      read $fd2 6.
05f0: 20 20 7d 20 7b 53 51 4c 69 74 65 7d 0a 20 20 0a    } {SQLite}.  .
0600: 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c    do_test incrbl
0610: 6f 62 32 2d 31 2e 24 69 4f 66 66 73 65 74 2e 34  ob2-1.$iOffset.4
0620: 20 7b 0a 20 20 20 20 73 65 65 6b 20 24 66 64 32   {.    seek $fd2
0630: 20 24 69 4f 66 66 73 65 74 20 73 74 61 72 74 0a   $iOffset start.
0640: 20 20 20 20 73 65 65 6b 20 24 66 64 31 20 24 69      seek $fd1 $i
0650: 4f 66 66 73 65 74 20 73 74 61 72 74 0a 20 20 20  Offset start.   
0660: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
0670: 20 24 66 64 32 20 22 65 74 69 4c 51 53 22 0a 20   $fd2 "etiLQS". 
0680: 20 7d 20 7b 7d 0a 0a 20 20 0a 20 20 64 6f 5f 74   } {}..  .  do_t
0690: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e  est incrblob2-1.
06a0: 24 69 4f 66 66 73 65 74 2e 35 20 7b 0a 20 20 20  $iOffset.5 {.   
06b0: 20 73 65 65 6b 20 24 66 64 31 20 24 69 4f 66 66   seek $fd1 $iOff
06c0: 73 65 74 20 73 74 61 72 74 0a 20 20 20 20 72 65  set start.    re
06d0: 61 64 20 24 66 64 31 20 36 0a 20 20 7d 20 7b 65  ad $fd1 6.  } {e
06e0: 74 69 4c 51 53 7d 0a 20 20 0a 20 20 64 6f 5f 74  tiLQS}.  .  do_t
06f0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e  est incrblob2-1.
0700: 24 69 4f 66 66 73 65 74 2e 36 20 7b 0a 20 20 20  $iOffset.6 {.   
0710: 20 73 65 65 6b 20 24 66 64 32 20 24 69 4f 66 66   seek $fd2 $iOff
0720: 73 65 74 20 73 74 61 72 74 0a 20 20 20 20 72 65  set start.    re
0730: 61 64 20 24 66 64 32 20 36 0a 20 20 7d 20 7b 65  ad $fd2 6.  } {e
0740: 74 69 4c 51 53 7d 0a 20 20 0a 20 20 64 6f 5f 74  tiLQS}.  .  do_t
0750: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e  est incrblob2-1.
0760: 24 69 4f 66 66 73 65 74 2e 37 20 7b 0a 20 20 20  $iOffset.7 {.   
0770: 20 73 65 65 6b 20 24 66 64 31 20 24 69 4f 66 66   seek $fd1 $iOff
0780: 73 65 74 20 73 74 61 72 74 0a 20 20 20 20 72 65  set start.    re
0790: 61 64 20 24 66 64 31 20 36 0a 20 20 7d 20 7b 65  ad $fd1 6.  } {e
07a0: 74 69 4c 51 53 7d 0a 20 20 0a 20 20 64 6f 5f 74  tiLQS}.  .  do_t
07b0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 31 2e  est incrblob2-1.
07c0: 24 69 4f 66 66 73 65 74 2e 38 20 7b 0a 20 20 20  $iOffset.8 {.   
07d0: 20 63 6c 6f 73 65 20 24 66 64 31 0a 20 20 20 20   close $fd1.    
07e0: 63 6c 6f 73 65 20 24 66 64 32 0a 20 20 7d 20 7b  close $fd2.  } {
07f0: 7d 0a 7d 0a 0a 23 2d 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: 0a 0a 66 6f 72 65 61 63 68 20 69 4f 66 66 73 65  ..foreach iOffse
0850: 74 20 5b 6c 69 73 74 20 30 20 32 35 36 20 34 30  t [list 0 256 40
0860: 39 34 5d 20 7b 0a 0a 20 20 64 6f 5f 74 65 73 74  94] {..  do_test
0870: 20 69 6e 63 72 62 6c 6f 62 32 2d 32 2e 24 69 4f   incrblob2-2.$iO
0880: 66 66 73 65 74 2e 31 20 7b 0a 20 20 20 20 73 65  ffset.1 {.    se
0890: 74 20 66 64 31 20 5b 64 62 20 69 6e 63 72 62 6c  t fd1 [db incrbl
08a0: 6f 62 20 62 6c 6f 62 73 20 64 61 74 61 20 31 5d  ob blobs data 1]
08b0: 0a 20 20 20 20 73 65 65 6b 20 24 66 64 31 20 5b  .    seek $fd1 [
08c0: 65 78 70 72 20 24 69 4f 66 66 73 65 74 20 2d 20  expr $iOffset - 
08d0: 35 30 30 30 5d 20 65 6e 64 0a 20 20 20 20 66 63  5000] end.    fc
08e0: 6f 6e 66 69 67 75 72 65 20 24 66 64 31 20 2d 62  onfigure $fd1 -b
08f0: 75 66 66 65 72 69 6e 67 20 6e 6f 6e 65 0a 0a 20  uffering none.. 
0900: 20 20 20 73 65 74 20 66 64 32 20 5b 64 62 20 69     set fd2 [db i
0910: 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 64 61  ncrblob blobs da
0920: 74 61 20 31 5d 0a 20 20 20 20 73 65 65 6b 20 24  ta 1].    seek $
0930: 66 64 32 20 5b 65 78 70 72 20 24 69 4f 66 66 73  fd2 [expr $iOffs
0940: 65 74 20 2d 20 35 30 30 30 5d 20 65 6e 64 0a 20  et - 5000] end. 
0950: 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66     fconfigure $f
0960: 64 32 20 2d 62 75 66 66 65 72 69 6e 67 20 6e 6f  d2 -buffering no
0970: 6e 65 0a 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f  ne..    puts -no
0980: 6e 65 77 6c 69 6e 65 20 24 66 64 31 20 22 31 32  newline $fd1 "12
0990: 33 34 35 36 22 0a 20 20 7d 20 7b 7d 0a 20 20 0a  3456".  } {}.  .
09a0: 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c    do_test incrbl
09b0: 6f 62 32 2d 32 2e 24 69 4f 66 66 73 65 74 2e 32  ob2-2.$iOffset.2
09c0: 20 7b 0a 20 20 20 20 72 65 61 64 20 24 66 64 32   {.    read $fd2
09d0: 20 36 0a 20 20 7d 20 7b 31 32 33 34 35 36 7d 0a   6.  } {123456}.
09e0: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .  do_test incrb
09f0: 6c 6f 62 32 2d 32 2e 24 69 4f 66 66 73 65 74 2e  lob2-2.$iOffset.
0a00: 33 20 7b 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  3 {.    close $f
0a10: 64 31 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 64  d1.    close $fd
0a20: 32 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 64 6f 5f 74  2.  } {}.}..do_t
0a30: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 33 2e  est incrblob2-3.
0a40: 31 20 7b 0a 20 20 73 65 74 20 66 64 31 20 5b 64  1 {.  set fd1 [d
0a50: 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73  b incrblob blobs
0a60: 20 64 61 74 61 20 31 5d 0a 20 20 66 63 6f 6e 66   data 1].  fconf
0a70: 69 67 75 72 65 20 24 66 64 31 20 2d 62 75 66 66  igure $fd1 -buff
0a80: 65 72 69 6e 67 20 6e 6f 6e 65 0a 7d 20 7b 7d 0a  ering none.} {}.
0a90: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
0aa0: 32 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  2-3.2 {.  execsq
0ab0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
0ac0: 4e 54 4f 20 62 6c 6f 62 73 20 56 41 4c 55 45 53  NTO blobs VALUES
0ad0: 28 35 2c 20 7a 65 72 6f 62 6c 6f 62 28 31 30 32  (5, zeroblob(102
0ae0: 34 30 29 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  40));.  }.} {}.d
0af0: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
0b00: 2d 33 2e 33 20 7b 0a 20 20 73 65 74 20 72 63 20  -3.3 {.  set rc 
0b10: 5b 63 61 74 63 68 20 7b 20 72 65 61 64 20 24 66  [catch { read $f
0b20: 64 31 20 36 20 7d 20 6d 73 67 5d 0a 20 20 6c 69  d1 6 } msg].  li
0b30: 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 30  st $rc $msg.} {0
0b40: 20 31 32 33 34 35 36 7d 0a 64 6f 5f 74 65 73 74   123456}.do_test
0b50: 20 69 6e 63 72 62 6c 6f 62 32 2d 33 2e 34 20 7b   incrblob2-3.4 {
0b60: 0a 20 20 63 6c 6f 73 65 20 24 66 64 31 0a 7d 20  .  close $fd1.} 
0b70: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0bc0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
0bd0: 74 65 73 74 73 20 2d 20 69 6e 63 72 62 6c 6f 62  tests - incrblob
0be0: 32 2d 34 2e 2a 20 2d 20 74 65 73 74 20 74 68 61  2-4.* - test tha
0bf0: 74 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73 20 61  t blob handles a
0c00: 72 65 20 0a 23 20 69 6e 76 61 6c 69 64 61 74 65  re .# invalidate
0c10: 64 20 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  d at the correct
0c20: 20 74 69 6d 65 73 2e 0a 23 0a 64 6f 5f 74 65 73   times..#.do_tes
0c30: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e 31 20  t incrblob2-4.1 
0c40: 7b 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  {.  unset -nocom
0c50: 70 6c 61 69 6e 20 64 61 74 61 0a 20 20 64 62 20  plain data.  db 
0c60: 65 76 61 6c 20 42 45 47 49 4e 0a 20 20 64 62 20  eval BEGIN.  db 
0c70: 65 76 61 6c 20 7b 20 43 52 45 41 54 45 20 54 41  eval { CREATE TA
0c80: 42 4c 45 20 74 31 28 69 64 20 49 4e 54 45 47 45  BLE t1(id INTEGE
0c90: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64  R PRIMARY KEY, d
0ca0: 61 74 61 20 42 4c 4f 42 29 3b 20 7d 0a 20 20 66  ata BLOB); }.  f
0cb0: 6f 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24  or {set ii 1} {$
0cc0: 69 69 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20  ii < 100} {incr 
0cd0: 69 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 61  ii} {.    set da
0ce0: 74 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ta [string repea
0cf0: 74 20 22 62 6c 6f 62 24 69 69 22 20 35 30 30 5d  t "blob$ii" 500]
0d00: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49  .    db eval { I
0d10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0d20: 4c 55 45 53 28 24 69 69 2c 20 24 64 61 74 61 29  LUES($ii, $data)
0d30: 20 7d 0a 20 20 7d 0a 20 20 64 62 20 65 76 61 6c   }.  }.  db eval
0d40: 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a 0a 70 72   COMMIT.} {}..pr
0d50: 6f 63 20 61 62 6f 72 74 65 64 5f 68 61 6e 64 6c  oc aborted_handl
0d60: 65 73 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  es {} {.  global
0d70: 20 68 61 6e 64 6c 65 73 0a 0a 20 20 73 65 74 20   handles..  set 
0d80: 61 62 6f 72 74 65 64 20 7b 7d 0a 20 20 66 6f 72  aborted {}.  for
0d90: 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69   {set ii 1} {$ii
0da0: 20 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 69   < 100} {incr ii
0db0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 73 74 72 20  } {.    set str 
0dc0: 22 62 6c 6f 62 24 69 69 22 0a 20 20 20 20 73 65  "blob$ii".    se
0dd0: 74 20 6e 42 79 74 65 20 5b 73 74 72 69 6e 67 20  t nByte [string 
0de0: 6c 65 6e 67 74 68 20 24 73 74 72 5d 0a 20 20 20  length $str].   
0df0: 20 73 65 74 20 69 4f 66 66 73 65 74 20 5b 65 78   set iOffset [ex
0e00: 70 72 20 24 6e 42 79 74 65 20 2a 20 24 69 69 20  pr $nByte * $ii 
0e10: 2a 20 32 5d 0a 0a 20 20 20 20 73 65 74 20 72 63  * 2]..    set rc
0e20: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
0e30: 5f 62 6c 6f 62 5f 72 65 61 64 20 24 68 61 6e 64  _blob_read $hand
0e40: 6c 65 73 28 24 69 69 29 20 24 69 4f 66 66 73 65  les($ii) $iOffse
0e50: 74 20 24 6e 42 79 74 65 7d 20 6d 73 67 5d 0a 20  t $nByte} msg]. 
0e60: 20 20 20 69 66 20 7b 24 72 63 20 26 26 20 24 6d     if {$rc && $m
0e70: 73 67 20 65 71 20 22 53 51 4c 49 54 45 5f 41 42  sg eq "SQLITE_AB
0e80: 4f 52 54 22 7d 20 7b 0a 20 20 20 20 20 20 6c 61  ORT"} {.      la
0e90: 70 70 65 6e 64 20 61 62 6f 72 74 65 64 20 24 69  ppend aborted $i
0ea0: 69 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  i.    } else {. 
0eb0: 20 20 20 20 20 69 66 20 7b 24 72 63 20 7c 7c 20       if {$rc || 
0ec0: 24 6d 73 67 20 6e 65 20 24 73 74 72 7d 20 7b 0a  $msg ne $str} {.
0ed0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 62          error "b
0ee0: 6c 6f 62 20 24 69 69 3a 20 24 6d 73 67 22 0a 20  lob $ii: $msg". 
0ef0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
0f00: 0a 20 20 73 65 74 20 61 62 6f 72 74 65 64 0a 7d  .  set aborted.}
0f10: 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  ..do_test incrbl
0f20: 6f 62 32 2d 34 2e 32 20 7b 0a 20 20 66 6f 72 20  ob2-4.2 {.  for 
0f30: 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20  {set ii 1} {$ii 
0f40: 3c 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d  < 100} {incr ii}
0f50: 20 7b 0a 20 20 20 20 73 65 74 20 68 61 6e 64 6c   {.    set handl
0f60: 65 73 28 24 69 69 29 20 5b 64 62 20 69 6e 63 72  es($ii) [db incr
0f70: 62 6c 6f 62 20 74 31 20 64 61 74 61 20 24 69 69  blob t1 data $ii
0f80: 5d 0a 20 20 7d 0a 20 20 61 62 6f 72 74 65 64 5f  ].  }.  aborted_
0f90: 68 61 6e 64 6c 65 73 0a 7d 20 7b 7d 0a 0a 23 20  handles.} {}..# 
0fa0: 55 70 64 61 74 65 20 72 6f 77 20 33 2e 20 54 68  Update row 3. Th
0fb0: 69 73 20 73 68 6f 75 6c 64 20 61 62 6f 72 74 20  is should abort 
0fc0: 68 61 6e 64 6c 65 20 33 20 62 75 74 20 6c 65 61  handle 3 but lea
0fd0: 76 65 20 61 6c 6c 20 6f 74 68 65 72 73 20 75 6e  ve all others un
0fe0: 74 6f 75 63 68 65 64 2e 0a 23 0a 64 6f 5f 74 65  touched..#.do_te
0ff0: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e 33  st incrblob2-4.3
1000: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 55 50   {.  db eval {UP
1010: 44 41 54 45 20 74 31 20 53 45 54 20 64 61 74 61  DATE t1 SET data
1020: 20 3d 20 64 61 74 61 20 7c 7c 20 27 27 20 57 48   = data || '' WH
1030: 45 52 45 20 69 64 20 3d 20 33 7d 0a 20 20 61 62  ERE id = 3}.  ab
1040: 6f 72 74 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20  orted_handles.} 
1050: 7b 33 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74  {3}..# Test that
1060: 20 61 20 77 72 69 74 65 20 74 6f 20 68 61 6e 64   a write to hand
1070: 6c 65 20 33 20 61 6c 73 6f 20 72 65 74 75 72 6e  le 3 also return
1080: 73 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a  s SQLITE_ABORT..
1090: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  #.do_test incrbl
10a0: 6f 62 32 2d 34 2e 33 2e 31 20 7b 0a 20 20 73 65  ob2-4.3.1 {.  se
10b0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73 71 6c  t rc [catch {sql
10c0: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20  ite3_blob_write 
10d0: 24 3a 3a 68 61 6e 64 6c 65 73 28 33 29 20 31 30  $::handles(3) 10
10e0: 20 48 45 4c 4c 4f 7d 20 6d 73 67 5d 0a 20 20 6c   HELLO} msg].  l
10f0: 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b  ist $rc $msg.} {
1100: 31 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 7d 0a  1 SQLITE_ABORT}.
1110: 0a 23 20 44 65 6c 65 74 65 20 72 6f 77 20 31 34  .# Delete row 14
1120: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 62  . This should ab
1130: 6f 72 74 20 68 61 6e 64 6c 65 20 36 20 62 75 74  ort handle 6 but
1140: 20 6c 65 61 76 65 20 61 6c 6c 20 6f 74 68 65 72   leave all other
1150: 73 20 75 6e 74 6f 75 63 68 65 64 2e 0a 23 0a 64  s untouched..#.d
1160: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
1170: 2d 34 2e 34 20 7b 0a 20 20 64 62 20 65 76 61 6c  -4.4 {.  db eval
1180: 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31   {DELETE FROM t1
1190: 20 57 48 45 52 45 20 69 64 20 3d 20 31 34 7d 0a   WHERE id = 14}.
11a0: 20 20 61 62 6f 72 74 65 64 5f 68 61 6e 64 6c 65    aborted_handle
11b0: 73 0a 7d 20 7b 33 20 31 34 7d 0a 0a 23 20 43 68  s.} {3 14}..# Ch
11c0: 61 6e 67 65 20 74 68 65 20 72 6f 77 69 64 20 6f  ange the rowid o
11d0: 66 20 72 6f 77 20 31 35 20 74 6f 20 31 30 32 2e  f row 15 to 102.
11e0: 20 53 68 6f 75 6c 64 20 61 62 6f 72 74 20 68 61   Should abort ha
11f0: 6e 64 6c 65 20 31 35 2e 0a 23 0a 64 6f 5f 74 65  ndle 15..#.do_te
1200: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e 35  st incrblob2-4.5
1210: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 55 50   {.  db eval {UP
1220: 44 41 54 45 20 74 31 20 53 45 54 20 69 64 20 3d  DATE t1 SET id =
1230: 20 31 30 32 20 57 48 45 52 45 20 69 64 20 3d 20   102 WHERE id = 
1240: 31 35 7d 0a 20 20 61 62 6f 72 74 65 64 5f 68 61  15}.  aborted_ha
1250: 6e 64 6c 65 73 0a 7d 20 7b 33 20 31 34 20 31 35  ndles.} {3 14 15
1260: 7d 0a 0a 23 20 43 6c 6f 62 62 65 72 20 72 6f 77  }..# Clobber row
1270: 20 39 32 20 75 73 69 6e 67 20 49 4e 53 45 52 54   92 using INSERT
1280: 20 4f 52 20 52 45 50 4c 41 43 45 2e 0a 23 0a 64   OR REPLACE..#.d
1290: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
12a0: 2d 34 2e 36 20 7b 0a 20 20 64 62 20 65 76 61 6c  -4.6 {.  db eval
12b0: 20 7b 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c   {INSERT OR REPL
12c0: 41 43 45 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ACE INTO t1 VALU
12d0: 45 53 28 39 32 2c 20 7a 65 72 6f 62 6c 6f 62 28  ES(92, zeroblob(
12e0: 31 30 30 30 29 29 7d 0a 20 20 61 62 6f 72 74 65  1000))}.  aborte
12f0: 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 33 20 31  d_handles.} {3 1
1300: 34 20 31 35 20 39 32 7d 0a 0a 23 20 43 6c 6f 62  4 15 92}..# Clob
1310: 62 65 72 20 72 6f 77 20 36 35 20 75 73 69 6e 67  ber row 65 using
1320: 20 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41   UPDATE OR REPLA
1330: 43 45 20 6f 6e 20 72 6f 77 20 33 35 2e 20 54 68  CE on row 35. Th
1340: 69 73 20 73 68 6f 75 6c 64 20 61 62 6f 72 74 20  is should abort 
1350: 0a 23 20 68 61 6e 64 6c 65 73 20 33 35 20 61 6e  .# handles 35 an
1360: 64 20 36 35 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  d 65..#.do_test 
1370: 69 6e 63 72 62 6c 6f 62 32 2d 34 2e 37 20 7b 0a  incrblob2-4.7 {.
1380: 20 20 64 62 20 65 76 61 6c 20 7b 55 50 44 41 54    db eval {UPDAT
1390: 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 31 20  E OR REPLACE t1 
13a0: 53 45 54 20 69 64 20 3d 20 36 35 20 57 48 45 52  SET id = 65 WHER
13b0: 45 20 69 64 20 3d 20 33 35 7d 0a 20 20 61 62 6f  E id = 35}.  abo
13c0: 72 74 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b  rted_handles.} {
13d0: 33 20 31 34 20 31 35 20 33 35 20 36 35 20 39 32  3 14 15 35 65 92
13e0: 7d 0a 0a 23 20 49 6e 73 65 72 74 20 61 20 63 6f  }..# Insert a co
13f0: 75 70 6c 65 20 6f 66 20 6e 65 77 20 72 6f 77 73  uple of new rows
1400: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  . This should no
1410: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  t invalidate any
1420: 20 68 61 6e 64 6c 65 73 2e 0a 23 0a 64 6f 5f 74   handles..#.do_t
1430: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e  est incrblob2-4.
1440: 39 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 49  9 {.  db eval {I
1450: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1460: 4c 45 43 54 20 4e 55 4c 4c 2c 20 64 61 74 61 20  LECT NULL, data 
1470: 46 52 4f 4d 20 74 31 7d 0a 20 20 61 62 6f 72 74  FROM t1}.  abort
1480: 65 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 33 20  ed_handles.} {3 
1490: 31 34 20 31 35 20 33 35 20 36 35 20 39 32 7d 0a  14 15 35 65 92}.
14a0: 0a 23 20 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f  .# Delete all ro
14b0: 77 73 20 66 72 6f 6d 20 31 20 74 6f 20 32 35 2e  ws from 1 to 25.
14c0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 62 6f   This should abo
14d0: 72 74 20 61 6c 6c 20 68 61 6e 64 6c 65 73 20 75  rt all handles u
14e0: 70 20 74 6f 20 32 35 2e 0a 23 0a 64 6f 5f 74 65  p to 25..#.do_te
14f0: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 34 2e 39  st incrblob2-4.9
1500: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 44 45   {.  db eval {DE
1510: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
1520: 52 45 20 69 64 20 3e 3d 31 20 41 4e 44 20 69 64  RE id >=1 AND id
1530: 20 3c 3d 20 32 35 7d 0a 20 20 61 62 6f 72 74 65   <= 25}.  aborte
1540: 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 31 20 32  d_handles.} {1 2
1550: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
1560: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
1570: 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30 20   16 17 18 19 20 
1580: 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 33  21 22 23 24 25 3
1590: 35 20 36 35 20 39 32 7d 0a 0a 23 20 44 65 6c 65  5 65 92}..# Dele
15a0: 74 65 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62  te the whole tab
15b0: 6c 65 20 28 74 68 69 73 20 77 69 6c 6c 20 75 73  le (this will us
15c0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  e sqlite3BtreeCl
15d0: 65 61 72 54 61 62 6c 65 28 29 29 2e 20 41 6c 6c  earTable()). All
15e0: 20 68 61 6e 64 6c 65 73 0a 23 20 73 68 6f 75 6c   handles.# shoul
15f0: 64 20 6e 6f 77 20 62 65 20 61 62 6f 72 74 65 64  d now be aborted
1600: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  ..#.do_test incr
1610: 62 6c 6f 62 32 2d 34 2e 31 30 20 7b 0a 20 20 64  blob2-4.10 {.  d
1620: 62 20 65 76 61 6c 20 7b 44 45 4c 45 54 45 20 46  b eval {DELETE F
1630: 52 4f 4d 20 74 31 7d 0a 20 20 61 62 6f 72 74 65  ROM t1}.  aborte
1640: 64 5f 68 61 6e 64 6c 65 73 0a 7d 20 7b 31 20 32  d_handles.} {1 2
1650: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
1660: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
1670: 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30 20   16 17 18 19 20 
1680: 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 32  21 22 23 24 25 2
1690: 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33 31  6 27 28 29 30 31
16a0: 20 33 32 20 33 33 20 33 34 20 33 35 20 33 36 20   32 33 34 35 36 
16b0: 33 37 20 33 38 20 33 39 20 34 30 20 34 31 20 34  37 38 39 40 41 4
16c0: 32 20 34 33 20 34 34 20 34 35 20 34 36 20 34 37  2 43 44 45 46 47
16d0: 20 34 38 20 34 39 20 35 30 20 35 31 20 35 32 20   48 49 50 51 52 
16e0: 35 33 20 35 34 20 35 35 20 35 36 20 35 37 20 35  53 54 55 56 57 5
16f0: 38 20 35 39 20 36 30 20 36 31 20 36 32 20 36 33  8 59 60 61 62 63
1700: 20 36 34 20 36 35 20 36 36 20 36 37 20 36 38 20   64 65 66 67 68 
1710: 36 39 20 37 30 20 37 31 20 37 32 20 37 33 20 37  69 70 71 72 73 7
1720: 34 20 37 35 20 37 36 20 37 37 20 37 38 20 37 39  4 75 76 77 78 79
1730: 20 38 30 20 38 31 20 38 32 20 38 33 20 38 34 20   80 81 82 83 84 
1740: 38 35 20 38 36 20 38 37 20 38 38 20 38 39 20 39  85 86 87 88 89 9
1750: 30 20 39 31 20 39 32 20 39 33 20 39 34 20 39 35  0 91 92 93 94 95
1760: 20 39 36 20 39 37 20 39 38 20 39 39 7d 0a 0a 64   96 97 98 99}..d
1770: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
1780: 2d 34 2e 31 2e 58 20 7b 0a 20 20 66 6f 72 20 7b  -4.1.X {.  for {
1790: 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69 20 3c  set ii 1} {$ii <
17a0: 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 69 7d 20   100} {incr ii} 
17b0: 7b 0a 20 20 20 20 63 6c 6f 73 65 20 24 68 61 6e  {.    close $han
17c0: 64 6c 65 73 28 24 69 69 29 20 0a 20 20 7d 0a 7d  dles($ii) .  }.}
17d0: 20 7b 7d 0a 0a 23 2d 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: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1830: 20 74 65 73 74 73 20 2d 20 69 6e 63 72 62 6c 6f   tests - incrblo
1840: 62 32 2d 35 2e 2a 20 2d 20 74 65 73 74 20 74 68  b2-5.* - test th
1850: 61 74 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  at in shared cac
1860: 68 65 20 61 6e 20 6f 70 65 6e 0a 23 20 62 6c 6f  he an open.# blo
1870: 62 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20  b handle counts 
1880: 61 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  as a read-lock o
1890: 6e 20 69 74 73 20 74 61 62 6c 65 2e 0a 23 0a 69  n its table..#.i
18a0: 66 63 61 70 61 62 6c 65 20 73 68 61 72 65 64 5f  fcapable shared_
18b0: 63 61 63 68 65 20 7b 0a 20 20 64 62 20 63 6c 6f  cache {.  db clo
18c0: 73 65 0a 20 20 73 65 74 20 3a 3a 65 6e 61 62 6c  se.  set ::enabl
18d0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b  e_shared_cache [
18e0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
18f0: 68 61 72 65 64 5f 63 61 63 68 65 20 31 5d 0a 0a  hared_cache 1]..
1900: 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c    do_test incrbl
1910: 6f 62 32 2d 35 2e 31 20 7b 0a 20 20 20 20 73 71  ob2-5.1 {.    sq
1920: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
1930: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 32  .    sqlite3 db2
1940: 20 74 65 73 74 2e 64 62 0a 0a 20 20 20 20 65 78   test.db..    ex
1950: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  ecsql {.      IN
1960: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1970: 55 45 53 28 31 2c 20 27 61 62 63 64 65 27 29 3b  UES(1, 'abcde');
1980: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  .    }.  } {}.. 
1990: 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f   do_test incrblo
19a0: 62 32 2d 35 2e 32 20 7b 0a 20 20 20 20 63 61 74  b2-5.2 {.    cat
19b0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
19c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
19d0: 20 27 66 67 68 69 6a 27 29 20 7d 20 64 62 32 0a   'fghij') } db2.
19e0: 20 20 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20 64 6f    } {0 {}}..  do
19f0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d  _test incrblob2-
1a00: 35 2e 33 20 7b 0a 20 20 20 20 73 65 74 20 62 6c  5.3 {.    set bl
1a10: 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  ob [db incrblob 
1a20: 74 31 20 64 61 74 61 20 31 5d 0a 20 20 20 20 63  t1 data 1].    c
1a30: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
1a40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1a50: 33 2c 20 27 6b 6c 6d 6e 6f 27 29 20 7d 20 64 62  3, 'klmno') } db
1a60: 32 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  2.  } {1 {databa
1a70: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 0a  se is locked}}..
1a80: 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c    do_test incrbl
1a90: 6f 62 32 2d 35 2e 34 20 7b 0a 20 20 20 20 63 6c  ob2-5.4 {.    cl
1aa0: 6f 73 65 20 24 62 6c 6f 62 0a 20 20 20 20 65 78  ose $blob.    ex
1ab0: 65 63 73 71 6c 20 42 45 47 49 4e 20 64 62 32 0a  ecsql BEGIN db2.
1ac0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
1ad0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1ae0: 4c 55 45 53 28 34 2c 20 27 70 71 72 73 74 27 29  LUES(4, 'pqrst')
1af0: 20 7d 20 64 62 32 0a 20 20 7d 20 7b 30 20 7b 7d   } db2.  } {0 {}
1b00: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63  }..  do_test inc
1b10: 72 62 6c 6f 62 32 2d 35 2e 35 20 7b 0a 20 20 20  rblob2-5.5 {.   
1b20: 20 73 65 74 20 62 6c 6f 62 20 5b 64 62 20 69 6e   set blob [db in
1b30: 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79  crblob -readonly
1b40: 20 74 31 20 64 61 74 61 20 31 5d 0a 20 20 20 20   t1 data 1].    
1b50: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
1b60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1b70: 28 35 2c 20 27 75 76 77 78 79 27 29 20 7d 20 64  (5, 'uvwxy') } d
1b80: 62 32 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62  b2.  } {1 {datab
1b90: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
1ba0: 6b 65 64 7d 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  ked}}..  do_test
1bb0: 20 69 6e 63 72 62 6c 6f 62 32 2d 35 2e 36 20 7b   incrblob2-5.6 {
1bc0: 0a 20 20 20 20 63 6c 6f 73 65 20 24 62 6c 6f 62  .    close $blob
1bd0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
1be0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1bf0: 41 4c 55 45 53 28 33 2c 20 27 6b 6c 6d 6e 6f 27  ALUES(3, 'klmno'
1c00: 29 20 7d 20 64 62 32 0a 20 20 7d 20 7b 30 20 7b  ) } db2.  } {0 {
1c10: 7d 7d 0a 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a  }}..  db2 close.
1c20: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
1c30: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
1c40: 65 64 5f 63 61 63 68 65 20 24 3a 3a 65 6e 61 62  ed_cache $::enab
1c50: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 0a  le_shared_cache.
1c60: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1cb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1cc0: 65 73 74 73 20 2d 20 69 6e 63 72 62 6c 6f 62 32  ests - incrblob2
1cd0: 2d 36 2e 2a 20 2d 20 74 65 73 74 20 61 20 73 70  -6.* - test a sp
1ce0: 65 63 69 66 69 63 20 73 63 65 6e 61 72 69 6f 20  ecific scenario 
1cf0: 74 68 61 74 20 6d 69 67 68 74 0a 23 20 62 65 20  that might.# be 
1d00: 63 61 75 73 69 6e 67 20 61 6e 20 65 72 72 6f 72  causing an error
1d10: 2e 0a 23 0a 73 71 6c 69 74 65 33 20 64 62 20 74  ..#.sqlite3 db t
1d20: 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 69  est.db.do_test i
1d30: 6e 63 72 62 6c 6f 62 32 2d 36 2e 31 20 7b 0a 20  ncrblob2-6.1 {. 
1d40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
1d50: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20  ELETE FROM t1;. 
1d60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1d70: 31 20 56 41 4c 55 45 53 28 31 2c 20 7a 65 72 6f  1 VALUES(1, zero
1d80: 62 6c 6f 62 28 31 30 30 29 29 3b 0a 20 20 7d 0a  blob(100));.  }.
1d90: 20 20 0a 20 20 73 65 74 20 72 64 48 61 6e 64 6c    .  set rdHandl
1da0: 65 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d  e [db incrblob -
1db0: 72 65 61 64 6f 6e 6c 79 20 74 31 20 64 61 74 61  readonly t1 data
1dc0: 20 31 5d 0a 20 20 73 65 74 20 77 72 48 61 6e 64   1].  set wrHand
1dd0: 6c 65 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  le [db incrblob 
1de0: 74 31 20 64 61 74 61 20 31 5d 0a 0a 20 20 73 71  t1 data 1]..  sq
1df0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20  lite3_blob_read 
1e00: 24 72 64 48 61 6e 64 6c 65 20 30 20 31 30 30 0a  $rdHandle 0 100.
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  .  sqlite3_blob_
1e20: 77 72 69 74 65 20 24 77 72 48 61 6e 64 6c 65 20  write $wrHandle 
1e30: 30 20 41 42 43 44 45 46 0a 0a 20 20 63 6c 6f 73  0 ABCDEF..  clos
1e40: 65 20 24 77 72 48 61 6e 64 6c 65 0a 20 20 63 6c  e $wrHandle.  cl
1e50: 6f 73 65 20 24 72 64 48 61 6e 64 6c 65 0a 7d 20  ose $rdHandle.} 
1e60: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  {}..do_test incr
1e70: 62 6c 6f 62 32 2d 36 2e 32 20 7b 0a 20 20 73 65  blob2-6.2 {.  se
1e80: 74 20 72 64 48 61 6e 64 6c 65 20 5b 64 62 20 69  t rdHandle [db i
1e90: 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
1ea0: 79 20 74 31 20 64 61 74 61 20 31 5d 0a 20 20 73  y t1 data 1].  s
1eb0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
1ec0: 20 24 72 64 48 61 6e 64 6c 65 20 30 20 32 0a 7d   $rdHandle 0 2.}
1ed0: 20 7b 41 42 7d 0a 0a 64 6f 5f 74 65 73 74 20 69   {AB}..do_test i
1ee0: 6e 63 72 62 6c 6f 62 32 2d 36 2e 33 20 7b 0a 20  ncrblob2-6.3 {. 
1ef0: 20 73 65 74 20 77 72 48 61 6e 64 6c 65 20 5b 64   set wrHandle [d
1f00: 62 20 69 6e 63 72 62 6c 6f 62 20 74 31 20 64 61  b incrblob t1 da
1f10: 74 61 20 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f  ta 1].  sqlite3_
1f20: 62 6c 6f 62 5f 77 72 69 74 65 20 24 77 72 48 61  blob_write $wrHa
1f30: 6e 64 6c 65 20 30 20 5a 5a 5a 5a 5a 5a 5a 5a 5a  ndle 0 ZZZZZZZZZ
1f40: 5a 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  Z.  sqlite3_blob
1f50: 5f 72 65 61 64 20 24 72 64 48 61 6e 64 6c 65 20  _read $rdHandle 
1f60: 32 20 34 0a 7d 20 7b 5a 5a 5a 5a 7d 0a 0a 64 6f  2 4.} {ZZZZ}..do
1f70: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d  _test incrblob2-
1f80: 36 2e 34 20 7b 0a 20 20 63 6c 6f 73 65 20 24 77  6.4 {.  close $w
1f90: 72 48 61 6e 64 6c 65 0a 20 20 63 6c 6f 73 65 20  rHandle.  close 
1fa0: 24 72 64 48 61 6e 64 6c 65 0a 7d 20 7b 7d 0a 0a  $rdHandle.} {}..
1fb0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
1fc0: 69 67 68 77 61 74 65 72 20 31 0a 64 6f 5f 74 65  ighwater 1.do_te
1fd0: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 37 2e 31  st incrblob2-7.1
1fe0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
1ff0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2000: 74 32 28 42 20 42 4c 4f 42 29 3b 0a 20 20 20 20  t2(B BLOB);.    
2010: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
2020: 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 62 28 31  ALUES(zeroblob(1
2030: 30 20 2a 20 31 30 32 34 20 2a 20 31 30 32 34 29  0 * 1024 * 1024)
2040: 29 3b 20 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b  ); .  }.  expr {
2050: 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f  [sqlite3_memory_
2060: 68 69 67 68 77 61 74 65 72 5d 3c 28 35 20 2a 20  highwater]<(5 * 
2070: 31 30 32 34 20 2a 20 31 30 32 34 29 7d 0a 7d 20  1024 * 1024)}.} 
2080: 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63  {1}..do_test inc
2090: 72 62 6c 6f 62 32 2d 37 2e 32 20 7b 0a 20 20 73  rblob2-7.2 {.  s
20a0: 65 74 20 68 20 5b 64 62 20 69 6e 63 72 62 6c 6f  et h [db incrblo
20b0: 62 20 74 32 20 42 20 31 5d 0a 20 20 65 78 70 72  b t2 B 1].  expr
20c0: 20 7b 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72   {[sqlite3_memor
20d0: 79 5f 68 69 67 68 77 61 74 65 72 5d 3c 28 35 20  y_highwater]<(5 
20e0: 2a 20 31 30 32 34 20 2a 20 31 30 32 34 29 7d 0a  * 1024 * 1024)}.
20f0: 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 69  } {1}..do_test i
2100: 6e 63 72 62 6c 6f 62 32 2d 37 2e 33 20 7b 0a 20  ncrblob2-7.3 {. 
2110: 20 73 65 65 6b 20 24 68 20 30 20 65 6e 64 0a 20   seek $h 0 end. 
2120: 20 74 65 6c 6c 20 24 68 0a 7d 20 5b 65 78 70 72   tell $h.} [expr
2130: 20 31 30 20 2a 20 31 30 32 34 20 2a 20 31 30 32   10 * 1024 * 102
2140: 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  4]..do_test incr
2150: 62 6c 6f 62 32 2d 37 2e 34 20 7b 0a 20 20 65 78  blob2-7.4 {.  ex
2160: 70 72 20 7b 5b 73 71 6c 69 74 65 33 5f 6d 65 6d  pr {[sqlite3_mem
2170: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 5d 3c 28  ory_highwater]<(
2180: 35 20 2a 20 31 30 32 34 20 2a 20 31 30 32 34 29  5 * 1024 * 1024)
2190: 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {1}..do_test
21a0: 20 69 6e 63 72 62 6c 6f 62 32 2d 37 2e 35 20 7b   incrblob2-7.5 {
21b0: 0a 20 20 63 6c 6f 73 65 20 24 68 0a 7d 20 7b 7d  .  close $h.} {}
21c0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2210: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2220: 65 73 74 73 2c 20 69 6e 63 72 62 6c 6f 62 32 2d  ests, incrblob2-
2230: 38 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 6e  8.*, test that n
2240: 6f 74 68 69 6e 67 20 74 65 72 72 69 62 6c 65 20  othing terrible 
2250: 68 61 70 70 65 6e 73 0a 23 20 77 68 65 6e 20 61  happens.# when a
2260: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
2270: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
2280: 20 62 61 63 6b 20 77 68 69 6c 65 20 74 68 65 72   back while ther
2290: 65 20 61 72 65 20 6f 70 65 6e 20 0a 23 20 69 6e  e are open .# in
22a0: 63 72 65 6d 65 6e 74 61 6c 2d 62 6c 6f 62 20 68  cremental-blob h
22b0: 61 6e 64 6c 65 73 2e 20 41 74 20 6f 6e 65 20 70  andles. At one p
22c0: 6f 69 6e 74 20 61 6e 20 61 73 73 65 72 74 28 29  oint an assert()
22d0: 20 77 61 73 20 66 61 69 6c 69 6e 67 20 77 68 65   was failing whe
22e0: 6e 0a 23 20 74 68 69 73 20 77 61 73 20 61 74 74  n.# this was att
22f0: 65 6d 70 74 65 64 2e 0a 23 0a 64 6f 5f 74 65 73  empted..#.do_tes
2300: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e 31 20  t incrblob2-8.1 
2310: 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47 49  {.  execsql BEGI
2320: 4e 0a 20 20 73 65 74 20 68 20 5b 64 62 20 69 6e  N.  set h [db in
2330: 63 72 62 6c 6f 62 20 74 32 20 42 20 31 5d 0a 20  crblob t2 B 1]. 
2340: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
2350: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53 45  .    db eval {SE
2360: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 20  LECT * FROM t2} 
2370: 7b 20 65 78 65 63 73 71 6c 20 22 44 52 4f 50 20  { execsql "DROP 
2380: 54 41 42 4c 45 20 74 32 22 20 7d 0a 20 20 7d 20  TABLE t2" }.  } 
2390: 6d 73 67 5d 20 0a 20 20 6c 69 73 74 20 24 72 63  msg] .  list $rc
23a0: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 64 61 74 61   $msg.} {1 {data
23b0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
23c0: 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 69  cked}}.do_test i
23d0: 6e 63 72 62 6c 6f 62 32 2d 38 2e 32 20 7b 0a 20  ncrblob2-8.2 {. 
23e0: 20 63 6c 6f 73 65 20 24 68 0a 20 20 65 78 65 63   close $h.  exec
23f0: 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d 0a  sql COMMIT.} {}.
2400: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
2410: 32 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  2-8.3 {.  execsq
2420: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
2430: 41 42 4c 45 20 74 33 28 61 20 49 4e 54 45 47 45  ABLE t3(a INTEGE
2440: 52 20 55 4e 49 51 55 45 2c 20 62 20 54 45 58 54  R UNIQUE, b TEXT
2450: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2460: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20  TO t3 VALUES(1, 
2470: 27 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61  'aaaaaaaaaaaaaaa
2480: 61 61 61 61 61 27 29 3b 0a 20 20 20 20 49 4e 53  aaaaa');.    INS
2490: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
24a0: 45 53 28 32 2c 20 27 62 62 62 62 62 62 62 62 62  ES(2, 'bbbbbbbbb
24b0: 62 62 62 62 62 62 62 62 62 62 62 27 29 3b 0a 20  bbbbbbbbbbb');. 
24c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
24d0: 33 20 56 41 4c 55 45 53 28 33 2c 20 27 63 63 63  3 VALUES(3, 'ccc
24e0: 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63  cccccccccccccccc
24f0: 63 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  c');.    INSERT 
2500: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 34  INTO t3 VALUES(4
2510: 2c 20 27 64 64 64 64 64 64 64 64 64 64 64 64 64  , 'ddddddddddddd
2520: 64 64 64 64 64 64 64 27 29 3b 0a 20 20 20 20 49  ddddddd');.    I
2530: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
2540: 4c 55 45 53 28 35 2c 20 27 65 65 65 65 65 65 65  LUES(5, 'eeeeeee
2550: 65 65 65 65 65 65 65 65 65 65 65 65 65 27 29 3b  eeeeeeeeeeeee');
2560: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
2570: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e 34 20  t incrblob2-8.4 
2580: 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45 47 49  {.  execsql BEGI
2590: 4e 0a 20 20 73 65 74 20 68 20 5b 64 62 20 69 6e  N.  set h [db in
25a0: 63 72 62 6c 6f 62 20 74 33 20 62 20 33 5d 0a 20  crblob t3 b 3]. 
25b0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
25c0: 61 64 20 24 68 20 30 20 32 30 0a 7d 20 7b 63 63  ad $h 0 20.} {cc
25d0: 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63  cccccccccccccccc
25e0: 63 63 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  cc}.do_test incr
25f0: 62 6c 6f 62 32 2d 38 2e 35 20 7b 0a 20 20 63 61  blob2-8.5 {.  ca
2600: 74 63 68 73 71 6c 20 7b 55 50 44 41 54 45 20 74  tchsql {UPDATE t
2610: 33 20 53 45 54 20 61 20 3d 20 36 20 57 48 45 52  3 SET a = 6 WHER
2620: 45 20 61 20 3e 20 33 7d 0a 7d 20 7b 31 20 7b 63  E a > 3}.} {1 {c
2630: 6f 6c 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20 75  olumn a is not u
2640: 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20  nique}}.do_test 
2650: 69 6e 63 72 62 6c 6f 62 32 2d 38 2e 36 20 7b 0a  incrblob2-8.6 {.
2660: 20 20 63 61 74 63 68 73 71 6c 20 7b 55 50 44 41    catchsql {UPDA
2670: 54 45 20 74 33 20 53 45 54 20 61 20 3d 20 36 20  TE t3 SET a = 6 
2680: 57 48 45 52 45 20 61 20 3e 20 33 7d 0a 7d 20 7b  WHERE a > 3}.} {
2690: 31 20 7b 63 6f 6c 75 6d 6e 20 61 20 69 73 20 6e  1 {column a is n
26a0: 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74  ot unique}}.do_t
26b0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e  est incrblob2-8.
26c0: 37 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  7 {.  sqlite3_bl
26d0: 6f 62 5f 72 65 61 64 20 24 68 20 30 20 32 30 0a  ob_read $h 0 20.
26e0: 7d 20 7b 63 63 63 63 63 63 63 63 63 63 63 63 63  } {ccccccccccccc
26f0: 63 63 63 63 63 63 63 7d 0a 64 6f 5f 74 65 73 74  ccccccc}.do_test
2700: 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e 38 20 7b   incrblob2-8.8 {
2710: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 55 50 44  .  catchsql {UPD
2720: 41 54 45 20 74 33 20 53 45 54 20 61 20 3d 20 36  ATE t3 SET a = 6
2730: 20 57 48 45 52 45 20 61 20 3d 20 33 20 4f 52 20   WHERE a = 3 OR 
2740: 61 20 3d 20 35 7d 0a 7d 20 7b 31 20 7b 63 6f 6c  a = 5}.} {1 {col
2750: 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20 75 6e 69  umn a is not uni
2760: 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  que}}.do_test in
2770: 63 72 62 6c 6f 62 32 2d 38 2e 39 20 7b 0a 20 20  crblob2-8.9 {.  
2780: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73  set rc [catch {s
2790: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
27a0: 20 24 68 20 30 20 32 30 7d 20 6d 73 67 5d 0a 20   $h 0 20} msg]. 
27b0: 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d   list $rc $msg.}
27c0: 20 7b 31 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   {1 SQLITE_ABORT
27d0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  }.do_test incrbl
27e0: 6f 62 32 2d 38 2e 58 20 7b 0a 20 20 63 6c 6f 73  ob2-8.X {.  clos
27f0: 65 20 24 68 0a 7d 20 7b 7d 0a 0a 66 69 6e 69 73  e $h.} {}..finis
2800: 68 5f 74 65 73 74 0a                             h_test.