/ Hex Artifact Content
Login

Artifact a5ce5ed1d0b01e2ed347245a21170372528af0a5:


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 6c 61 70 70 65 6e 64 20  sg].    lappend 
2080: 72 63 20 24 65 72 72 6d 73 67 0a 20 20 7d 20 7b  rc $errmsg.  } {
2090: 31 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a  1 SQLITE_ERROR}.
20a0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  }.do_test incrbl
20b0: 6f 62 32 2d 36 2e 32 63 20 7b 0a 20 20 73 65 74  ob2-6.2c {.  set
20c0: 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20   rc [catch {.   
20d0: 20 23 20 50 72 69 6f 72 20 74 6f 20 32 30 31 35   # Prior to 2015
20e0: 2d 30 32 2d 30 37 2c 20 74 68 65 20 66 6f 6c 6c  -02-07, the foll
20f0: 6f 77 69 6e 67 20 63 61 75 73 65 64 20 61 20 73  owing caused a s
2100: 65 67 66 61 75 6c 74 20 64 75 65 20 74 6f 0a 20  egfault due to. 
2110: 20 20 20 23 20 69 6e 74 65 67 65 72 20 6f 76 65     # integer ove
2120: 72 66 6c 6f 77 2e 0a 20 20 20 20 73 71 6c 69 74  rflow..    sqlit
2130: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24 72 64  e3_blob_read $rd
2140: 48 61 6e 64 6c 65 20 32 31 34 37 34 38 33 36 34  Handle 214748364
2150: 37 20 31 30 30 0a 20 20 7d 20 65 72 72 6d 73 67  7 100.  } errmsg
2160: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24  ].  lappend rc $
2170: 65 72 72 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49  errmsg.} {1 SQLI
2180: 54 45 5f 45 52 52 4f 52 7d 0a 0a 64 6f 5f 74 65  TE_ERROR}..do_te
2190: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 36 2e 33  st incrblob2-6.3
21a0: 20 7b 0a 20 20 73 65 74 20 77 72 48 61 6e 64 6c   {.  set wrHandl
21b0: 65 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 74  e [db incrblob t
21c0: 31 20 64 61 74 61 20 31 5d 0a 20 20 73 71 6c 69  1 data 1].  sqli
21d0: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24  te3_blob_write $
21e0: 77 72 48 61 6e 64 6c 65 20 30 20 5a 5a 5a 5a 5a  wrHandle 0 ZZZZZ
21f0: 5a 5a 5a 5a 5a 0a 20 20 73 71 6c 69 74 65 33 5f  ZZZZZ.  sqlite3_
2200: 62 6c 6f 62 5f 72 65 61 64 20 24 72 64 48 61 6e  blob_read $rdHan
2210: 64 6c 65 20 32 20 34 0a 7d 20 7b 5a 5a 5a 5a 7d  dle 2 4.} {ZZZZ}
2220: 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  ..do_test incrbl
2230: 6f 62 32 2d 36 2e 33 62 20 7b 0a 20 20 73 65 74  ob2-6.3b {.  set
2240: 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20   rc [catch {.   
2250: 20 23 20 50 72 69 6f 72 20 74 6f 20 32 30 31 35   # Prior to 2015
2260: 2d 30 32 2d 30 37 2c 20 74 68 65 20 66 6f 6c 6c  -02-07, the foll
2270: 6f 77 69 6e 67 20 63 61 75 73 65 64 20 61 20 73  owing caused a s
2280: 65 67 66 61 75 6c 74 20 64 75 65 20 74 6f 0a 20  egfault due to. 
2290: 20 20 20 23 20 69 6e 74 65 67 65 72 20 6f 76 65     # integer ove
22a0: 72 66 6c 6f 77 2e 0a 20 20 20 20 73 71 6c 69 74  rflow..    sqlit
22b0: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24 77  e3_blob_write $w
22c0: 72 48 61 6e 64 6c 65 20 32 31 34 37 34 38 33 36  rHandle 21474836
22d0: 34 37 20 59 59 59 59 59 59 59 59 59 59 59 59 59  47 YYYYYYYYYYYYY
22e0: 59 59 59 59 59 0a 20 20 7d 20 65 72 72 6d 73 67  YYYYY.  } errmsg
22f0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24  ].  lappend rc $
2300: 65 72 72 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49  errmsg.} {1 SQLI
2310: 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73  TE_ERROR}.do_tes
2320: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 36 2e 33 63  t incrblob2-6.3c
2330: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f   {.  sqlite3_blo
2340: 62 5f 72 65 61 64 20 24 72 64 48 61 6e 64 6c 65  b_read $rdHandle
2350: 20 32 20 34 0a 7d 20 7b 5a 5a 5a 5a 7d 0a 0a 0a   2 4.} {ZZZZ}...
2360: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
2370: 32 2d 36 2e 34 20 7b 0a 20 20 63 6c 6f 73 65 20  2-6.4 {.  close 
2380: 24 77 72 48 61 6e 64 6c 65 0a 20 20 63 6c 6f 73  $wrHandle.  clos
2390: 65 20 24 72 64 48 61 6e 64 6c 65 0a 7d 20 7b 7d  e $rdHandle.} {}
23a0: 0a 0a 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  ..sqlite3_memory
23b0: 5f 68 69 67 68 77 61 74 65 72 20 31 0a 64 6f 5f  _highwater 1.do_
23c0: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 37  test incrblob2-7
23d0: 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .1 {.  db eval {
23e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
23f0: 45 20 74 32 28 42 20 42 4c 4f 42 29 3b 0a 20 20  E t2(B BLOB);.  
2400: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2410: 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 62   VALUES(zeroblob
2420: 28 31 30 20 2a 20 31 30 32 34 20 2a 20 31 30 32  (10 * 1024 * 102
2430: 34 29 29 3b 20 0a 20 20 7d 0a 20 20 65 78 70 72  4)); .  }.  expr
2440: 20 7b 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72   {[sqlite3_memor
2450: 79 5f 68 69 67 68 77 61 74 65 72 5d 3c 28 35 20  y_highwater]<(5 
2460: 2a 20 31 30 32 34 20 2a 20 31 30 32 34 29 7d 0a  * 1024 * 1024)}.
2470: 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 69  } {1}..do_test i
2480: 6e 63 72 62 6c 6f 62 32 2d 37 2e 32 20 7b 0a 20  ncrblob2-7.2 {. 
2490: 20 73 65 74 20 68 20 5b 64 62 20 69 6e 63 72 62   set h [db incrb
24a0: 6c 6f 62 20 74 32 20 42 20 31 5d 0a 20 20 65 78  lob t2 B 1].  ex
24b0: 70 72 20 7b 5b 73 71 6c 69 74 65 33 5f 6d 65 6d  pr {[sqlite3_mem
24c0: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 5d 3c 28  ory_highwater]<(
24d0: 35 20 2a 20 31 30 32 34 20 2a 20 31 30 32 34 29  5 * 1024 * 1024)
24e0: 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {1}..do_test
24f0: 20 69 6e 63 72 62 6c 6f 62 32 2d 37 2e 33 20 7b   incrblob2-7.3 {
2500: 0a 20 20 73 65 65 6b 20 24 68 20 30 20 65 6e 64  .  seek $h 0 end
2510: 0a 20 20 74 65 6c 6c 20 24 68 0a 7d 20 5b 65 78  .  tell $h.} [ex
2520: 70 72 20 31 30 20 2a 20 31 30 32 34 20 2a 20 31  pr 10 * 1024 * 1
2530: 30 32 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e  024]..do_test in
2540: 63 72 62 6c 6f 62 32 2d 37 2e 34 20 7b 0a 20 20  crblob2-7.4 {.  
2550: 65 78 70 72 20 7b 5b 73 71 6c 69 74 65 33 5f 6d  expr {[sqlite3_m
2560: 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 5d  emory_highwater]
2570: 3c 28 35 20 2a 20 31 30 32 34 20 2a 20 31 30 32  <(5 * 1024 * 102
2580: 34 29 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 74 65  4)}.} {1}..do_te
2590: 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 37 2e 35  st incrblob2-7.5
25a0: 20 7b 0a 20 20 63 6c 6f 73 65 20 24 68 0a 7d 20   {.  close $h.} 
25b0: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2600: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
2610: 20 74 65 73 74 73 2c 20 69 6e 63 72 62 6c 6f 62   tests, incrblob
2620: 32 2d 38 2e 2a 2c 20 74 65 73 74 20 74 68 61 74  2-8.*, test that
2630: 20 6e 6f 74 68 69 6e 67 20 74 65 72 72 69 62 6c   nothing terribl
2640: 65 20 68 61 70 70 65 6e 73 0a 23 20 77 68 65 6e  e happens.# when
2650: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
2660: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
2670: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 74 68  ed back while th
2680: 65 72 65 20 61 72 65 20 6f 70 65 6e 20 0a 23 20  ere are open .# 
2690: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 62 6c 6f 62  incremental-blob
26a0: 20 68 61 6e 64 6c 65 73 2e 20 41 74 20 6f 6e 65   handles. At one
26b0: 20 70 6f 69 6e 74 20 61 6e 20 61 73 73 65 72 74   point an assert
26c0: 28 29 20 77 61 73 20 66 61 69 6c 69 6e 67 20 77  () was failing w
26d0: 68 65 6e 0a 23 20 74 68 69 73 20 77 61 73 20 61  hen.# this was a
26e0: 74 74 65 6d 70 74 65 64 2e 0a 23 0a 64 6f 5f 74  ttempted..#.do_t
26f0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e  est incrblob2-8.
2700: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45  1 {.  execsql BE
2710: 47 49 4e 0a 20 20 73 65 74 20 68 20 5b 64 62 20  GIN.  set h [db 
2720: 69 6e 63 72 62 6c 6f 62 20 74 32 20 42 20 31 5d  incrblob t2 B 1]
2730: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2740: 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b   {.    db eval {
2750: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
2760: 4d 20 74 32 7d 20 7b 20 65 78 65 63 73 71 6c 20  M t2} { execsql 
2770: 22 44 52 4f 50 20 54 41 42 4c 45 20 74 32 22 20  "DROP TABLE t2" 
2780: 7d 0a 20 20 7d 20 6d 73 67 5d 20 0a 20 20 6c 69  }.  } msg] .  li
2790: 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31  st $rc $msg.} {1
27a0: 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   {database table
27b0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f   is locked}}.do_
27c0: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38  test incrblob2-8
27d0: 2e 32 20 7b 0a 20 20 63 6c 6f 73 65 20 24 68 0a  .2 {.  close $h.
27e0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
27f0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  .} {}.do_test in
2800: 63 72 62 6c 6f 62 32 2d 38 2e 33 20 7b 0a 20 20  crblob2-8.3 {.  
2810: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2820: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 20  EATE TABLE t3(a 
2830: 49 4e 54 45 47 45 52 20 55 4e 49 51 55 45 2c 20  INTEGER UNIQUE, 
2840: 62 20 54 45 58 54 29 3b 0a 20 20 20 20 49 4e 53  b TEXT);.    INS
2850: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
2860: 45 53 28 31 2c 20 27 61 61 61 61 61 61 61 61 61  ES(1, 'aaaaaaaaa
2870: 61 61 61 61 61 61 61 61 61 61 61 27 29 3b 0a 20  aaaaaaaaaaa');. 
2880: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2890: 33 20 56 41 4c 55 45 53 28 32 2c 20 27 62 62 62  3 VALUES(2, 'bbb
28a0: 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62  bbbbbbbbbbbbbbbb
28b0: 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b');.    INSERT 
28c0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33  INTO t3 VALUES(3
28d0: 2c 20 27 63 63 63 63 63 63 63 63 63 63 63 63 63  , 'ccccccccccccc
28e0: 63 63 63 63 63 63 63 27 29 3b 0a 20 20 20 20 49  ccccccc');.    I
28f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
2900: 4c 55 45 53 28 34 2c 20 27 64 64 64 64 64 64 64  LUES(4, 'ddddddd
2910: 64 64 64 64 64 64 64 64 64 64 64 64 64 27 29 3b  ddddddddddddd');
2920: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2930: 20 74 33 20 56 41 4c 55 45 53 28 35 2c 20 27 65   t3 VALUES(5, 'e
2940: 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65  eeeeeeeeeeeeeeee
2950: 65 65 65 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  eee');.  }.} {}.
2960: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
2970: 32 2d 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  2-8.4 {.  execsq
2980: 6c 20 42 45 47 49 4e 0a 20 20 73 65 74 20 68 20  l BEGIN.  set h 
2990: 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 74 33 20  [db incrblob t3 
29a0: 62 20 33 5d 0a 20 20 73 71 6c 69 74 65 33 5f 62  b 3].  sqlite3_b
29b0: 6c 6f 62 5f 72 65 61 64 20 24 68 20 30 20 32 30  lob_read $h 0 20
29c0: 0a 7d 20 7b 63 63 63 63 63 63 63 63 63 63 63 63  .} {cccccccccccc
29d0: 63 63 63 63 63 63 63 63 7d 0a 64 6f 5f 74 65 73  cccccccc}.do_tes
29e0: 74 20 69 6e 63 72 62 6c 6f 62 32 2d 38 2e 35 20  t incrblob2-8.5 
29f0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 55 50  {.  catchsql {UP
2a00: 44 41 54 45 20 74 33 20 53 45 54 20 61 20 3d 20  DATE t3 SET a = 
2a10: 36 20 57 48 45 52 45 20 61 20 3e 20 33 7d 0a 7d  6 WHERE a > 3}.}
2a20: 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73   {1 {UNIQUE cons
2a30: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74  traint failed: t
2a40: 33 2e 61 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  3.a}}.do_test in
2a50: 63 72 62 6c 6f 62 32 2d 38 2e 36 20 7b 0a 20 20  crblob2-8.6 {.  
2a60: 63 61 74 63 68 73 71 6c 20 7b 55 50 44 41 54 45  catchsql {UPDATE
2a70: 20 74 33 20 53 45 54 20 61 20 3d 20 36 20 57 48   t3 SET a = 6 WH
2a80: 45 52 45 20 61 20 3e 20 33 7d 0a 7d 20 7b 31 20  ERE a > 3}.} {1 
2a90: 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  {UNIQUE constrai
2aa0: 6e 74 20 66 61 69 6c 65 64 3a 20 74 33 2e 61 7d  nt failed: t3.a}
2ab0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  }.do_test incrbl
2ac0: 6f 62 32 2d 38 2e 37 20 7b 0a 20 20 73 71 6c 69  ob2-8.7 {.  sqli
2ad0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24 68  te3_blob_read $h
2ae0: 20 30 20 32 30 0a 7d 20 7b 63 63 63 63 63 63 63   0 20.} {ccccccc
2af0: 63 63 63 63 63 63 63 63 63 63 63 63 63 7d 0a 64  ccccccccccccc}.d
2b00: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 32  o_test incrblob2
2b10: 2d 38 2e 38 20 7b 0a 20 20 63 61 74 63 68 73 71  -8.8 {.  catchsq
2b20: 6c 20 7b 55 50 44 41 54 45 20 74 33 20 53 45 54  l {UPDATE t3 SET
2b30: 20 61 20 3d 20 36 20 57 48 45 52 45 20 61 20 3d   a = 6 WHERE a =
2b40: 20 33 20 4f 52 20 61 20 3d 20 35 7d 0a 7d 20 7b   3 OR a = 5}.} {
2b50: 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  1 {UNIQUE constr
2b60: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 33 2e  aint failed: t3.
2b70: 61 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  a}}.do_test incr
2b80: 62 6c 6f 62 32 2d 38 2e 39 20 7b 0a 20 20 73 65  blob2-8.9 {.  se
2b90: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73 71 6c  t rc [catch {sql
2ba0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24  ite3_blob_read $
2bb0: 68 20 30 20 32 30 7d 20 6d 73 67 5d 0a 20 20 6c  h 0 20} msg].  l
2bc0: 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b  ist $rc $msg.} {
2bd0: 31 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 7d 0a  1 SQLITE_ABORT}.
2be0: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
2bf0: 32 2d 38 2e 58 20 7b 0a 20 20 63 6c 6f 73 65 20  2-8.X {.  close 
2c00: 24 68 0a 7d 20 7b 7d 0a 0a 66 69 6e 69 73 68 5f  $h.} {}..finish_
2c10: 74 65 73 74 0a                                   test.