/ Hex Artifact Content
Login

Artifact e557f262cd2cc088e6bb4d154575a1bbe242edcd:


0000: 23 20 32 30 30 37 20 4d 61 79 20 31 0a 23 0a 23  # 2007 May 1.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 0a 23 20 24 49 64 3a 20 69 6e 63 72  **.#.# $Id: incr
0170: 62 6c 6f 62 2e 74 65 73 74 2c 76 20 31 2e 32 34  blob.test,v 1.24
0180: 20 32 30 30 39 2f 30 36 2f 31 39 20 32 32 3a 32   2009/06/19 22:2
0190: 33 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a 23  3:42 drh Exp $.#
01a0: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
01b0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
01c0: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
01d0: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
01e0: 69 66 63 61 70 61 62 6c 65 20 7b 21 61 75 74 6f  ifcapable {!auto
01f0: 76 61 63 75 75 6d 20 7c 7c 20 21 70 72 61 67 6d  vacuum || !pragm
0200: 61 20 7c 7c 20 21 69 6e 63 72 62 6c 6f 62 7d 20  a || !incrblob} 
0210: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  {.  finish_test.
0220: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 74    return.}..do_t
0230: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 31 2e 31  est incrblob-1.1
0240: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0250: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0260: 62 6c 6f 62 73 28 6b 20 50 52 49 4d 41 52 59 20  blobs(k PRIMARY 
0270: 4b 45 59 2c 20 76 20 42 4c 4f 42 29 3b 0a 20 20  KEY, v BLOB);.  
0280: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c    INSERT INTO bl
0290: 6f 62 73 20 56 41 4c 55 45 53 28 27 6f 6e 65 27  obs VALUES('one'
02a0: 2c 20 58 27 30 31 30 32 30 33 30 34 30 35 30 36  , X'010203040506
02b0: 30 37 30 38 30 39 30 41 27 29 3b 0a 20 20 20 20  0708090A');.    
02c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f 62  INSERT INTO blob
02d0: 73 20 56 41 4c 55 45 53 28 27 74 77 6f 27 2c 20  s VALUES('two', 
02e0: 58 27 30 41 30 39 30 38 30 37 30 36 30 35 30 34  X'0A090807060504
02f0: 30 33 30 32 30 31 27 29 3b 0a 20 20 7d 0a 7d 20  030201');.  }.} 
0300: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  {}..do_test incr
0310: 62 6c 6f 62 2d 31 2e 32 2e 31 20 7b 0a 20 20 73  blob-1.2.1 {.  s
0320: 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69 6e  et ::blob [db in
0330: 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 76 20 31  crblob blobs v 1
0340: 5d 0a 20 20 73 74 72 69 6e 67 20 6d 61 74 63 68  ].  string match
0350: 20 69 6e 63 72 62 6c 6f 62 5f 2a 20 24 3a 3a 62   incrblob_* $::b
0360: 6c 6f 62 0a 7d 20 7b 31 7d 0a 75 6e 73 65 74 20  lob.} {1}.unset 
0370: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 64 61 74 61  -nocomplain data
0380: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
0390: 62 2d 31 2e 32 2e 32 20 7b 0a 20 20 62 69 6e 61  b-1.2.2 {.  bina
03a0: 72 79 20 73 63 61 6e 20 5b 72 65 61 64 20 24 3a  ry scan [read $:
03b0: 3a 62 6c 6f 62 5d 20 63 2a 20 64 61 74 61 0a 20  :blob] c* data. 
03c0: 20 73 65 74 20 64 61 74 61 0a 7d 20 7b 31 20 32   set data.} {1 2
03d0: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
03e0: 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  0}.do_test incrb
03f0: 6c 6f 62 2d 31 2e 32 2e 33 20 7b 0a 20 20 73 65  lob-1.2.3 {.  se
0400: 65 6b 20 24 3a 3a 62 6c 6f 62 20 30 0a 20 20 70  ek $::blob 0.  p
0410: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
0420: 3a 3a 62 6c 6f 62 20 22 31 32 33 34 35 36 37 38  ::blob "12345678
0430: 39 30 22 0a 20 20 66 6c 75 73 68 20 24 3a 3a 62  90".  flush $::b
0440: 6c 6f 62 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  lob.} {}.do_test
0450: 20 69 6e 63 72 62 6c 6f 62 2d 31 2e 32 2e 34 20   incrblob-1.2.4 
0460: 7b 0a 20 20 73 65 65 6b 20 24 3a 3a 62 6c 6f 62  {.  seek $::blob
0470: 20 30 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e   0.  binary scan
0480: 20 5b 72 65 61 64 20 24 3a 3a 62 6c 6f 62 5d 20   [read $::blob] 
0490: 63 2a 20 64 61 74 61 0a 20 20 73 65 74 20 64 61  c* data.  set da
04a0: 74 61 0a 7d 20 7b 34 39 20 35 30 20 35 31 20 35  ta.} {49 50 51 5
04b0: 32 20 35 33 20 35 34 20 35 35 20 35 36 20 35 37  2 53 54 55 56 57
04c0: 20 34 38 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63   48}.do_test inc
04d0: 72 62 6c 6f 62 2d 31 2e 32 2e 35 20 7b 0a 20 20  rblob-1.2.5 {.  
04e0: 63 6c 6f 73 65 20 24 3a 3a 62 6c 6f 62 0a 7d 20  close $::blob.} 
04f0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  {}.do_test incrb
0500: 6c 6f 62 2d 31 2e 32 2e 36 20 7b 0a 20 20 65 78  lob-1.2.6 {.  ex
0510: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0520: 43 54 20 76 20 46 52 4f 4d 20 62 6c 6f 62 73 20  CT v FROM blobs 
0530: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31 3b  WHERE rowid = 1;
0540: 0a 20 20 7d 0a 7d 20 7b 31 32 33 34 35 36 37 38  .  }.} {12345678
0550: 39 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  90}..#----------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
05a0: 74 20 63 61 73 65 73 20 69 6e 63 72 62 6c 6f 62  t cases incrblob
05b0: 2d 31 2e 33 2e 58 20 63 68 65 63 6b 20 74 68 61  -1.3.X check tha
05c0: 74 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  t it is possible
05d0: 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72 69   to read and wri
05e0: 74 65 0a 23 20 72 65 67 69 6f 6e 73 20 6f 66 20  te.# regions of 
05f0: 61 20 62 6c 6f 62 20 74 68 61 74 20 6c 69 65 20  a blob that lie 
0600: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
0610: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63  s..#.do_test inc
0620: 72 62 6c 6f 62 2d 31 2e 33 2e 31 20 7b 0a 20 20  rblob-1.3.1 {.  
0630: 73 65 74 20 3a 3a 73 74 72 20 22 5b 73 74 72 69  set ::str "[stri
0640: 6e 67 20 72 65 70 65 61 74 20 2e 20 31 30 30 30  ng repeat . 1000
0650: 30 5d 22 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0]".  execsql {.
0660: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0670: 62 6c 6f 62 73 28 72 6f 77 69 64 2c 20 6b 2c 20  blobs(rowid, k, 
0680: 76 29 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68  v) VALUES(3, 'th
0690: 72 65 65 27 2c 20 24 3a 3a 73 74 72 29 3b 0a 20  ree', $::str);. 
06a0: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
06b0: 20 69 6e 63 72 62 6c 6f 62 2d 31 2e 33 2e 32 20   incrblob-1.3.2 
06c0: 7b 0a 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b  {.  set ::blob [
06d0: 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62  db incrblob blob
06e0: 73 20 76 20 33 5d 0a 20 20 73 65 65 6b 20 24 3a  s v 3].  seek $:
06f0: 3a 62 6c 6f 62 20 38 35 30 30 0a 20 20 72 65 61  :blob 8500.  rea
0700: 64 20 24 3a 3a 62 6c 6f 62 20 31 30 0a 7d 20 7b  d $::blob 10.} {
0710: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 64 6f 5f 74  ..........}.do_t
0720: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 31 2e 33  est incrblob-1.3
0730: 2e 33 20 7b 0a 20 20 73 65 65 6b 20 24 3a 3a 62  .3 {.  seek $::b
0740: 6c 6f 62 20 38 35 30 30 0a 20 20 70 75 74 73 20  lob 8500.  puts 
0750: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 3a 3a 62 6c  -nonewline $::bl
0760: 6f 62 20 31 32 33 34 35 36 37 38 39 30 0a 7d 20  ob 1234567890.} 
0770: 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  {}.do_test incrb
0780: 6c 6f 62 2d 31 2e 33 2e 34 20 7b 0a 20 20 73 65  lob-1.3.4 {.  se
0790: 65 6b 20 24 3a 3a 62 6c 6f 62 20 38 34 39 36 0a  ek $::blob 8496.
07a0: 20 20 72 65 61 64 20 24 3a 3a 62 6c 6f 62 20 31    read $::blob 1
07b0: 30 0a 7d 20 7b 2e 2e 2e 2e 31 32 33 34 35 36 7d  0.} {....123456}
07c0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
07d0: 62 2d 31 2e 33 2e 31 30 20 7b 0a 20 20 63 6c 6f  b-1.3.10 {.  clo
07e0: 73 65 20 24 3a 3a 62 6c 6f 62 0a 7d 20 7b 7d 0a  se $::blob.} {}.
07f0: 0a 23 2d 2d 2d 2d 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 0a 23 20 69 6e 63  ----------.# inc
0840: 72 62 6c 6f 62 2d 32 2e 2a 3a 20 0a 23 0a 23 20  rblob-2.*: .#.# 
0850: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 66 6f  Test that the fo
0860: 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
0870: 6e 73 20 75 73 65 20 70 74 72 6d 61 70 20 70 61  ns use ptrmap pa
0880: 67 65 73 20 74 6f 20 72 65 64 75 63 65 0a 23 20  ges to reduce.# 
0890: 75 6e 6e 65 63 65 73 73 61 72 79 20 72 65 61 64  unnecessary read
08a0: 73 3a 0a 23 0a 23 20 20 20 20 20 2a 20 52 65 61  s:.#.#     * Rea
08b0: 64 69 6e 67 20 6e 65 61 72 20 74 68 65 20 65 6e  ding near the en
08c0: 64 20 6f 66 20 61 20 62 6c 6f 62 2c 0a 23 20 20  d of a blob,.#  
08d0: 20 20 20 2a 20 57 72 69 74 69 6e 67 20 6e 65 61     * Writing nea
08e0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 62  r the end of a b
08f0: 6c 6f 62 2c 20 61 6e 64 0a 23 20 20 20 20 20 2a  lob, and.#     *
0900: 20 53 45 4c 45 43 54 20 61 20 63 6f 6c 75 6d 6e   SELECT a column
0910: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6c   value that is l
0920: 6f 63 61 74 65 64 20 6f 6e 20 61 6e 20 6f 76 65  ocated on an ove
0930: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 23 0a 70 72  rflow page..#.pr
0940: 6f 63 20 6e 52 65 61 64 20 7b 64 62 7d 20 7b 0a  oc nRead {db} {.
0950: 20 20 73 65 74 20 62 74 20 5b 62 74 72 65 65 5f    set bt [btree_
0960: 66 72 6f 6d 5f 64 62 20 24 64 62 5d 0a 20 20 64  from_db $db].  d
0970: 62 5f 65 6e 74 65 72 20 24 64 62 0a 20 20 61 72  b_enter $db.  ar
0980: 72 61 79 20 73 65 74 20 73 74 61 74 73 20 5b 62  ray set stats [b
0990: 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61 74 73  tree_pager_stats
09a0: 20 24 62 74 5d 0a 20 20 64 62 5f 6c 65 61 76 65   $bt].  db_leave
09b0: 20 24 64 62 0a 20 20 72 65 74 75 72 6e 20 24 73   $db.  return $s
09c0: 74 61 74 73 28 72 65 61 64 29 0a 7d 0a 70 72 6f  tats(read).}.pro
09d0: 63 20 6e 57 72 69 74 65 20 7b 64 62 7d 20 7b 0a  c nWrite {db} {.
09e0: 20 20 73 65 74 20 62 74 20 5b 62 74 72 65 65 5f    set bt [btree_
09f0: 66 72 6f 6d 5f 64 62 20 24 64 62 5d 0a 20 20 64  from_db $db].  d
0a00: 62 5f 65 6e 74 65 72 20 24 64 62 0a 20 20 61 72  b_enter $db.  ar
0a10: 72 61 79 20 73 65 74 20 73 74 61 74 73 20 5b 62  ray set stats [b
0a20: 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61 74 73  tree_pager_stats
0a30: 20 24 62 74 5d 0a 20 20 64 62 5f 6c 65 61 76 65   $bt].  db_leave
0a40: 20 24 64 62 0a 20 20 72 65 74 75 72 6e 20 24 73   $db.  return $s
0a50: 74 61 74 73 28 77 72 69 74 65 29 0a 7d 0a 0a 73  tats(write).}..s
0a60: 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
0a70: 5f 6c 69 6d 69 74 20 30 0a 0a 66 6f 72 65 61 63  _limit 0..foreac
0a80: 68 20 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65  h AutoVacuumMode
0a90: 20 5b 6c 69 73 74 20 30 20 31 5d 20 7b 0a 0a 20   [list 0 1] {.. 
0aa0: 20 69 66 20 7b 24 41 75 74 6f 56 61 63 75 75 6d   if {$AutoVacuum
0ab0: 4d 6f 64 65 3e 30 7d 20 7b 0a 20 20 20 20 69 66  Mode>0} {.    if
0ac0: 63 61 70 61 62 6c 65 20 21 61 75 74 6f 76 61 63  capable !autovac
0ad0: 75 75 6d 20 7b 0a 20 20 20 20 20 20 62 72 65 61  uum {.      brea
0ae0: 6b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  k.    }.  }..  d
0af0: 62 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 64  b close.  file d
0b00: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
0b10: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 6a 6f 75  t.db test.db-jou
0b20: 72 6e 61 6c 0a 0a 20 20 73 71 6c 69 74 65 33 20  rnal..  sqlite3 
0b30: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
0b40: 63 73 71 6c 20 22 50 52 41 47 4d 41 20 61 75 74  csql "PRAGMA aut
0b50: 6f 5f 76 61 63 75 75 6d 20 3d 20 24 41 75 74 6f  o_vacuum = $Auto
0b60: 56 61 63 75 75 6d 4d 6f 64 65 22 0a 0a 20 20 64  VacuumMode"..  d
0b70: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
0b80: 32 2e 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64  2.$AutoVacuumMod
0b90: 65 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a  e.1 {.    set ::
0ba0: 73 74 72 20 5b 73 74 72 69 6e 67 20 72 65 70 65  str [string repe
0bb0: 61 74 20 61 62 63 64 65 66 67 68 69 6a 20 32 39  at abcdefghij 29
0bc0: 30 30 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  00].    execsql 
0bd0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
0be0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
0bf0: 45 20 62 6c 6f 62 73 28 6b 20 50 52 49 4d 41 52  E blobs(k PRIMAR
0c00: 59 20 4b 45 59 2c 20 76 20 42 4c 4f 42 2c 20 69  Y KEY, v BLOB, i
0c10: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
0c20: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 62 6c 6f   DELETE FROM blo
0c30: 62 73 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  bs;.      INSERT
0c40: 20 49 4e 54 4f 20 62 6c 6f 62 73 20 56 41 4c 55   INTO blobs VALU
0c50: 45 53 28 27 6f 6e 65 27 2c 20 24 3a 3a 73 74 72  ES('one', $::str
0c60: 20 7c 7c 20 72 61 6e 64 73 74 72 28 35 30 30 2c   || randstr(500,
0c70: 35 30 30 29 2c 20 34 35 29 3b 0a 20 20 20 20 20  500), 45);.     
0c80: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 0a 20   COMMIT;.    }. 
0c90: 20 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69     expr [file si
0ca0: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
0cb0: 0a 20 20 7d 20 5b 65 78 70 72 20 33 31 20 2b 20  .  } [expr 31 + 
0cc0: 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65 5d  $AutoVacuumMode]
0cd0: 0a 0a 20 20 69 66 63 61 70 61 62 6c 65 20 61 75  ..  ifcapable au
0ce0: 74 6f 76 61 63 75 75 6d 20 7b 0a 20 20 20 20 64  tovacuum {.    d
0cf0: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
0d00: 32 2e 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64  2.$AutoVacuumMod
0d10: 65 2e 32 20 7b 0a 20 20 20 20 20 20 65 78 65 63  e.2 {.      exec
0d20: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 50 52  sql {.        PR
0d30: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
0d40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
0d50: 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65 0a  $AutoVacuumMode.
0d60: 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69    }..  do_test i
0d70: 6e 63 72 62 6c 6f 62 2d 32 2e 24 41 75 74 6f 56  ncrblob-2.$AutoV
0d80: 61 63 75 75 6d 4d 6f 64 65 2e 33 20 7b 0a 20 20  acuumMode.3 {.  
0d90: 20 20 23 20 4f 70 65 6e 20 61 6e 64 20 63 6c 6f    # Open and clo
0da0: 73 65 20 74 68 65 20 64 62 20 74 6f 20 6d 61 6b  se the db to mak
0db0: 65 20 73 75 72 65 20 74 68 65 20 70 61 67 65 20  e sure the page 
0dc0: 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a  cache is empty..
0dd0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
0de0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
0df0: 2e 64 62 0a 20 20 0a 20 20 20 20 23 20 52 65 61  .db.  .    # Rea
0e00: 64 20 74 68 65 20 6c 61 73 74 20 32 30 20 62 79  d the last 20 by
0e10: 74 65 73 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  tes of the blob 
0e20: 76 69 61 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c  via a blob handl
0e30: 65 2e 0a 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f  e..    set ::blo
0e40: 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 62  b [db incrblob b
0e50: 6c 6f 62 73 20 76 20 31 5d 0a 20 20 20 20 73 65  lobs v 1].    se
0e60: 65 6b 20 24 3a 3a 62 6c 6f 62 20 2d 32 30 20 65  ek $::blob -20 e
0e70: 6e 64 0a 20 20 20 20 73 65 74 20 3a 3a 66 72 61  nd.    set ::fra
0e80: 67 6d 65 6e 74 20 5b 72 65 61 64 20 24 3a 3a 62  gment [read $::b
0e90: 6c 6f 62 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24  lob].    close $
0ea0: 3a 3a 62 6c 6f 62 0a 20 20 0a 20 20 20 20 23 20  ::blob.  .    # 
0eb0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
0ec0: 69 73 20 6e 6f 74 20 69 6e 20 61 75 74 6f 2d 76  is not in auto-v
0ed0: 61 63 75 75 6d 20 6d 6f 64 65 2c 20 74 68 65 20  acuum mode, the 
0ee0: 77 68 6f 6c 65 20 6f 66 0a 20 20 20 20 23 20 74  whole of.    # t
0ef0: 68 65 20 6f 76 65 72 66 6c 6f 77 2d 63 68 61 69  he overflow-chai
0f00: 6e 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  n must be scanne
0f10: 64 2e 20 49 6e 20 61 75 74 6f 2d 76 61 63 75 75  d. In auto-vacuu
0f20: 6d 20 6d 6f 64 65 2c 0a 20 20 20 20 23 20 73 71  m mode,.    # sq
0f30: 6c 69 74 65 20 75 73 65 73 20 74 68 65 20 70 74  lite uses the pt
0f40: 72 6d 61 70 20 70 61 67 65 73 20 74 6f 20 61 76  rmap pages to av
0f50: 6f 69 64 20 72 65 61 64 69 6e 67 20 74 68 65 20  oid reading the 
0f60: 6f 74 68 65 72 20 70 61 67 65 73 2e 0a 20 20 20  other pages..   
0f70: 20 23 0a 20 20 20 20 6e 52 65 61 64 20 64 62 0a   #.    nRead db.
0f80: 20 20 7d 20 5b 65 78 70 72 20 24 41 75 74 6f 56    } [expr $AutoV
0f90: 61 63 75 75 6d 4d 6f 64 65 20 3f 20 34 20 3a 20  acuumMode ? 4 : 
0fa0: 33 30 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69  30]..  do_test i
0fb0: 6e 63 72 62 6c 6f 62 2d 32 2e 24 41 75 74 6f 56  ncrblob-2.$AutoV
0fc0: 61 63 75 75 6d 4d 6f 64 65 2e 34 20 7b 0a 20 20  acuumMode.4 {.  
0fd0: 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b    string range [
0fe0: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 76  db one {SELECT v
0ff0: 20 46 52 4f 4d 20 62 6c 6f 62 73 7d 5d 20 65 6e   FROM blobs}] en
1000: 64 2d 31 39 20 65 6e 64 0a 20 20 7d 20 24 3a 3a  d-19 end.  } $::
1010: 66 72 61 67 6d 65 6e 74 0a 0a 20 20 64 6f 5f 74  fragment..  do_t
1020: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 32 2e 24  est incrblob-2.$
1030: 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65 2e 35  AutoVacuumMode.5
1040: 20 7b 0a 20 20 20 20 23 20 4f 70 65 6e 20 61 6e   {.    # Open an
1050: 64 20 63 6c 6f 73 65 20 74 68 65 20 64 62 20 74  d close the db t
1060: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
1070: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 65 6d  page cache is em
1080: 70 74 79 2e 0a 20 20 20 20 64 62 20 63 6c 6f 73  pty..    db clos
1090: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  e.    sqlite3 db
10a0: 20 74 65 73 74 2e 64 62 0a 20 20 0a 20 20 20 20   test.db.  .    
10b0: 23 20 57 72 69 74 65 20 74 68 65 20 73 65 63 6f  # Write the seco
10c0: 6e 64 2d 74 6f 2d 6c 61 73 74 20 32 30 20 62 79  nd-to-last 20 by
10d0: 74 65 73 20 6f 66 20 74 68 65 20 62 6c 6f 62 20  tes of the blob 
10e0: 76 69 61 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c  via a blob handl
10f0: 65 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74  e..    #.    set
1100: 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69 6e 63 72   ::blob [db incr
1110: 62 6c 6f 62 20 62 6c 6f 62 73 20 76 20 31 5d 0a  blob blobs v 1].
1120: 20 20 20 20 73 65 65 6b 20 24 3a 3a 62 6c 6f 62      seek $::blob
1130: 20 2d 34 30 20 65 6e 64 0a 20 20 20 20 70 75 74   -40 end.    put
1140: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 3a 3a  s -nonewline $::
1150: 62 6c 6f 62 20 22 31 32 33 34 35 36 37 38 39 30  blob "1234567890
1160: 61 62 63 64 65 66 67 68 69 6a 22 0a 20 20 20 20  abcdefghij".    
1170: 66 6c 75 73 68 20 24 3a 3a 62 6c 6f 62 0a 20 20  flush $::blob.  
1180: 0a 20 20 20 20 23 20 49 66 20 74 68 65 20 64 61  .    # If the da
1190: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 69 6e  tabase is not in
11a0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
11b0: 65 2c 20 74 68 65 20 77 68 6f 6c 65 20 6f 66 0a  e, the whole of.
11c0: 20 20 20 20 23 20 74 68 65 20 6f 76 65 72 66 6c      # the overfl
11d0: 6f 77 2d 63 68 61 69 6e 20 6d 75 73 74 20 62 65  ow-chain must be
11e0: 20 73 63 61 6e 6e 65 64 2e 20 49 6e 20 61 75 74   scanned. In aut
11f0: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2c 0a 20  o-vacuum mode,. 
1200: 20 20 20 23 20 73 71 6c 69 74 65 20 75 73 65 73     # sqlite uses
1210: 20 74 68 65 20 70 74 72 6d 61 70 20 70 61 67 65   the ptrmap page
1220: 73 20 74 6f 20 61 76 6f 69 64 20 72 65 61 64 69  s to avoid readi
1230: 6e 67 20 74 68 65 20 6f 74 68 65 72 20 70 61 67  ng the other pag
1240: 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 6e 52  es..    #.    nR
1250: 65 61 64 20 64 62 0a 20 20 7d 20 5b 65 78 70 72  ead db.  } [expr
1260: 20 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65   $AutoVacuumMode
1270: 20 3f 20 34 20 3a 20 33 30 5d 0a 0a 20 20 23 20   ? 4 : 30]..  # 
1280: 50 61 67 65 73 20 31 20 28 74 68 65 20 77 72 69  Pages 1 (the wri
1290: 74 65 2d 63 6f 75 6e 74 65 72 29 20 61 6e 64 20  te-counter) and 
12a0: 33 32 20 28 74 68 65 20 62 6c 6f 62 20 64 61 74  32 (the blob dat
12b0: 61 29 20 77 65 72 65 20 77 72 69 74 74 65 6e 2e  a) were written.
12c0: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .  do_test incrb
12d0: 6c 6f 62 2d 32 2e 24 41 75 74 6f 56 61 63 75 75  lob-2.$AutoVacuu
12e0: 6d 4d 6f 64 65 2e 36 20 7b 0a 20 20 20 20 63 6c  mMode.6 {.    cl
12f0: 6f 73 65 20 24 3a 3a 62 6c 6f 62 0a 20 20 20 20  ose $::blob.    
1300: 6e 57 72 69 74 65 20 64 62 0a 20 20 7d 20 32 0a  nWrite db.  } 2.
1310: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  .  do_test incrb
1320: 6c 6f 62 2d 32 2e 24 41 75 74 6f 56 61 63 75 75  lob-2.$AutoVacuu
1330: 6d 4d 6f 64 65 2e 37 20 7b 0a 20 20 20 20 73 74  mMode.7 {.    st
1340: 72 69 6e 67 20 72 61 6e 67 65 20 5b 64 62 20 6f  ring range [db o
1350: 6e 65 20 7b 53 45 4c 45 43 54 20 76 20 46 52 4f  ne {SELECT v FRO
1360: 4d 20 62 6c 6f 62 73 7d 5d 20 65 6e 64 2d 33 39  M blobs}] end-39
1370: 20 65 6e 64 2d 32 30 0a 20 20 7d 20 22 31 32 33   end-20.  } "123
1380: 34 35 36 37 38 39 30 61 62 63 64 65 66 67 68 69  4567890abcdefghi
1390: 6a 22 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e  j"..  do_test in
13a0: 63 72 62 6c 6f 62 2d 32 2e 24 41 75 74 6f 56 61  crblob-2.$AutoVa
13b0: 63 75 75 6d 4d 6f 64 65 2e 38 20 7b 0a 20 20 20  cuumMode.8 {.   
13c0: 20 23 20 4f 70 65 6e 20 61 6e 64 20 63 6c 6f 73   # Open and clos
13d0: 65 20 74 68 65 20 64 62 20 74 6f 20 6d 61 6b 65  e the db to make
13e0: 20 73 75 72 65 20 74 68 65 20 70 61 67 65 20 63   sure the page c
13f0: 61 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 20  ache is empty.. 
1400: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
1410: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
1420: 64 62 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20  db..    execsql 
1430: 7b 20 53 45 4c 45 43 54 20 69 20 46 52 4f 4d 20  { SELECT i FROM 
1440: 62 6c 6f 62 73 20 7d 20 0a 20 20 7d 20 7b 34 35  blobs } .  } {45
1450: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63  }..  do_test inc
1460: 72 62 6c 6f 62 2d 32 2e 24 41 75 74 6f 56 61 63  rblob-2.$AutoVac
1470: 75 75 6d 4d 6f 64 65 2e 39 20 7b 0a 20 20 20 20  uumMode.9 {.    
1480: 6e 52 65 61 64 20 64 62 0a 20 20 7d 20 5b 65 78  nRead db.  } [ex
1490: 70 72 20 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f  pr $AutoVacuumMo
14a0: 64 65 20 3f 20 34 20 3a 20 33 30 5d 0a 7d 0a 73  de ? 4 : 30].}.s
14b0: 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
14c0: 5f 6c 69 6d 69 74 20 24 63 6d 64 6c 69 6e 65 61  _limit $cmdlinea
14d0: 72 67 28 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d  rg(soft-heap-lim
14e0: 69 74 29 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  it)..#----------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1530: 20 69 6e 63 72 62 6c 6f 62 2d 33 2e 2a 3a 20 0a   incrblob-3.*: .
1540: 23 0a 23 20 54 65 73 74 20 74 68 65 20 6f 75 74  #.# Test the out
1550: 63 6f 6d 65 20 6f 66 20 74 72 79 69 6e 67 20 74  come of trying t
1560: 6f 20 77 72 69 74 65 20 74 6f 20 61 20 72 65 61  o write to a rea
1570: 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64  d-only blob hand
1580: 6c 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e  le..#.do_test in
1590: 63 72 62 6c 6f 62 2d 33 2e 31 20 7b 0a 20 20 73  crblob-3.1 {.  s
15a0: 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69 6e  et ::blob [db in
15b0: 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79  crblob -readonly
15c0: 20 62 6c 6f 62 73 20 76 20 31 5d 0a 20 20 73 65   blobs v 1].  se
15d0: 65 6b 20 24 3a 3a 62 6c 6f 62 20 2d 34 30 20 65  ek $::blob -40 e
15e0: 6e 64 0a 20 20 72 65 61 64 20 24 3a 3a 62 6c 6f  nd.  read $::blo
15f0: 62 20 32 30 0a 7d 20 22 31 32 33 34 35 36 37 38  b 20.} "12345678
1600: 39 30 61 62 63 64 65 66 67 68 69 6a 22 0a 64 6f  90abcdefghij".do
1610: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 33  _test incrblob-3
1620: 2e 32 20 7b 0a 20 20 73 65 65 6b 20 24 3a 3a 62  .2 {.  seek $::b
1630: 6c 6f 62 20 30 0a 20 20 73 65 74 20 72 63 20 5b  lob 0.  set rc [
1640: 63 61 74 63 68 20 7b 0a 20 20 20 20 70 75 74 73  catch {.    puts
1650: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 3a 3a 62   -nonewline $::b
1660: 6c 6f 62 20 22 68 65 6c 6c 6f 77 6f 72 6c 64 22  lob "helloworld"
1670: 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 63 6c 6f 73  .  } msg].  clos
1680: 65 20 24 3a 3a 62 6c 6f 62 0a 20 20 6c 69 73 74  e $::blob.  list
1690: 20 24 72 63 20 24 6d 73 67 0a 7d 20 22 31 20 7b   $rc $msg.} "1 {
16a0: 63 68 61 6e 6e 65 6c 20 5c 22 24 3a 3a 62 6c 6f  channel \"$::blo
16b0: 62 5c 22 20 77 61 73 6e 27 74 20 6f 70 65 6e 65  b\" wasn't opene
16c0: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 7d 22 0a  d for writing}".
16d0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
16e0: 62 2d 33 2e 33 20 7b 0a 20 20 73 65 74 20 3a 3a  b-3.3 {.  set ::
16f0: 62 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f  blob [db incrblo
1700: 62 20 2d 72 65 61 64 6f 6e 6c 79 20 62 6c 6f 62  b -readonly blob
1710: 73 20 76 20 31 5d 0a 20 20 73 65 65 6b 20 24 3a  s v 1].  seek $:
1720: 3a 62 6c 6f 62 20 2d 34 30 20 65 6e 64 0a 20 20  :blob -40 end.  
1730: 72 65 61 64 20 24 3a 3a 62 6c 6f 62 20 32 30 0a  read $::blob 20.
1740: 7d 20 22 31 32 33 34 35 36 37 38 39 30 61 62 63  } "1234567890abc
1750: 64 65 66 67 68 69 6a 22 0a 64 6f 5f 74 65 73 74  defghij".do_test
1760: 20 69 6e 63 72 62 6c 6f 62 2d 33 2e 34 20 7b 0a   incrblob-3.4 {.
1770: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
1780: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
1790: 6f 62 5f 77 72 69 74 65 20 24 3a 3a 62 6c 6f 62  ob_write $::blob
17a0: 20 32 30 20 22 71 77 65 72 74 79 75 69 6f 70 6c   20 "qwertyuiopl
17b0: 6b 6a 68 67 66 64 73 22 20 0a 20 20 7d 20 6d 73  kjhgfds" .  } ms
17c0: 67 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d  g].  list $rc $m
17d0: 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 52  sg.} {1 SQLITE_R
17e0: 45 41 44 4f 4e 4c 59 7d 0a 63 61 74 63 68 20 7b  EADONLY}.catch {
17f0: 63 6c 6f 73 65 20 24 3a 3a 62 6c 6f 62 7d 0a 0a  close $::blob}..
1800: 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 69 6e 63 72  ---------.# incr
1850: 62 6c 6f 62 2d 34 2e 2a 3a 20 0a 23 0a 23 20 54  blob-4.*: .#.# T
1860: 72 79 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 65  ry a couple of e
1870: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 3a  rror conditions:
1880: 0a 23 0a 23 20 20 20 20 20 34 2e 31 20 2d 20 41  .#.#     4.1 - A
1890: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
18a0: 20 72 6f 77 20 74 68 61 74 20 64 6f 65 73 20 6e   row that does n
18b0: 6f 74 20 65 78 69 73 74 2e 0a 23 20 20 20 20 20  ot exist..#     
18c0: 34 2e 32 20 2d 20 41 74 74 65 6d 70 74 20 74 6f  4.2 - Attempt to
18d0: 20 6f 70 65 6e 20 61 20 63 6f 6c 75 6d 6e 20 74   open a column t
18e0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  hat does not exi
18f0: 73 74 2e 0a 23 20 20 20 20 20 34 2e 33 20 2d 20  st..#     4.3 - 
1900: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
1910: 61 20 74 61 62 6c 65 20 74 68 61 74 20 64 6f 65  a table that doe
1920: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 20 20  s not exist..#  
1930: 20 20 20 34 2e 34 20 2d 20 41 74 74 65 6d 70 74     4.4 - Attempt
1940: 20 74 6f 20 6f 70 65 6e 20 61 20 64 61 74 61 62   to open a datab
1950: 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
1960: 74 20 65 78 69 73 74 2e 0a 23 0a 23 20 20 20 20  t exist..#.#    
1970: 20 34 2e 35 20 2d 20 41 74 74 65 6d 70 74 20 74   4.5 - Attempt t
1980: 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 74 65 67 65  o open an intege
1990: 72 0a 23 20 20 20 20 20 34 2e 36 20 2d 20 41 74  r.#     4.6 - At
19a0: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
19b0: 72 65 61 6c 20 76 61 6c 75 65 0a 23 20 20 20 20  real value.#    
19c0: 20 34 2e 37 20 2d 20 41 74 74 65 6d 70 74 20 74   4.7 - Attempt t
19d0: 6f 20 6f 70 65 6e 20 61 6e 20 53 51 4c 20 6e 75  o open an SQL nu
19e0: 6c 6c 0a 23 0a 23 20 20 20 20 20 34 2e 38 20 2d  ll.#.#     4.8 -
19f0: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
1a00: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
1a10: 6d 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 23  mn for writing.#
1a20: 20 20 20 20 20 34 2e 39 20 2d 20 41 74 74 65 6d       4.9 - Attem
1a30: 70 74 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e  pt to open an in
1a40: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 66 6f 72  dexed column for
1a50: 20 72 65 61 64 69 6e 67 20 28 74 68 69 73 20 77   reading (this w
1a60: 6f 72 6b 73 29 0a 23 0a 23 20 20 20 20 20 34 2e  orks).#.#     4.
1a70: 31 31 20 2d 20 41 74 74 65 6d 70 74 20 74 6f 20  11 - Attempt to 
1a80: 6f 70 65 6e 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  open a column of
1a90: 20 61 20 76 69 65 77 2e 0a 23 20 20 20 20 20 34   a view..#     4
1aa0: 2e 31 32 20 2d 20 41 74 74 65 6d 70 74 20 74 6f  .12 - Attempt to
1ab0: 20 6f 70 65 6e 20 61 20 63 6f 6c 75 6d 6e 20 6f   open a column o
1ac0: 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  f a virtual tabl
1ad0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63  e..#.do_test inc
1ae0: 72 62 6c 6f 62 2d 34 2e 31 20 7b 0a 20 20 73 65  rblob-4.1 {.  se
1af0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20  t rc [catch {.  
1b00: 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62    set ::blob [db
1b10: 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20   incrblob blobs 
1b20: 76 20 32 5d 0a 20 20 7d 20 6d 73 67 20 5d 20 0a  v 2].  } msg ] .
1b30: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
1b40: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 72 6f  } {1 {no such ro
1b50: 77 69 64 3a 20 32 7d 7d 0a 64 6f 5f 74 65 73 74  wid: 2}}.do_test
1b60: 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 32 20 7b 0a   incrblob-4.2 {.
1b70: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
1b80: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f 62  {.    set ::blob
1b90: 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c   [db incrblob bl
1ba0: 6f 62 73 20 62 6c 75 65 20 31 5d 0a 20 20 7d 20  obs blue 1].  } 
1bb0: 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74 20 24 72  msg ] .  list $r
1bc0: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20  c $msg.} {1 {no 
1bd0: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 62 6c  such column: "bl
1be0: 75 65 22 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  ue"}}.do_test in
1bf0: 63 72 62 6c 6f 62 2d 34 2e 33 20 7b 0a 20 20 73  crblob-4.3 {.  s
1c00: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20  et rc [catch {. 
1c10: 20 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64     set ::blob [d
1c20: 62 20 69 6e 63 72 62 6c 6f 62 20 6e 6f 73 75 63  b incrblob nosuc
1c30: 68 74 61 62 6c 65 20 62 6c 75 65 20 31 5d 0a 20  htable blue 1]. 
1c40: 20 7d 20 6d 73 67 20 5d 0a 20 20 6c 69 73 74 20   } msg ].  list 
1c50: 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e  $rc $msg.} {1 {n
1c60: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d 61  o such table: ma
1c70: 69 6e 2e 6e 6f 73 75 63 68 74 61 62 6c 65 7d 7d  in.nosuchtable}}
1c80: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
1c90: 62 2d 34 2e 34 20 7b 0a 20 20 73 65 74 20 72 63  b-4.4 {.  set rc
1ca0: 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 73 65   [catch {.    se
1cb0: 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69 6e 63  t ::blob [db inc
1cc0: 72 62 6c 6f 62 20 6e 6f 73 75 63 68 64 62 20 62  rblob nosuchdb b
1cd0: 6c 6f 62 73 20 76 20 31 5d 0a 20 20 7d 20 6d 73  lobs v 1].  } ms
1ce0: 67 20 5d 20 0a 20 20 6c 69 73 74 20 24 72 63 20  g ] .  list $rc 
1cf0: 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75  $msg.} {1 {no su
1d00: 63 68 20 74 61 62 6c 65 3a 20 6e 6f 73 75 63 68  ch table: nosuch
1d10: 64 62 2e 62 6c 6f 62 73 7d 7d 0a 0a 64 6f 5f 74  db.blobs}}..do_t
1d20: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 35  est incrblob-4.5
1d30: 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74   {.  set rc [cat
1d40: 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 62  ch {.    set ::b
1d50: 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  lob [db incrblob
1d60: 20 62 6c 6f 62 73 20 69 20 31 5d 0a 20 20 7d 20   blobs i 1].  } 
1d70: 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74 20 24 72  msg ] .  list $r
1d80: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 63 61 6e  c $msg.} {1 {can
1d90: 6e 6f 74 20 6f 70 65 6e 20 76 61 6c 75 65 20 6f  not open value o
1da0: 66 20 74 79 70 65 20 69 6e 74 65 67 65 72 7d 7d  f type integer}}
1db0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
1dc0: 62 2d 34 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  b-4.6 {.  execsq
1dd0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
1de0: 4e 54 4f 20 62 6c 6f 62 73 28 6b 2c 20 76 2c 20  NTO blobs(k, v, 
1df0: 69 29 20 56 41 4c 55 45 53 28 31 32 33 2c 20 35  i) VALUES(123, 5
1e00: 36 37 2e 37 36 35 2c 20 4e 55 4c 4c 29 3b 0a 20  67.765, NULL);. 
1e10: 20 7d 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74   }.  set rc [cat
1e20: 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 62  ch {.    set ::b
1e30: 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  lob [db incrblob
1e40: 20 62 6c 6f 62 73 20 76 20 32 5d 0a 20 20 7d 20   blobs v 2].  } 
1e50: 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74 20 24 72  msg ] .  list $r
1e60: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 63 61 6e  c $msg.} {1 {can
1e70: 6e 6f 74 20 6f 70 65 6e 20 76 61 6c 75 65 20 6f  not open value o
1e80: 66 20 74 79 70 65 20 72 65 61 6c 7d 7d 0a 64 6f  f type real}}.do
1e90: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 34  _test incrblob-4
1ea0: 2e 37 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63  .7 {.  set rc [c
1eb0: 61 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a  atch {.    set :
1ec0: 3a 62 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c  :blob [db incrbl
1ed0: 6f 62 20 62 6c 6f 62 73 20 69 20 32 5d 0a 20 20  ob blobs i 2].  
1ee0: 7d 20 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74 20  } msg ] .  list 
1ef0: 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 63  $rc $msg.} {1 {c
1f00: 61 6e 6e 6f 74 20 6f 70 65 6e 20 76 61 6c 75 65  annot open value
1f10: 20 6f 66 20 74 79 70 65 20 6e 75 6c 6c 7d 7d 0a   of type null}}.
1f20: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
1f30: 62 2d 34 2e 38 2e 31 20 7b 0a 20 20 65 78 65 63  b-4.8.1 {.  exec
1f40: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
1f50: 20 49 4e 54 4f 20 62 6c 6f 62 73 28 6b 2c 20 76   INTO blobs(k, v
1f60: 2c 20 69 29 20 56 41 4c 55 45 53 28 58 27 30 31  , i) VALUES(X'01
1f70: 30 32 30 33 30 34 30 35 30 36 30 37 30 38 30 39  0203040506070809
1f80: 27 2c 20 27 68 65 6c 6c 6f 27 2c 20 27 77 6f 72  ', 'hello', 'wor
1f90: 6c 64 27 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20  ld');.  }.  set 
1fa0: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
1fb0: 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69  set ::blob [db i
1fc0: 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 6b 20  ncrblob blobs k 
1fd0: 33 5d 0a 20 20 7d 20 6d 73 67 20 5d 20 0a 20 20  3].  } msg ] .  
1fe0: 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20  list $rc $msg.} 
1ff0: 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  {1 {cannot open 
2000: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 66  indexed column f
2010: 6f 72 20 77 72 69 74 69 6e 67 7d 7d 0a 64 6f 5f  or writing}}.do_
2020: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e  test incrblob-4.
2030: 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.2 {.  execsql 
2040: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2050: 4c 45 20 74 33 28 61 20 49 4e 54 45 47 45 52 20  LE t3(a INTEGER 
2060: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
2070: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2080: 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t3 VALUES(1, 2)
2090: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 72 63 20 5b  ;.  }.  set rc [
20a0: 63 61 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20  catch {.    set 
20b0: 3a 3a 62 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62  ::blob [db incrb
20c0: 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74 33  lob -readonly t3
20d0: 20 61 20 31 5d 0a 20 20 7d 20 6d 73 67 20 5d 20   a 1].  } msg ] 
20e0: 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67  .  list $rc $msg
20f0: 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f 70  .} {1 {cannot op
2100: 65 6e 20 76 61 6c 75 65 20 6f 66 20 74 79 70 65  en value of type
2110: 20 6e 75 6c 6c 7d 7d 0a 64 6f 5f 74 65 73 74 20   null}}.do_test 
2120: 69 6e 63 72 62 6c 6f 62 2d 34 2e 38 2e 33 20 7b  incrblob-4.8.3 {
2130: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
2140: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f   {.    set ::blo
2150: 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d  b [db incrblob -
2160: 72 65 61 64 6f 6e 6c 79 20 74 33 20 72 6f 77 69  readonly t3 rowi
2170: 64 20 31 5d 0a 20 20 7d 20 6d 73 67 20 5d 20 0a  d 1].  } msg ] .
2180: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
2190: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 63 6f  } {1 {no such co
21a0: 6c 75 6d 6e 3a 20 22 72 6f 77 69 64 22 7d 7d 0a  lumn: "rowid"}}.
21b0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
21c0: 62 2d 34 2e 39 2e 31 20 7b 0a 20 20 73 65 74 20  b-4.9.1 {.  set 
21d0: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
21e0: 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69  set ::blob [db i
21f0: 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
2200: 79 20 62 6c 6f 62 73 20 6b 20 33 5d 0a 20 20 7d  y blobs k 3].  }
2210: 20 6d 73 67 5d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74   msg].} {0}.do_t
2220: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 39  est incrblob-4.9
2230: 2e 32 20 7b 0a 20 20 62 69 6e 61 72 79 20 73 63  .2 {.  binary sc
2240: 61 6e 20 5b 72 65 61 64 20 24 3a 3a 62 6c 6f 62  an [read $::blob
2250: 5d 20 63 2a 20 63 0a 20 20 63 6c 6f 73 65 20 24  ] c* c.  close $
2260: 3a 3a 62 6c 6f 62 0a 20 20 73 65 74 20 63 0a 7d  ::blob.  set c.}
2270: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
2280: 38 20 39 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e  8 9}..do_test in
2290: 63 72 62 6c 6f 62 2d 34 2e 31 30 20 7b 0a 20 20  crblob-4.10 {.  
22a0: 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69  set ::blob [db i
22b0: 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
22c0: 79 20 62 6c 6f 62 73 20 6b 20 33 5d 0a 20 20 73  y blobs k 3].  s
22d0: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 73  et rc [catch { s
22e0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
22f0: 20 24 3a 3a 62 6c 6f 62 20 31 30 20 31 30 30 20   $::blob 10 100 
2300: 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24 72  } msg].  list $r
2310: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49  c $msg.} {1 SQLI
2320: 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73  TE_ERROR}.do_tes
2330: 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 31 30 2e  t incrblob-4.10.
2340: 32 20 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 62  2 {.  close $::b
2350: 6c 6f 62 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61  lob.} {}..ifcapa
2360: 62 6c 65 20 76 69 65 77 20 7b 0a 20 20 64 6f 5f  ble view {.  do_
2370: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e  test incrblob-4.
2380: 31 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  11 {.    execsql
2390: 20 7b 20 43 52 45 41 54 45 20 56 49 45 57 20 62   { CREATE VIEW b
23a0: 6c 6f 62 73 5f 76 69 65 77 20 41 53 20 53 45 4c  lobs_view AS SEL
23b0: 45 43 54 20 6b 2c 20 76 2c 20 69 20 46 52 4f 4d  ECT k, v, i FROM
23c0: 20 62 6c 6f 62 73 20 7d 0a 20 20 20 20 73 65 74   blobs }.    set
23d0: 20 72 63 20 5b 63 61 74 63 68 20 7b 20 64 62 20   rc [catch { db 
23e0: 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 5f 76  incrblob blobs_v
23f0: 69 65 77 20 76 20 33 20 7d 20 6d 73 67 5d 0a 20  iew v 3 } msg]. 
2400: 20 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67     list $rc $msg
2410: 0a 20 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20  .  } {1 {cannot 
2420: 6f 70 65 6e 20 76 69 65 77 3a 20 62 6c 6f 62 73  open view: blobs
2430: 5f 76 69 65 77 7d 7d 0a 7d 0a 69 66 63 61 70 61  _view}}.}.ifcapa
2440: 62 6c 65 20 76 74 61 62 20 7b 0a 20 20 72 65 67  ble vtab {.  reg
2450: 69 73 74 65 72 5f 65 63 68 6f 5f 6d 6f 64 75 6c  ister_echo_modul
2460: 65 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  e [sqlite3_conne
2470: 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 20 64 62  ction_pointer db
2480: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72  ].  do_test incr
2490: 62 6c 6f 62 2d 34 2e 31 32 20 7b 0a 20 20 20 20  blob-4.12 {.    
24a0: 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45  execsql { CREATE
24b0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 62   VIRTUAL TABLE b
24c0: 6c 6f 62 73 5f 65 63 68 6f 20 55 53 49 4e 47 20  lobs_echo USING 
24d0: 65 63 68 6f 28 62 6c 6f 62 73 29 20 7d 0a 20 20  echo(blobs) }.  
24e0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
24f0: 7b 20 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c  { db incrblob bl
2500: 6f 62 73 5f 65 63 68 6f 20 76 20 33 20 7d 20 6d  obs_echo v 3 } m
2510: 73 67 5d 0a 20 20 20 20 6c 69 73 74 20 24 72 63  sg].    list $rc
2520: 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b 63 61   $msg.  } {1 {ca
2530: 6e 6e 6f 74 20 6f 70 65 6e 20 76 69 72 74 75 61  nnot open virtua
2540: 6c 20 74 61 62 6c 65 3a 20 62 6c 6f 62 73 5f 65  l table: blobs_e
2550: 63 68 6f 7d 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  cho}}.}...#-----
2560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25a0: 2d 2d 2d 0a 23 20 69 6e 63 72 62 6c 6f 62 2d 35  ---.# incrblob-5
25b0: 2e 2a 3a 20 0a 23 0a 23 20 20 20 20 20 54 65 73  .*: .#.#     Tes
25c0: 74 20 74 68 61 74 20 6f 70 65 6e 69 6e 67 20 61  t that opening a
25d0: 20 62 6c 6f 62 20 69 6e 20 61 6e 20 61 74 74 61   blob in an atta
25e0: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 77 6f  ched database wo
25f0: 72 6b 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  rks..#.ifcapable
2600: 20 61 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f 74   attach {.  do_t
2610: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 35 2e 31  est incrblob-5.1
2620: 20 7b 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65   {.    file dele
2630: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e  te -force test2.
2640: 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72  db test2.db-jour
2650: 6e 61 6c 0a 20 20 20 20 73 65 74 20 3a 3a 73 69  nal.    set ::si
2660: 7a 65 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  ze [expr [file s
2670: 69 7a 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ize [info script
2680: 5d 5d 5d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  ]]].    execsql 
2690: 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27  {.      ATTACH '
26a0: 74 65 73 74 32 2e 64 62 27 20 41 53 20 61 75 78  test2.db' AS aux
26b0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
26c0: 41 42 4c 45 20 61 75 78 2e 66 69 6c 65 73 28 6e  ABLE aux.files(n
26d0: 61 6d 65 2c 20 74 65 78 74 29 3b 0a 20 20 20 20  ame, text);.    
26e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75    INSERT INTO au
26f0: 78 2e 66 69 6c 65 73 20 56 41 4c 55 45 53 28 27  x.files VALUES('
2700: 74 68 69 73 20 6f 6e 65 27 2c 20 7a 65 72 6f 62  this one', zerob
2710: 6c 6f 62 28 24 3a 3a 73 69 7a 65 29 29 3b 0a 20  lob($::size));. 
2720: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 66 64 20     }.    set fd 
2730: 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 61 75   [db incrblob au
2740: 78 20 66 69 6c 65 73 20 74 65 78 74 20 31 5d 0a  x files text 1].
2750: 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24      fconfigure $
2760: 66 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  fd -translation 
2770: 62 69 6e 61 72 79 0a 20 20 20 20 73 65 74 20 66  binary.    set f
2780: 64 32 20 5b 6f 70 65 6e 20 5b 69 6e 66 6f 20 73  d2 [open [info s
2790: 63 72 69 70 74 5d 5d 0a 20 20 20 20 66 63 6f 6e  cript]].    fcon
27a0: 66 69 67 75 72 65 20 24 66 64 32 20 2d 74 72 61  figure $fd2 -tra
27b0: 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a  nslation binary.
27c0: 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c      puts -nonewl
27d0: 69 6e 65 20 24 66 64 20 5b 72 65 61 64 20 24 66  ine $fd [read $f
27e0: 64 32 5d 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  d2].    close $f
27f0: 64 0a 20 20 20 20 63 6c 6f 73 65 20 24 66 64 32  d.    close $fd2
2800: 0a 20 20 20 20 73 65 74 20 3a 3a 74 65 78 74 20  .    set ::text 
2810: 5b 64 62 20 6f 6e 65 20 7b 73 65 6c 65 63 74 20  [db one {select 
2820: 74 65 78 74 20 66 72 6f 6d 20 61 75 78 2e 66 69  text from aux.fi
2830: 6c 65 73 7d 5d 0a 20 20 20 20 73 74 72 69 6e 67  les}].    string
2840: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 78 74 0a   length $::text.
2850: 20 20 7d 20 5b 66 69 6c 65 20 73 69 7a 65 20 5b    } [file size [
2860: 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0a 20 20  info script]].  
2870: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
2880: 2d 35 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 66  -5.2 {.    set f
2890: 64 32 20 5b 6f 70 65 6e 20 5b 69 6e 66 6f 20 73  d2 [open [info s
28a0: 63 72 69 70 74 5d 5d 0a 20 20 20 20 66 63 6f 6e  cript]].    fcon
28b0: 66 69 67 75 72 65 20 24 66 64 32 20 2d 74 72 61  figure $fd2 -tra
28c0: 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a  nslation binary.
28d0: 20 20 20 20 73 65 74 20 3a 3a 64 61 74 61 20 5b      set ::data [
28e0: 72 65 61 64 20 24 66 64 32 5d 0a 20 20 20 20 63  read $fd2].    c
28f0: 6c 6f 73 65 20 24 66 64 32 0a 20 20 20 20 73 65  lose $fd2.    se
2900: 74 20 3a 3a 64 61 74 61 0a 20 20 7d 20 24 3a 3a  t ::data.  } $::
2910: 74 65 78 74 0a 7d 0a 0a 23 20 66 72 65 65 20 6d  text.}..# free m
2920: 65 6d 6f 72 79 0a 75 6e 73 65 74 20 2d 6e 6f 63  emory.unset -noc
2930: 6f 6d 70 6c 61 69 6e 20 3a 3a 64 61 74 61 0a 75  omplain ::data.u
2940: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
2950: 20 3a 3a 74 65 78 74 0a 0a 23 2d 2d 2d 2d 2d 2d   ::text..#------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 0a 23 20 69 6e 63 72 62 6c 6f 62 2d 36 2e  --.# incrblob-6.
29b0: 2a 3a 20 0a 23 0a 23 20 20 20 20 20 54 65 73 74  *: .#.#     Test
29c0: 20 74 68 61 74 20 6f 70 65 6e 69 6e 67 20 61 20   that opening a 
29d0: 62 6c 6f 62 20 66 6f 72 20 77 72 69 74 65 2d 61  blob for write-a
29e0: 63 63 65 73 73 20 69 73 20 69 6d 70 6f 73 73 69  ccess is impossi
29f0: 62 6c 65 20 69 66 0a 23 20 20 20 20 20 61 6e 6f  ble if.#     ano
2a00: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2a10: 68 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65  has the database
2a20: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
2a30: 23 0a 23 20 20 20 20 20 54 68 65 6e 20 74 65 73  #.#     Then tes
2a40: 74 20 74 68 61 74 20 62 6c 6f 62 20 77 72 69 74  t that blob writ
2a50: 65 73 20 74 68 61 74 20 74 61 6b 65 20 70 6c 61  es that take pla
2a60: 63 65 20 69 6e 73 69 64 65 20 6f 66 20 61 0a 23  ce inside of a.#
2a70: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
2a80: 20 61 72 65 20 6e 6f 74 20 76 69 73 69 62 6c 65   are not visible
2a90: 20 74 6f 20 65 78 74 65 72 6e 61 6c 20 63 6f 6e   to external con
2aa0: 6e 65 63 74 69 6f 6e 73 20 75 6e 74 69 6c 0a 23  nections until.#
2ab0: 20 20 20 20 20 61 66 74 65 72 20 74 68 65 20 74       after the t
2ac0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2ad0: 6d 6d 69 74 65 64 20 61 6e 64 20 74 68 65 20 62  mmited and the b
2ae0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 20 0a 23 20 20  lob channel .#  
2af0: 20 20 20 63 6c 6f 73 65 64 2e 0a 23 0a 73 71 6c     closed..#.sql
2b00: 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
2b10: 69 6d 69 74 20 30 0a 64 6f 5f 74 65 73 74 20 69  imit 0.do_test i
2b20: 6e 63 72 62 6c 6f 62 2d 36 2e 31 20 7b 0a 20 20  ncrblob-6.1 {.  
2b30: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
2b40: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
2b50: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49      BEGIN;.    I
2b60: 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f 62 73  NSERT INTO blobs
2b70: 28 6b 2c 20 76 2c 20 69 29 20 56 41 4c 55 45 53  (k, v, i) VALUES
2b80: 28 27 61 27 2c 20 27 64 69 66 66 65 72 65 6e 74  ('a', 'different
2b90: 27 2c 20 27 63 6f 6e 6e 65 63 74 69 6f 6e 27 29  ', 'connection')
2ba0: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 7d 0a 64  ;.  } db2.} {}.d
2bb0: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
2bc0: 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.2 {.  execsql 
2bd0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77  {.    SELECT row
2be0: 69 64 20 46 52 4f 4d 20 62 6c 6f 62 73 0a 20 20  id FROM blobs.  
2bf0: 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74  }.} {1 2 3}.do_t
2c00: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 33  est incrblob-6.3
2c10: 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74   {.  set rc [cat
2c20: 63 68 20 7b 0a 20 20 20 20 64 62 20 69 6e 63 72  ch {.    db incr
2c30: 62 6c 6f 62 20 62 6c 6f 62 73 20 76 20 31 0a 20  blob blobs v 1. 
2c40: 20 7d 20 6d 73 67 5d 0a 20 20 6c 69 73 74 20 24   } msg].  list $
2c50: 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 64 61  rc $msg.} {1 {da
2c60: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
2c70: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  }}.do_test incrb
2c80: 6c 6f 62 2d 36 2e 34 20 7b 0a 20 20 73 65 74 20  lob-6.4 {.  set 
2c90: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
2ca0: 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62  db incrblob blob
2cb0: 73 20 76 20 33 0a 20 20 7d 20 6d 73 67 5d 0a 20  s v 3.  } msg]. 
2cc0: 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d   list $rc $msg.}
2cd0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
2ce0: 20 6c 6f 63 6b 65 64 7d 7d 0a 64 6f 5f 74 65 73   locked}}.do_tes
2cf0: 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 35 20 7b  t incrblob-6.5 {
2d00: 0a 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64  .  set ::blob [d
2d10: 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64  b incrblob -read
2d20: 6f 6e 6c 79 20 62 6c 6f 62 73 20 76 20 33 5d 0a  only blobs v 3].
2d30: 20 20 72 65 61 64 20 24 3a 3a 62 6c 6f 62 0a 7d    read $::blob.}
2d40: 20 7b 68 65 6c 6c 6f 7d 0a 64 6f 5f 74 65 73 74   {hello}.do_test
2d50: 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 36 20 7b 0a   incrblob-6.6 {.
2d60: 20 20 63 6c 6f 73 65 20 24 3a 3a 62 6c 6f 62 0a    close $::blob.
2d70: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e  } {}..do_test in
2d80: 63 72 62 6c 6f 62 2d 36 2e 37 20 7b 0a 20 20 73  crblob-6.7 {.  s
2d90: 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 32 20 69  et ::blob [db2 i
2da0: 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 69 20  ncrblob blobs i 
2db0: 34 5d 0a 20 20 67 65 74 73 20 24 3a 3a 62 6c 6f  4].  gets $::blo
2dc0: 62 0a 7d 20 7b 63 6f 6e 6e 65 63 74 69 6f 6e 7d  b.} {connection}
2dd0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
2de0: 62 2d 36 2e 38 20 7b 0a 20 20 74 65 6c 6c 20 24  b-6.8 {.  tell $
2df0: 3a 3a 62 6c 6f 62 0a 7d 20 7b 31 30 7d 0a 64 6f  ::blob.} {10}.do
2e00: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 36  _test incrblob-6
2e10: 2e 39 20 7b 0a 20 20 73 65 65 6b 20 24 3a 3a 62  .9 {.  seek $::b
2e20: 6c 6f 62 20 30 0a 20 20 70 75 74 73 20 2d 6e 6f  lob 0.  puts -no
2e30: 6e 65 77 6c 69 6e 65 20 24 3a 3a 62 6c 6f 62 20  newline $::blob 
2e40: 22 69 6e 76 6f 63 61 74 69 6f 6e 22 0a 20 20 66  "invocation".  f
2e50: 6c 75 73 68 20 24 3a 3a 62 6c 6f 62 0a 7d 20 7b  lush $::blob.} {
2e60: 7d 0a 0a 23 20 41 74 20 74 68 69 73 20 70 6f 69  }..# At this poi
2e70: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 73 68 6f 75  nt rollback shou
2e80: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 28 62  ld be illegal (b
2e90: 65 63 61 75 73 65 20 0a 23 20 74 68 65 72 65 20  ecause .# there 
2ea0: 69 73 20 61 6e 20 6f 70 65 6e 20 62 6c 6f 62 20  is an open blob 
2eb0: 63 68 61 6e 6e 65 6c 29 2e 20 20 42 75 74 20 63  channel).  But c
2ec0: 6f 6d 6d 69 74 20 69 73 20 61 6c 73 6f 20 69 6c  ommit is also il
2ed0: 6c 65 67 61 6c 20 62 65 63 61 75 73 65 0a 23 20  legal because.# 
2ee0: 74 68 65 20 6f 70 65 6e 20 62 6c 6f 62 20 69 73  the open blob is
2ef0: 20 72 65 61 64 2d 77 72 69 74 65 2e 0a 23 0a 64   read-write..#.d
2f00: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
2f10: 36 2e 31 30 20 7b 0a 20 20 63 61 74 63 68 73 71  6.10 {.  catchsq
2f20: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
2f30: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 7b  ;.  } db2.} {1 {
2f40: 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20  cannot rollback 
2f50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 53 51  transaction - SQ
2f60: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  L statements in 
2f70: 70 72 6f 67 72 65 73 73 7d 7d 0a 64 6f 5f 74 65  progress}}.do_te
2f80: 73 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 31 31  st incrblob-6.11
2f90: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
2fa0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20      COMMIT;.  } 
2fb0: 64 62 32 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74  db2.} {1 {cannot
2fc0: 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74   commit transact
2fd0: 69 6f 6e 20 2d 20 53 51 4c 20 73 74 61 74 65 6d  ion - SQL statem
2fe0: 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ents in progress
2ff0: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  }}..do_test incr
3000: 62 6c 6f 62 2d 36 2e 31 32 20 7b 0a 20 20 65 78  blob-6.12 {.  ex
3010: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
3020: 43 54 20 2a 20 46 52 4f 4d 20 62 6c 6f 62 73 20  CT * FROM blobs 
3030: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 34 3b  WHERE rowid = 4;
3040: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
3050: 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 31 33 20  t incrblob-6.13 
3060: 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 62 6c 6f  {.  close $::blo
3070: 62 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69  b.} {}.do_test i
3080: 6e 63 72 62 6c 6f 62 2d 36 2e 31 34 20 7b 0a 20  ncrblob-6.14 {. 
3090: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
30a0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 20 64 62 32 0a  COMMIT;.  } db2.
30b0: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
30c0: 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 31 35 20 7b   incrblob-6.15 {
30d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
30e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62   SELECT * FROM b
30f0: 6c 6f 62 73 20 57 48 45 52 45 20 72 6f 77 69 64  lobs WHERE rowid
3100: 20 3d 20 34 3b 0a 20 20 7d 0a 7d 20 7b 61 20 64   = 4;.  }.} {a d
3110: 69 66 66 65 72 65 6e 74 20 69 6e 76 6f 63 61 74  ifferent invocat
3120: 69 6f 6e 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 73  ion}.db2 close.s
3130: 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
3140: 5f 6c 69 6d 69 74 20 24 63 6d 64 6c 69 6e 65 61  _limit $cmdlinea
3150: 72 67 28 73 6f 66 74 2d 68 65 61 70 2d 6c 69 6d  rg(soft-heap-lim
3160: 69 74 29 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  it)..#----------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
31b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  The following te
31c0: 73 74 73 20 76 65 72 69 66 79 20 74 68 65 20 62  sts verify the b
31d0: 65 68 61 76 69 6f 75 72 20 6f 66 20 74 68 65 20  ehaviour of the 
31e0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 49 4f 0a 23  incremental IO.#
31f0: 20 41 50 49 73 20 69 6e 20 74 68 65 20 66 6f 6c   APIs in the fol
3200: 6c 6f 77 69 6e 67 20 63 61 73 65 73 3a 0a 23 0a  lowing cases:.#.
3210: 23 20 20 20 20 20 37 2e 31 20 41 20 72 6f 77 20  #     7.1 A row 
3220: 74 68 61 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  that containing 
3230: 61 6e 20 6f 70 65 6e 20 62 6c 6f 62 20 69 73 20  an open blob is 
3240: 6d 6f 64 69 66 69 65 64 2e 0a 23 0a 23 20 20 20  modified..#.#   
3250: 20 20 37 2e 32 20 41 20 43 52 45 41 54 45 20 54    7.2 A CREATE T
3260: 41 42 4c 45 20 72 65 71 75 69 72 65 73 20 74 68  ABLE requires th
3270: 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  at an overflow p
3280: 61 67 65 20 74 68 61 74 20 69 73 20 70 61 72 74  age that is part
3290: 0a 23 20 20 20 20 20 20 20 20 20 6f 66 20 61 6e  .#         of an
32a0: 20 6f 70 65 6e 20 62 6c 6f 62 20 69 73 20 6d 6f   open blob is mo
32b0: 76 65 64 2e 0a 23 0a 23 20 20 20 20 20 37 2e 33  ved..#.#     7.3
32c0: 20 41 6e 20 49 4e 43 52 45 4d 45 4e 54 41 4c 20   An INCREMENTAL 
32d0: 56 41 43 55 55 4d 20 6d 6f 76 65 73 20 61 6e 20  VACUUM moves an 
32e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 74 68  overflow page th
32f0: 61 74 20 69 73 20 70 61 72 74 0a 23 20 20 20 20  at is part.#    
3300: 20 20 20 20 20 6f 66 20 61 6e 20 6f 70 65 6e 20       of an open 
3310: 62 6c 6f 62 2e 0a 23 0a 23 20 49 6e 20 74 68 65  blob..#.# In the
3320: 20 66 69 72 73 74 20 63 61 73 65 20 61 62 6f 76   first case abov
3330: 65 2c 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  e, correct behav
3340: 69 6f 75 72 20 69 73 20 66 6f 72 20 61 6c 6c 20  iour is for all 
3350: 73 75 62 73 65 71 75 65 6e 74 0a 23 20 72 65 61  subsequent.# rea
3360: 64 2f 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  d/write operatio
3370: 6e 73 20 6f 6e 20 74 68 65 20 62 6c 6f 62 2d 68  ns on the blob-h
3380: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
3390: 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 23 20  SQLITE_ABORT..# 
33a0: 4d 6f 72 65 20 61 63 63 75 72 61 74 65 6c 79 2c  More accurately,
33b0: 20 62 6c 6f 62 2d 68 61 6e 64 6c 65 73 20 61 72   blob-handles ar
33c0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68  e invalidated wh
33d0: 65 6e 65 76 65 72 20 74 68 65 20 74 61 62 6c 65  enever the table
33e0: 0a 23 20 74 68 65 79 20 62 65 6c 6f 6e 67 20 74  .# they belong t
33f0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 2e  o is written to.
3400: 0a 23 0a 23 20 54 68 65 20 73 65 63 6f 6e 64 20  .#.# The second 
3410: 74 77 6f 20 63 61 73 65 73 20 68 61 76 65 20 6e  two cases have n
3420: 6f 20 65 78 74 65 72 6e 61 6c 20 65 66 66 65 63  o external effec
3430: 74 2e 20 54 68 65 79 20 61 72 65 20 74 65 73 74  t. They are test
3440: 69 6e 67 0a 23 20 74 68 61 74 20 74 68 65 20 69  ing.# that the i
3450: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6f 66  nternal cache of
3460: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
3470: 75 6d 62 65 72 73 20 69 73 20 63 6f 72 72 65 63  umbers is correc
3480: 74 6c 79 0a 23 20 69 6e 76 61 6c 69 64 61 74 65  tly.# invalidate
3490: 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63  d..#.do_test inc
34a0: 72 62 6c 6f 62 2d 37 2e 31 2e 30 20 7b 0a 20 20  rblob-7.1.0 {.  
34b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
34c0: 47 49 4e 3b 0a 20 20 20 20 44 52 4f 50 20 54 41  GIN;.    DROP TA
34d0: 42 4c 45 20 62 6c 6f 62 73 3b 0a 20 20 20 20 43  BLE blobs;.    C
34e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 20 28  REATE TABLE t1 (
34f0: 61 2c 20 62 2c 20 63 2c 20 64 20 42 4c 4f 42 29  a, b, c, d BLOB)
3500: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3510: 4f 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64 29  O t1(a, b, c, d)
3520: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 2c   VALUES(1, 2, 3,
3530: 20 34 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   4);.    COMMIT;
3540: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61  .  }.} {}..forea
3550: 63 68 20 7b 74 6e 20 61 72 67 7d 20 7b 31 20 22  ch {tn arg} {1 "
3560: 22 20 32 20 2d 72 65 61 64 6f 6e 6c 79 7d 20 7b  " 2 -readonly} {
3570: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
3580: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
3590: 64 20 3d 20 7a 65 72 6f 62 6c 6f 62 28 31 30 30  d = zeroblob(100
35a0: 30 30 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74  00);.  }..  do_t
35b0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 31  est incrblob-7.1
35c0: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 65 74  .$tn.1 {.    set
35d0: 20 3a 3a 62 20 5b 65 76 61 6c 20 64 62 20 69 6e   ::b [eval db in
35e0: 63 72 62 6c 6f 62 20 24 61 72 67 20 74 31 20 64  crblob $arg t1 d
35f0: 20 31 5d 0a 20 20 20 20 62 69 6e 61 72 79 20 73   1].    binary s
3600: 63 61 6e 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f  can [sqlite3_blo
3610: 62 5f 72 65 61 64 20 24 3a 3a 62 20 35 30 30 30  b_read $::b 5000
3620: 20 35 5d 20 63 2a 20 63 0a 20 20 20 20 73 65 74   5] c* c.    set
3630: 20 63 0a 20 20 7d 20 7b 30 20 30 20 30 20 30 20   c.  } {0 0 0 0 
3640: 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63  0}.  do_test inc
3650: 72 62 6c 6f 62 2d 37 2e 31 2e 24 74 6e 2e 32 20  rblob-7.1.$tn.2 
3660: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3670: 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20        UPDATE t1 
3680: 53 45 54 20 64 20 3d 20 31 35 3b 0a 20 20 20 20  SET d = 15;.    
3690: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
36a0: 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 31 2e  st incrblob-7.1.
36b0: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73 65 74 20  $tn.3 {.    set 
36c0: 72 63 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69  rc [catch { sqli
36d0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24 3a  te3_blob_read $:
36e0: 3a 62 20 35 30 30 30 20 35 20 7d 20 6d 73 67 5d  :b 5000 5 } msg]
36f0: 0a 20 20 20 20 6c 69 73 74 20 24 72 63 20 24 6d  .    list $rc $m
3700: 73 67 0a 20 20 7d 20 7b 31 20 53 51 4c 49 54 45  sg.  } {1 SQLITE
3710: 5f 41 42 4f 52 54 7d 0a 20 20 64 6f 5f 74 65 73  _ABORT}.  do_tes
3720: 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 31 2e 24  t incrblob-7.1.$
3730: 74 6e 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.4 {.    execs
3740: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3750: 54 20 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T d FROM t1;.   
3760: 20 7d 0a 20 20 7d 20 7b 31 35 7d 0a 20 20 64 6f   }.  } {15}.  do
3770: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37  _test incrblob-7
3780: 2e 31 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 73  .1.$tn.5 {.    s
3790: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 63  et rc [catch { c
37a0: 6c 6f 73 65 20 24 3a 3a 62 20 7d 20 6d 73 67 5d  lose $::b } msg]
37b0: 0a 20 20 20 20 6c 69 73 74 20 24 72 63 20 24 6d  .    list $rc $m
37c0: 73 67 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20  sg.  } {0 {}}.  
37d0: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
37e0: 2d 37 2e 31 2e 24 74 6e 2e 36 20 7b 0a 20 20 20  -7.1.$tn.6 {.   
37f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3800: 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20 74   SELECT d FROM t
3810: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 35  1;.    }.  } {15
3820: 7d 0a 0a 7d 0a 0a 73 65 74 20 66 64 20 5b 6f 70  }..}..set fd [op
3830: 65 6e 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d  en [info script]
3840: 5d 0a 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64  ].fconfigure $fd
3850: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69   -translation bi
3860: 6e 61 72 79 0a 73 65 74 20 3a 3a 64 61 74 61 20  nary.set ::data 
3870: 5b 72 65 61 64 20 24 66 64 20 31 34 30 30 30 5d  [read $fd 14000]
3880: 0a 63 6c 6f 73 65 20 24 66 64 0a 0a 64 62 20 63  .close $fd..db c
3890: 6c 6f 73 65 0a 66 69 6c 65 20 64 65 6c 65 74 65  lose.file delete
38a0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
38b0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
38c0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
38d0: 64 62 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  db..do_test incr
38e0: 62 6c 6f 62 2d 37 2e 32 2e 31 20 7b 0a 20 20 65  blob-7.2.1 {.  e
38f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
3900: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
3910: 3d 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 22 3b  = "incremental";
3920: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3930: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
3940: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 20  RIMARY KEY, b); 
3950: 20 20 20 20 20 20 20 2d 2d 20 72 6f 6f 74 40 70         -- root@p
3960: 61 67 65 33 0a 20 20 20 20 49 4e 53 45 52 54 20  age3.    INSERT 
3970: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
3980: 32 33 2c 20 24 3a 3a 64 61 74 61 29 3b 0a 20 20  23, $::data);.  
3990: 7d 0a 20 20 73 65 74 20 3a 3a 62 20 5b 64 62 20  }.  set ::b [db 
39a0: 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e  incrblob -readon
39b0: 6c 79 20 74 31 20 62 20 31 32 33 5d 0a 20 20 66  ly t1 b 123].  f
39c0: 63 6f 6e 66 69 67 75 72 65 20 24 3a 3a 62 20 2d  configure $::b -
39d0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61  translation bina
39e0: 72 79 0a 20 20 72 65 61 64 20 24 3a 3a 62 0a 7d  ry.  read $::b.}
39f0: 20 24 3a 3a 64 61 74 61 0a 64 6f 5f 74 65 73 74   $::data.do_test
3a00: 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 32 2e 32 20   incrblob-7.2.2 
3a10: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3a20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3a30: 32 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  2(a INTEGER PRIM
3a40: 41 52 59 20 4b 45 59 2c 20 62 29 3b 20 20 20 20  ARY KEY, b);    
3a50: 20 20 20 20 2d 2d 20 72 6f 6f 74 40 70 61 67 65      -- root@page
3a60: 34 0a 20 20 7d 0a 20 20 73 65 65 6b 20 24 3a 3a  4.  }.  seek $::
3a70: 62 20 30 0a 20 20 72 65 61 64 20 24 3a 3a 62 0a  b 0.  read $::b.
3a80: 7d 20 24 3a 3a 64 61 74 61 0a 64 6f 5f 74 65 73  } $::data.do_tes
3a90: 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 32 2e 33  t incrblob-7.2.3
3aa0: 20 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 62 0a   {.  close $::b.
3ab0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3ac0: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
3ad0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
3ae0: 65 72 3b 0a 20 20 7d 0a 7d 20 7b 33 20 34 7d 0a  er;.  }.} {3 4}.
3af0: 0a 73 65 74 20 3a 3a 6f 74 68 65 72 64 61 74 61  .set ::otherdata
3b00: 20 22 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20   "[string range 
3b10: 24 3a 3a 64 61 74 61 20 30 20 31 30 30 30 5d 5b  $::data 0 1000][
3b20: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 3a 3a  string range $::
3b30: 64 61 74 61 20 31 30 30 31 20 65 6e 64 5d 22 0a  data 1001 end]".
3b40: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
3b50: 2d 37 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  -7.3.1 {.  execs
3b60: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
3b70: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34  INTO t2 VALUES(4
3b80: 35 36 2c 20 24 3a 3a 6f 74 68 65 72 64 61 74 61  56, $::otherdata
3b90: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a 62  );.  }.  set ::b
3ba0: 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72   [db incrblob -r
3bb0: 65 61 64 6f 6e 6c 79 20 74 32 20 62 20 34 35 36  eadonly t2 b 456
3bc0: 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24  ].  fconfigure $
3bd0: 3a 3a 62 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  ::b -translation
3be0: 20 62 69 6e 61 72 79 0a 20 20 72 65 61 64 20 24   binary.  read $
3bf0: 3a 3a 62 0a 7d 20 24 3a 3a 6f 74 68 65 72 64 61  ::b.} $::otherda
3c00: 74 61 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  ta.do_test incrb
3c10: 6c 6f 62 2d 37 2e 33 2e 32 20 7b 0a 20 20 65 78  lob-7.3.2 {.  ex
3c20: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
3c30: 73 74 2e 64 62 5d 2f 31 30 32 34 0a 7d 20 33 30  st.db]/1024.} 30
3c40: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
3c50: 62 2d 37 2e 33 2e 33 20 7b 0a 20 20 65 78 65 63  b-7.3.3 {.  exec
3c60: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
3c70: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
3c80: 20 3d 20 31 32 33 3b 0a 20 20 20 20 50 52 41 47   = 123;.    PRAG
3c90: 4d 41 20 49 4e 43 52 45 4d 45 4e 54 41 4c 5f 56  MA INCREMENTAL_V
3ca0: 41 43 55 55 4d 28 30 29 3b 0a 20 20 7d 0a 20 20  ACUUM(0);.  }.  
3cb0: 73 65 65 6b 20 24 3a 3a 62 20 30 0a 20 20 72 65  seek $::b 0.  re
3cc0: 61 64 20 24 3a 3a 62 0a 7d 20 24 3a 3a 6f 74 68  ad $::b.} $::oth
3cd0: 65 72 64 61 74 61 0a 0a 23 20 41 74 74 65 6d 70  erdata..# Attemp
3ce0: 74 20 74 6f 20 77 72 69 74 65 20 6f 6e 20 61 20  t to write on a 
3cf0: 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 2e 20  read-only blob. 
3d00: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 65   Make sure the e
3d10: 72 72 6f 72 20 63 6f 64 65 0a 23 20 67 65 74 73  rror code.# gets
3d20: 20 73 65 74 2e 20 20 54 69 63 6b 65 74 20 23 32   set.  Ticket #2
3d30: 34 36 34 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69  464..#.do_test i
3d40: 6e 63 72 62 6c 6f 62 2d 37 2e 34 20 7b 0a 20 20  ncrblob-7.4 {.  
3d50: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73  set rc [catch {s
3d60: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
3d70: 65 20 24 3a 3a 62 20 31 30 20 48 45 4c 4c 4f 7d  e $::b 10 HELLO}
3d80: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
3d90: 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c  rc $msg.} {1 SQL
3da0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 7d 0a 64 6f  ITE_READONLY}.do
3db0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37  _test incrblob-7
3dc0: 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .5 {.  sqlite3_e
3dd0: 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c  rrcode db.} {SQL
3de0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 7d 0a 64 6f  ITE_READONLY}.do
3df0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37  _test incrblob-7
3e00: 2e 36 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .6 {.  sqlite3_e
3e10: 72 72 6d 73 67 20 64 62 0a 7d 20 7b 61 74 74 65  rrmsg db.} {atte
3e20: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
3e30: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
3e40: 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 69  }..# Test that i
3e50: 66 20 65 69 74 68 65 72 20 74 68 65 20 22 6f 66  f either the "of
3e60: 66 73 65 74 22 20 6f 72 20 22 61 6d 6f 75 6e 74  fset" or "amount
3e70: 22 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 23  " arguments to.#
3e80: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
3e90: 69 74 65 28 29 20 61 72 65 20 6c 65 73 73 20 74  ite() are less t
3ea0: 68 61 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45  han zero, SQLITE
3eb0: 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e  _ERROR is return
3ec0: 65 64 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 69  ed..# .do_test i
3ed0: 6e 63 72 62 6c 6f 62 2d 38 2e 31 20 7b 0a 20 20  ncrblob-8.1 {.  
3ee0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
3ef0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3f00: 33 31 34 31 35 39 2c 20 27 73 71 6c 69 74 65 27  314159, 'sqlite'
3f10: 29 20 7d 0a 20 20 73 65 74 20 3a 3a 62 20 5b 64  ) }.  set ::b [d
3f20: 62 20 69 6e 63 72 62 6c 6f 62 20 74 31 20 62 20  b incrblob t1 b 
3f30: 33 31 34 31 35 39 5d 0a 20 20 66 63 6f 6e 66 69  314159].  fconfi
3f40: 67 75 72 65 20 24 3a 3a 62 20 2d 74 72 61 6e 73  gure $::b -trans
3f50: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20  lation binary.  
3f60: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73  set rc [catch {s
3f70: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
3f80: 65 20 24 3a 3a 62 20 31 30 20 48 45 4c 4c 4f 20  e $::b 10 HELLO 
3f90: 2d 31 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65  -1} msg].  lappe
3fa0: 6e 64 20 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20  nd rc $msg.} {1 
3fb0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f  SQLITE_ERROR}.do
3fc0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 38  _test incrblob-8
3fd0: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .2 {.  sqlite3_e
3fe0: 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c  rrcode db.} {SQL
3ff0: 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65  ITE_ERROR}.do_te
4000: 73 74 20 69 6e 63 72 62 6c 6f 62 2d 38 2e 33 20  st incrblob-8.3 
4010: 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63  {.  set rc [catc
4020: 68 20 7b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  h {sqlite3_blob_
4030: 77 72 69 74 65 20 24 3a 3a 62 20 2d 31 20 48 45  write $::b -1 HE
4040: 4c 4c 4f 20 35 7d 20 6d 73 67 5d 0a 20 20 6c 61  LLO 5} msg].  la
4050: 70 70 65 6e 64 20 72 63 20 24 6d 73 67 0a 7d 20  ppend rc $msg.} 
4060: 7b 31 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d  {1 SQLITE_ERROR}
4070: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
4080: 62 2d 38 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65  b-8.4 {.  sqlite
4090: 33 5f 65 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b  3_errcode db.} {
40a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f  SQLITE_ERROR}.do
40b0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 38  _test incrblob-8
40c0: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
40d0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31  SELECT b FROM t1
40e0: 20 57 48 45 52 45 20 61 20 3d 20 33 31 34 31 35   WHERE a = 31415
40f0: 39 7d 0a 7d 20 7b 73 71 6c 69 74 65 7d 0a 64 6f  9}.} {sqlite}.do
4100: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 38  _test incrblob-8
4110: 2e 36 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63  .6 {.  set rc [c
4120: 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 62 6c  atch {sqlite3_bl
4130: 6f 62 5f 77 72 69 74 65 20 24 3a 3a 62 20 30 20  ob_write $::b 0 
4140: 65 74 69 6c 71 73 20 36 7d 20 6d 73 67 5d 0a 20  etilqs 6} msg]. 
4150: 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73 67   lappend rc $msg
4160: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
4170: 74 20 69 6e 63 72 62 6c 6f 62 2d 38 2e 37 20 7b  t incrblob-8.7 {
4180: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
4190: 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  CT b FROM t1 WHE
41a0: 52 45 20 61 20 3d 20 33 31 34 31 35 39 7d 0a 7d  RE a = 314159}.}
41b0: 20 7b 65 74 69 6c 71 73 7d 0a 0a 0a 66 69 6e 69   {etilqs}...fini
41c0: 73 68 5f 74 65 73 74 0a                          sh_test.