/ Hex Artifact Content
Login

Artifact 26fde912a1e0aff158b3a84ef3b265f046aad3be:


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 6f 72 63 65 64  b close.  forced
0b00: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65  elete test.db te
0b10: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 0a 20  st.db-journal.. 
0b20: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
0b30: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 22 50  .db.  execsql "P
0b40: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
0b50: 6d 20 3d 20 24 41 75 74 6f 56 61 63 75 75 6d 4d  m = $AutoVacuumM
0b60: 6f 64 65 22 0a 0a 20 20 64 6f 5f 74 65 73 74 20  ode"..  do_test 
0b70: 69 6e 63 72 62 6c 6f 62 2d 32 2e 24 41 75 74 6f  incrblob-2.$Auto
0b80: 56 61 63 75 75 6d 4d 6f 64 65 2e 31 20 7b 0a 20  VacuumMode.1 {. 
0b90: 20 20 20 73 65 74 20 3a 3a 73 74 72 20 5b 73 74     set ::str [st
0ba0: 72 69 6e 67 20 72 65 70 65 61 74 20 61 62 63 64  ring repeat abcd
0bb0: 65 66 67 68 69 6a 20 32 39 30 30 5d 0a 20 20 20  efghij 2900].   
0bc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
0bd0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
0be0: 45 41 54 45 20 54 41 42 4c 45 20 62 6c 6f 62 73  EATE TABLE blobs
0bf0: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (k PRIMARY KEY, 
0c00: 76 20 42 4c 4f 42 2c 20 69 20 49 4e 54 45 47 45  v BLOB, i INTEGE
0c10: 52 29 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  R);.      DELETE
0c20: 20 46 52 4f 4d 20 62 6c 6f 62 73 3b 0a 20 20 20   FROM blobs;.   
0c30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
0c40: 6c 6f 62 73 20 56 41 4c 55 45 53 28 27 6f 6e 65  lobs VALUES('one
0c50: 27 2c 20 24 3a 3a 73 74 72 20 7c 7c 20 72 61 6e  ', $::str || ran
0c60: 64 73 74 72 28 35 30 30 2c 35 30 30 29 2c 20 34  dstr(500,500), 4
0c70: 35 29 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54  5);.      COMMIT
0c80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72  ;.    }.    expr
0c90: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
0ca0: 2e 64 62 5d 2f 31 30 32 34 0a 20 20 7d 20 5b 65  .db]/1024.  } [e
0cb0: 78 70 72 20 33 31 20 2b 20 24 41 75 74 6f 56 61  xpr 31 + $AutoVa
0cc0: 63 75 75 6d 4d 6f 64 65 5d 0a 0a 20 20 69 66 63  cuumMode]..  ifc
0cd0: 61 70 61 62 6c 65 20 61 75 74 6f 76 61 63 75 75  apable autovacuu
0ce0: 6d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  m {.    do_test 
0cf0: 69 6e 63 72 62 6c 6f 62 2d 32 2e 24 41 75 74 6f  incrblob-2.$Auto
0d00: 56 61 63 75 75 6d 4d 6f 64 65 2e 32 20 7b 0a 20  VacuumMode.2 {. 
0d10: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
0d20: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75         PRAGMA au
0d30: 74 6f 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 20  to_vacuum;.     
0d40: 20 7d 0a 20 20 20 20 7d 20 24 41 75 74 6f 56 61   }.    } $AutoVa
0d50: 63 75 75 6d 4d 6f 64 65 0a 20 20 7d 0a 0a 20 20  cuumMode.  }..  
0d60: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
0d70: 2d 32 2e 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f  -2.$AutoVacuumMo
0d80: 64 65 2e 33 20 7b 0a 20 20 20 20 23 20 4f 70 65  de.3 {.    # Ope
0d90: 6e 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  n and close the 
0da0: 64 62 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  db to make sure 
0db0: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
0dc0: 73 20 65 6d 70 74 79 2e 0a 20 20 20 20 64 62 20  s empty..    db 
0dd0: 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65  close.    sqlite
0de0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 0a  3 db test.db.  .
0df0: 20 20 20 20 23 20 52 65 61 64 20 74 68 65 20 6c      # Read the l
0e00: 61 73 74 20 32 30 20 62 79 74 65 73 20 6f 66 20  ast 20 bytes of 
0e10: 74 68 65 20 62 6c 6f 62 20 76 69 61 20 61 20 62  the blob via a b
0e20: 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  lob handle..    
0e30: 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69  set ::blob [db i
0e40: 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 76 20  ncrblob blobs v 
0e50: 31 5d 0a 20 20 20 20 73 65 65 6b 20 24 3a 3a 62  1].    seek $::b
0e60: 6c 6f 62 20 2d 32 30 20 65 6e 64 0a 20 20 20 20  lob -20 end.    
0e70: 73 65 74 20 3a 3a 66 72 61 67 6d 65 6e 74 20 5b  set ::fragment [
0e80: 72 65 61 64 20 24 3a 3a 62 6c 6f 62 5d 0a 20 20  read $::blob].  
0e90: 20 20 63 6c 6f 73 65 20 24 3a 3a 62 6c 6f 62 0a    close $::blob.
0ea0: 20 20 0a 20 20 20 20 23 20 49 66 20 74 68 65 20    .    # If the 
0eb0: 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
0ec0: 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
0ed0: 6f 64 65 2c 20 74 68 65 20 77 68 6f 6c 65 20 6f  ode, the whole o
0ee0: 66 0a 20 20 20 20 23 20 74 68 65 20 6f 76 65 72  f.    # the over
0ef0: 66 6c 6f 77 2d 63 68 61 69 6e 20 6d 75 73 74 20  flow-chain must 
0f00: 62 65 20 73 63 61 6e 6e 65 64 2e 20 49 6e 20 61  be scanned. In a
0f10: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2c  uto-vacuum mode,
0f20: 0a 20 20 20 20 23 20 73 71 6c 69 74 65 20 75 73  .    # sqlite us
0f30: 65 73 20 74 68 65 20 70 74 72 6d 61 70 20 70 61  es the ptrmap pa
0f40: 67 65 73 20 74 6f 20 61 76 6f 69 64 20 72 65 61  ges to avoid rea
0f50: 64 69 6e 67 20 74 68 65 20 6f 74 68 65 72 20 70  ding the other p
0f60: 61 67 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20  ages..    #.    
0f70: 6e 52 65 61 64 20 64 62 0a 20 20 7d 20 5b 65 78  nRead db.  } [ex
0f80: 70 72 20 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f  pr $AutoVacuumMo
0f90: 64 65 20 3f 20 34 20 3a 20 33 30 5d 0a 0a 20 20  de ? 4 : 30]..  
0fa0: 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62  do_test incrblob
0fb0: 2d 32 2e 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f  -2.$AutoVacuumMo
0fc0: 64 65 2e 34 20 7b 0a 20 20 20 20 73 74 72 69 6e  de.4 {.    strin
0fd0: 67 20 72 61 6e 67 65 20 5b 64 62 20 6f 6e 65 20  g range [db one 
0fe0: 7b 53 45 4c 45 43 54 20 76 20 46 52 4f 4d 20 62  {SELECT v FROM b
0ff0: 6c 6f 62 73 7d 5d 20 65 6e 64 2d 31 39 20 65 6e  lobs}] end-19 en
1000: 64 0a 20 20 7d 20 24 3a 3a 66 72 61 67 6d 65 6e  d.  } $::fragmen
1010: 74 0a 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63  t..  do_test inc
1020: 72 62 6c 6f 62 2d 32 2e 24 41 75 74 6f 56 61 63  rblob-2.$AutoVac
1030: 75 75 6d 4d 6f 64 65 2e 35 20 7b 0a 20 20 20 20  uumMode.5 {.    
1040: 23 20 4f 70 65 6e 20 61 6e 64 20 63 6c 6f 73 65  # Open and close
1050: 20 74 68 65 20 64 62 20 74 6f 20 6d 61 6b 65 20   the db to make 
1060: 73 75 72 65 20 74 68 65 20 70 61 67 65 20 63 61  sure the page ca
1070: 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  che is empty..  
1080: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
1090: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
10a0: 62 0a 20 20 0a 20 20 20 20 23 20 57 72 69 74 65  b.  .    # Write
10b0: 20 74 68 65 20 73 65 63 6f 6e 64 2d 74 6f 2d 6c   the second-to-l
10c0: 61 73 74 20 32 30 20 62 79 74 65 73 20 6f 66 20  ast 20 bytes of 
10d0: 74 68 65 20 62 6c 6f 62 20 76 69 61 20 61 20 62  the blob via a b
10e0: 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  lob handle..    
10f0: 23 0a 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f 62  #.    set ::blob
1100: 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c   [db incrblob bl
1110: 6f 62 73 20 76 20 31 5d 0a 20 20 20 20 73 65 65  obs v 1].    see
1120: 6b 20 24 3a 3a 62 6c 6f 62 20 2d 34 30 20 65 6e  k $::blob -40 en
1130: 64 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65  d.    puts -none
1140: 77 6c 69 6e 65 20 24 3a 3a 62 6c 6f 62 20 22 31  wline $::blob "1
1150: 32 33 34 35 36 37 38 39 30 61 62 63 64 65 66 67  234567890abcdefg
1160: 68 69 6a 22 0a 20 20 20 20 66 6c 75 73 68 20 24  hij".    flush $
1170: 3a 3a 62 6c 6f 62 0a 20 20 0a 20 20 20 20 23 20  ::blob.  .    # 
1180: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1190: 69 73 20 6e 6f 74 20 69 6e 20 61 75 74 6f 2d 76  is not in auto-v
11a0: 61 63 75 75 6d 20 6d 6f 64 65 2c 20 74 68 65 20  acuum mode, the 
11b0: 77 68 6f 6c 65 20 6f 66 0a 20 20 20 20 23 20 74  whole of.    # t
11c0: 68 65 20 6f 76 65 72 66 6c 6f 77 2d 63 68 61 69  he overflow-chai
11d0: 6e 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  n must be scanne
11e0: 64 2e 20 49 6e 20 61 75 74 6f 2d 76 61 63 75 75  d. In auto-vacuu
11f0: 6d 20 6d 6f 64 65 2c 0a 20 20 20 20 23 20 73 71  m mode,.    # sq
1200: 6c 69 74 65 20 75 73 65 73 20 74 68 65 20 70 74  lite uses the pt
1210: 72 6d 61 70 20 70 61 67 65 73 20 74 6f 20 61 76  rmap pages to av
1220: 6f 69 64 20 72 65 61 64 69 6e 67 20 74 68 65 20  oid reading the 
1230: 6f 74 68 65 72 20 70 61 67 65 73 2e 0a 20 20 20  other pages..   
1240: 20 23 0a 20 20 20 20 6e 52 65 61 64 20 64 62 0a   #.    nRead db.
1250: 20 20 7d 20 5b 65 78 70 72 20 24 41 75 74 6f 56    } [expr $AutoV
1260: 61 63 75 75 6d 4d 6f 64 65 20 3f 20 34 20 3a 20  acuumMode ? 4 : 
1270: 33 30 5d 0a 0a 20 20 23 20 50 61 67 65 73 20 31  30]..  # Pages 1
1280: 20 28 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e   (the write-coun
1290: 74 65 72 29 20 61 6e 64 20 33 32 20 28 74 68 65  ter) and 32 (the
12a0: 20 62 6c 6f 62 20 64 61 74 61 29 20 77 65 72 65   blob data) were
12b0: 20 77 72 69 74 74 65 6e 2e 0a 20 20 64 6f 5f 74   written..  do_t
12c0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 32 2e 24  est incrblob-2.$
12d0: 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65 2e 36  AutoVacuumMode.6
12e0: 20 7b 0a 20 20 20 20 63 6c 6f 73 65 20 24 3a 3a   {.    close $::
12f0: 62 6c 6f 62 0a 20 20 20 20 6e 57 72 69 74 65 20  blob.    nWrite 
1300: 64 62 0a 20 20 7d 20 32 0a 0a 20 20 64 6f 5f 74  db.  } 2..  do_t
1310: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 32 2e 24  est incrblob-2.$
1320: 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65 2e 37  AutoVacuumMode.7
1330: 20 7b 0a 20 20 20 20 73 74 72 69 6e 67 20 72 61   {.    string ra
1340: 6e 67 65 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c  nge [db one {SEL
1350: 45 43 54 20 76 20 46 52 4f 4d 20 62 6c 6f 62 73  ECT v FROM blobs
1360: 7d 5d 20 65 6e 64 2d 33 39 20 65 6e 64 2d 32 30  }] end-39 end-20
1370: 0a 20 20 7d 20 22 31 32 33 34 35 36 37 38 39 30  .  } "1234567890
1380: 61 62 63 64 65 66 67 68 69 6a 22 0a 0a 20 20 64  abcdefghij"..  d
1390: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
13a0: 32 2e 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64  2.$AutoVacuumMod
13b0: 65 2e 38 20 7b 0a 20 20 20 20 23 20 4f 70 65 6e  e.8 {.    # Open
13c0: 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 64   and close the d
13d0: 62 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  b to make sure t
13e0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
13f0: 20 65 6d 70 74 79 2e 0a 20 20 20 20 64 62 20 63   empty..    db c
1400: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
1410: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 20   db test.db..   
1420: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1430: 54 20 69 20 46 52 4f 4d 20 62 6c 6f 62 73 20 7d  T i FROM blobs }
1440: 20 0a 20 20 7d 20 7b 34 35 7d 0a 0a 20 20 64 6f   .  } {45}..  do
1450: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 32  _test incrblob-2
1460: 2e 24 41 75 74 6f 56 61 63 75 75 6d 4d 6f 64 65  .$AutoVacuumMode
1470: 2e 39 20 7b 0a 20 20 20 20 6e 52 65 61 64 20 64  .9 {.    nRead d
1480: 62 0a 20 20 7d 20 5b 65 78 70 72 20 24 41 75 74  b.  } [expr $Aut
1490: 6f 56 61 63 75 75 6d 4d 6f 64 65 20 3f 20 34 20  oVacuumMode ? 4 
14a0: 3a 20 33 30 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f  : 30].}.sqlite3_
14b0: 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20  soft_heap_limit 
14c0: 24 63 6d 64 6c 69 6e 65 61 72 67 28 73 6f 66 74  $cmdlinearg(soft
14d0: 2d 68 65 61 70 2d 6c 69 6d 69 74 29 0a 0a 23 2d  -heap-limit)..#-
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 69 6e 63 72 62 6c  -------.# incrbl
1530: 6f 62 2d 33 2e 2a 3a 20 0a 23 0a 23 20 54 65 73  ob-3.*: .#.# Tes
1540: 74 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  t the outcome of
1550: 20 74 72 79 69 6e 67 20 74 6f 20 77 72 69 74 65   trying to write
1560: 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1570: 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 23 0a 64  blob handle..#.d
1580: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
1590: 33 2e 31 20 7b 0a 20 20 73 65 74 20 3a 3a 62 6c  3.1 {.  set ::bl
15a0: 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  ob [db incrblob 
15b0: 2d 72 65 61 64 6f 6e 6c 79 20 62 6c 6f 62 73 20  -readonly blobs 
15c0: 76 20 31 5d 0a 20 20 73 65 65 6b 20 24 3a 3a 62  v 1].  seek $::b
15d0: 6c 6f 62 20 2d 34 30 20 65 6e 64 0a 20 20 72 65  lob -40 end.  re
15e0: 61 64 20 24 3a 3a 62 6c 6f 62 20 32 30 0a 7d 20  ad $::blob 20.} 
15f0: 22 31 32 33 34 35 36 37 38 39 30 61 62 63 64 65  "1234567890abcde
1600: 66 67 68 69 6a 22 0a 64 6f 5f 74 65 73 74 20 69  fghij".do_test i
1610: 6e 63 72 62 6c 6f 62 2d 33 2e 32 20 7b 0a 20 20  ncrblob-3.2 {.  
1620: 73 65 65 6b 20 24 3a 3a 62 6c 6f 62 20 30 0a 20  seek $::blob 0. 
1630: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
1640: 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  .    puts -nonew
1650: 6c 69 6e 65 20 24 3a 3a 62 6c 6f 62 20 22 68 65  line $::blob "he
1660: 6c 6c 6f 77 6f 72 6c 64 22 0a 20 20 7d 20 6d 73  lloworld".  } ms
1670: 67 5d 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 62 6c  g].  close $::bl
1680: 6f 62 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d  ob.  list $rc $m
1690: 73 67 0a 7d 20 22 31 20 7b 63 68 61 6e 6e 65 6c  sg.} "1 {channel
16a0: 20 5c 22 24 3a 3a 62 6c 6f 62 5c 22 20 77 61 73   \"$::blob\" was
16b0: 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  n't opened for w
16c0: 72 69 74 69 6e 67 7d 22 0a 0a 64 6f 5f 74 65 73  riting}"..do_tes
16d0: 74 20 69 6e 63 72 62 6c 6f 62 2d 33 2e 33 20 7b  t incrblob-3.3 {
16e0: 0a 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64  .  set ::blob [d
16f0: 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64  b incrblob -read
1700: 6f 6e 6c 79 20 62 6c 6f 62 73 20 76 20 31 5d 0a  only blobs v 1].
1710: 20 20 73 65 65 6b 20 24 3a 3a 62 6c 6f 62 20 2d    seek $::blob -
1720: 34 30 20 65 6e 64 0a 20 20 72 65 61 64 20 24 3a  40 end.  read $:
1730: 3a 62 6c 6f 62 20 32 30 0a 7d 20 22 31 32 33 34  :blob 20.} "1234
1740: 35 36 37 38 39 30 61 62 63 64 65 66 67 68 69 6a  567890abcdefghij
1750: 22 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  ".do_test incrbl
1760: 6f 62 2d 33 2e 34 20 7b 0a 20 20 73 65 74 20 72  ob-3.4 {.  set r
1770: 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 73  c [catch {.    s
1780: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
1790: 65 20 24 3a 3a 62 6c 6f 62 20 32 30 20 22 71 77  e $::blob 20 "qw
17a0: 65 72 74 79 75 69 6f 70 6c 6b 6a 68 67 66 64 73  ertyuioplkjhgfds
17b0: 22 20 0a 20 20 7d 20 6d 73 67 5d 0a 20 20 6c 69  " .  } msg].  li
17c0: 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31  st $rc $msg.} {1
17d0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17e0: 7d 0a 63 61 74 63 68 20 7b 63 6c 6f 73 65 20 24  }.catch {close $
17f0: 3a 3a 62 6c 6f 62 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ::blob}..#------
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 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 0a 23 20 69 6e 63 72 62 6c 6f 62 2d 34 2e  --.# incrblob-4.
1850: 2a 3a 20 0a 23 0a 23 20 54 72 79 20 61 20 63 6f  *: .#.# Try a co
1860: 75 70 6c 65 20 6f 66 20 65 72 72 6f 72 20 63 6f  uple of error co
1870: 6e 64 69 74 69 6f 6e 73 3a 0a 23 0a 23 20 20 20  nditions:.#.#   
1880: 20 20 34 2e 31 20 2d 20 41 74 74 65 6d 70 74 20    4.1 - Attempt 
1890: 74 6f 20 6f 70 65 6e 20 61 20 72 6f 77 20 74 68  to open a row th
18a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  at does not exis
18b0: 74 2e 0a 23 20 20 20 20 20 34 2e 32 20 2d 20 41  t..#     4.2 - A
18c0: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
18d0: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 64 6f 65   column that doe
18e0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 23 20 20  s not exist..#  
18f0: 20 20 20 34 2e 33 20 2d 20 41 74 74 65 6d 70 74     4.3 - Attempt
1900: 20 74 6f 20 6f 70 65 6e 20 61 20 74 61 62 6c 65   to open a table
1910: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 65   that does not e
1920: 78 69 73 74 2e 0a 23 20 20 20 20 20 34 2e 34 20  xist..#     4.4 
1930: 2d 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  - Attempt to ope
1940: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
1950: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
1960: 2e 0a 23 0a 23 20 20 20 20 20 34 2e 35 20 2d 20  ..#.#     4.5 - 
1970: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
1980: 61 6e 20 69 6e 74 65 67 65 72 0a 23 20 20 20 20  an integer.#    
1990: 20 34 2e 36 20 2d 20 41 74 74 65 6d 70 74 20 74   4.6 - Attempt t
19a0: 6f 20 6f 70 65 6e 20 61 20 72 65 61 6c 20 76 61  o open a real va
19b0: 6c 75 65 0a 23 20 20 20 20 20 34 2e 37 20 2d 20  lue.#     4.7 - 
19c0: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
19d0: 61 6e 20 53 51 4c 20 6e 75 6c 6c 0a 23 0a 23 20  an SQL null.#.# 
19e0: 20 20 20 20 34 2e 38 20 2d 20 41 74 74 65 6d 70      4.8 - Attemp
19f0: 74 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e 64  t to open an ind
1a00: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 66 6f 72 20  exed column for 
1a10: 77 72 69 74 69 6e 67 0a 23 20 20 20 20 20 34 2e  writing.#     4.
1a20: 39 20 2d 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  9 - Attempt to o
1a30: 70 65 6e 20 61 6e 20 69 6e 64 65 78 65 64 20 63  pen an indexed c
1a40: 6f 6c 75 6d 6e 20 66 6f 72 20 72 65 61 64 69 6e  olumn for readin
1a50: 67 20 28 74 68 69 73 20 77 6f 72 6b 73 29 0a 23  g (this works).#
1a60: 0a 23 20 20 20 20 20 34 2e 31 31 20 2d 20 41 74  .#     4.11 - At
1a70: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
1a80: 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 65 77  column of a view
1a90: 2e 0a 23 20 20 20 20 20 34 2e 31 32 20 2d 20 41  ..#     4.12 - A
1aa0: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
1ab0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72   column of a vir
1ac0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 23 0a 64 6f  tual table..#.do
1ad0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 34  _test incrblob-4
1ae0: 2e 31 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63  .1 {.  set rc [c
1af0: 61 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a  atch {.    set :
1b00: 3a 62 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c  :blob [db incrbl
1b10: 6f 62 20 62 6c 6f 62 73 20 76 20 32 5d 0a 20 20  ob blobs v 2].  
1b20: 7d 20 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74 20  } msg ] .  list 
1b30: 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e  $rc $msg.} {1 {n
1b40: 6f 20 73 75 63 68 20 72 6f 77 69 64 3a 20 32 7d  o such rowid: 2}
1b50: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c  }.do_test incrbl
1b60: 6f 62 2d 34 2e 32 20 7b 0a 20 20 73 65 74 20 72  ob-4.2 {.  set r
1b70: 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 73  c [catch {.    s
1b80: 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69 6e  et ::blob [db in
1b90: 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20 62 6c 75  crblob blobs blu
1ba0: 65 20 31 5d 0a 20 20 7d 20 6d 73 67 20 5d 20 0a  e 1].  } msg ] .
1bb0: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
1bc0: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 63 6f  } {1 {no such co
1bd0: 6c 75 6d 6e 3a 20 22 62 6c 75 65 22 7d 7d 0a 64  lumn: "blue"}}.d
1be0: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
1bf0: 34 2e 33 20 7b 0a 20 20 73 65 74 20 72 63 20 5b  4.3 {.  set rc [
1c00: 63 61 74 63 68 20 7b 0a 20 20 20 20 73 65 74 20  catch {.    set 
1c10: 3a 3a 62 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62  ::blob [db incrb
1c20: 6c 6f 62 20 6e 6f 73 75 63 68 74 61 62 6c 65 20  lob nosuchtable 
1c30: 62 6c 75 65 20 31 5d 0a 20 20 7d 20 6d 73 67 20  blue 1].  } msg 
1c40: 5d 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73  ].  list $rc $ms
1c50: 67 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20  g.} {1 {no such 
1c60: 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 6e 6f 73 75  table: main.nosu
1c70: 63 68 74 61 62 6c 65 7d 7d 0a 64 6f 5f 74 65 73  chtable}}.do_tes
1c80: 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 34 20 7b  t incrblob-4.4 {
1c90: 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68  .  set rc [catch
1ca0: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f   {.    set ::blo
1cb0: 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 6e  b [db incrblob n
1cc0: 6f 73 75 63 68 64 62 20 62 6c 6f 62 73 20 76 20  osuchdb blobs v 
1cd0: 31 5d 0a 20 20 7d 20 6d 73 67 20 5d 20 0a 20 20  1].  } msg ] .  
1ce0: 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 7d 20  list $rc $msg.} 
1cf0: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
1d00: 65 3a 20 6e 6f 73 75 63 68 64 62 2e 62 6c 6f 62  e: nosuchdb.blob
1d10: 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 63  s}}..do_test inc
1d20: 72 62 6c 6f 62 2d 34 2e 35 20 7b 0a 20 20 73 65  rblob-4.5 {.  se
1d30: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20  t rc [catch {.  
1d40: 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62    set ::blob [db
1d50: 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20   incrblob blobs 
1d60: 69 20 31 5d 0a 20 20 7d 20 6d 73 67 20 5d 20 0a  i 1].  } msg ] .
1d70: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
1d80: 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f 70 65  } {1 {cannot ope
1d90: 6e 20 76 61 6c 75 65 20 6f 66 20 74 79 70 65 20  n value of type 
1da0: 69 6e 74 65 67 65 72 7d 7d 0a 64 6f 5f 74 65 73  integer}}.do_tes
1db0: 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 36 20 7b  t incrblob-4.6 {
1dc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1dd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 6c 6f   INSERT INTO blo
1de0: 62 73 28 6b 2c 20 76 2c 20 69 29 20 56 41 4c 55  bs(k, v, i) VALU
1df0: 45 53 28 31 32 33 2c 20 35 36 37 2e 37 36 35 2c  ES(123, 567.765,
1e00: 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a 20 20 73 65   NULL);.  }.  se
1e10: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20  t rc [catch {.  
1e20: 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62    set ::blob [db
1e30: 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20   incrblob blobs 
1e40: 76 20 32 5d 0a 20 20 7d 20 6d 73 67 20 5d 20 0a  v 2].  } msg ] .
1e50: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
1e60: 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f 70 65  } {1 {cannot ope
1e70: 6e 20 76 61 6c 75 65 20 6f 66 20 74 79 70 65 20  n value of type 
1e80: 72 65 61 6c 7d 7d 0a 64 6f 5f 74 65 73 74 20 69  real}}.do_test i
1e90: 6e 63 72 62 6c 6f 62 2d 34 2e 37 20 7b 0a 20 20  ncrblob-4.7 {.  
1ea0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a  set rc [catch {.
1eb0: 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b      set ::blob [
1ec0: 64 62 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62  db incrblob blob
1ed0: 73 20 69 20 32 5d 0a 20 20 7d 20 6d 73 67 20 5d  s i 2].  } msg ]
1ee0: 20 0a 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73   .  list $rc $ms
1ef0: 67 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f  g.} {1 {cannot o
1f00: 70 65 6e 20 76 61 6c 75 65 20 6f 66 20 74 79 70  pen value of typ
1f10: 65 20 6e 75 6c 6c 7d 7d 0a 0a 64 6f 5f 74 65 73  e null}}..do_tes
1f20: 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 38 2e 31  t incrblob-4.8.1
1f30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1f40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62     INSERT INTO b
1f50: 6c 6f 62 73 28 6b 2c 20 76 2c 20 69 29 20 56 41  lobs(k, v, i) VA
1f60: 4c 55 45 53 28 58 27 30 31 30 32 30 33 30 34 30  LUES(X'010203040
1f70: 35 30 36 30 37 30 38 30 39 27 2c 20 27 68 65 6c  506070809', 'hel
1f80: 6c 6f 27 2c 20 27 77 6f 72 6c 64 27 29 3b 0a 20  lo', 'world');. 
1f90: 20 7d 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74   }.  set rc [cat
1fa0: 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 62  ch {.    set ::b
1fb0: 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  lob [db incrblob
1fc0: 20 62 6c 6f 62 73 20 6b 20 33 5d 0a 20 20 7d 20   blobs k 3].  } 
1fd0: 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74 20 24 72  msg ] .  list $r
1fe0: 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 63 61 6e  c $msg.} {1 {can
1ff0: 6e 6f 74 20 6f 70 65 6e 20 69 6e 64 65 78 65 64  not open indexed
2000: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 72 69 74   column for writ
2010: 69 6e 67 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  ing}}.do_test in
2020: 63 72 62 6c 6f 62 2d 34 2e 38 2e 32 20 7b 0a 20  crblob-4.8.2 {. 
2030: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
2040: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
2050: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2060: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e   KEY, b);.    IN
2070: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
2080: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
2090: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
20a0: 0a 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20  .    set ::blob 
20b0: 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65  [db incrblob -re
20c0: 61 64 6f 6e 6c 79 20 74 33 20 61 20 31 5d 0a 20  adonly t3 a 1]. 
20d0: 20 7d 20 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74   } msg ] .  list
20e0: 20 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b   $rc $msg.} {1 {
20f0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 76 61 6c 75  cannot open valu
2100: 65 20 6f 66 20 74 79 70 65 20 6e 75 6c 6c 7d 7d  e of type null}}
2110: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
2120: 62 2d 34 2e 38 2e 33 20 7b 0a 20 20 73 65 74 20  b-4.8.3 {.  set 
2130: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
2140: 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 20 69  set ::blob [db i
2150: 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
2160: 79 20 74 33 20 72 6f 77 69 64 20 31 5d 0a 20 20  y t3 rowid 1].  
2170: 7d 20 6d 73 67 20 5d 20 0a 20 20 6c 69 73 74 20  } msg ] .  list 
2180: 24 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e  $rc $msg.} {1 {n
2190: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22  o such column: "
21a0: 72 6f 77 69 64 22 7d 7d 0a 0a 64 6f 5f 74 65 73  rowid"}}..do_tes
21b0: 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e 39 2e 31  t incrblob-4.9.1
21c0: 20 7b 0a 20 20 73 65 74 20 72 63 20 5b 63 61 74   {.  set rc [cat
21d0: 63 68 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 62  ch {.    set ::b
21e0: 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  lob [db incrblob
21f0: 20 2d 72 65 61 64 6f 6e 6c 79 20 62 6c 6f 62 73   -readonly blobs
2200: 20 6b 20 33 5d 0a 20 20 7d 20 6d 73 67 5d 0a 7d   k 3].  } msg].}
2210: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63   {0}.do_test inc
2220: 72 62 6c 6f 62 2d 34 2e 39 2e 32 20 7b 0a 20 20  rblob-4.9.2 {.  
2230: 62 69 6e 61 72 79 20 73 63 61 6e 20 5b 72 65 61  binary scan [rea
2240: 64 20 24 3a 3a 62 6c 6f 62 5d 20 63 2a 20 63 0a  d $::blob] c* c.
2250: 20 20 63 6c 6f 73 65 20 24 3a 3a 62 6c 6f 62 0a    close $::blob.
2260: 20 20 73 65 74 20 63 0a 7d 20 7b 31 20 32 20 33    set c.} {1 2 3
2270: 20 34 20 35 20 36 20 37 20 38 20 39 7d 0a 0a 64   4 5 6 7 8 9}..d
2280: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
2290: 34 2e 31 30 20 7b 0a 20 20 73 65 74 20 3a 3a 62  4.10 {.  set ::b
22a0: 6c 6f 62 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62  lob [db incrblob
22b0: 20 2d 72 65 61 64 6f 6e 6c 79 20 62 6c 6f 62 73   -readonly blobs
22c0: 20 6b 20 33 5d 0a 20 20 73 65 74 20 72 63 20 5b   k 3].  set rc [
22d0: 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33 5f  catch { sqlite3_
22e0: 62 6c 6f 62 5f 72 65 61 64 20 24 3a 3a 62 6c 6f  blob_read $::blo
22f0: 62 20 31 30 20 31 30 30 20 7d 20 6d 73 67 5d 0a  b 10 100 } msg].
2300: 20 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a    list $rc $msg.
2310: 7d 20 7b 31 20 53 51 4c 49 54 45 5f 45 52 52 4f  } {1 SQLITE_ERRO
2320: 52 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  R}.do_test incrb
2330: 6c 6f 62 2d 34 2e 31 30 2e 32 20 7b 0a 20 20 63  lob-4.10.2 {.  c
2340: 6c 6f 73 65 20 24 3a 3a 62 6c 6f 62 0a 7d 20 7b  lose $::blob.} {
2350: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 76 69 65  }..ifcapable vie
2360: 77 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e  w {.  do_test in
2370: 63 72 62 6c 6f 62 2d 34 2e 31 31 20 7b 0a 20 20  crblob-4.11 {.  
2380: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 52 45 41    execsql { CREA
2390: 54 45 20 56 49 45 57 20 62 6c 6f 62 73 5f 76 69  TE VIEW blobs_vi
23a0: 65 77 20 41 53 20 53 45 4c 45 43 54 20 6b 2c 20  ew AS SELECT k, 
23b0: 76 2c 20 69 20 46 52 4f 4d 20 62 6c 6f 62 73 20  v, i FROM blobs 
23c0: 7d 0a 20 20 20 20 73 65 74 20 72 63 20 5b 63 61  }.    set rc [ca
23d0: 74 63 68 20 7b 20 64 62 20 69 6e 63 72 62 6c 6f  tch { db incrblo
23e0: 62 20 62 6c 6f 62 73 5f 76 69 65 77 20 76 20 33  b blobs_view v 3
23f0: 20 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 69 73 74   } msg].    list
2400: 20 24 72 63 20 24 6d 73 67 0a 20 20 7d 20 7b 31   $rc $msg.  } {1
2410: 20 7b 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 76 69   {cannot open vi
2420: 65 77 3a 20 62 6c 6f 62 73 5f 76 69 65 77 7d 7d  ew: blobs_view}}
2430: 0a 7d 0a 69 66 63 61 70 61 62 6c 65 20 76 74 61  .}.ifcapable vta
2440: 62 20 7b 0a 20 20 72 65 67 69 73 74 65 72 5f 65  b {.  register_e
2450: 63 68 6f 5f 6d 6f 64 75 6c 65 20 5b 73 71 6c 69  cho_module [sqli
2460: 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
2470: 6f 69 6e 74 65 72 20 64 62 5d 0a 20 20 64 6f 5f  ointer db].  do_
2480: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 34 2e  test incrblob-4.
2490: 31 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  12 {.    execsql
24a0: 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55 41   { CREATE VIRTUA
24b0: 4c 20 54 41 42 4c 45 20 62 6c 6f 62 73 5f 65 63  L TABLE blobs_ec
24c0: 68 6f 20 55 53 49 4e 47 20 65 63 68 6f 28 62 6c  ho USING echo(bl
24d0: 6f 62 73 29 20 7d 0a 20 20 20 20 73 65 74 20 72  obs) }.    set r
24e0: 63 20 5b 63 61 74 63 68 20 7b 20 64 62 20 69 6e  c [catch { db in
24f0: 63 72 62 6c 6f 62 20 62 6c 6f 62 73 5f 65 63 68  crblob blobs_ech
2500: 6f 20 76 20 33 20 7d 20 6d 73 67 5d 0a 20 20 20  o v 3 } msg].   
2510: 20 6c 69 73 74 20 24 72 63 20 24 6d 73 67 0a 20   list $rc $msg. 
2520: 20 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 6f 70   } {1 {cannot op
2530: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
2540: 3a 20 62 6c 6f 62 73 5f 65 63 68 6f 7d 7d 0a 7d  : blobs_echo}}.}
2550: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
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 0a 23 20 69  ------------.# i
25a0: 6e 63 72 62 6c 6f 62 2d 35 2e 2a 3a 20 0a 23 0a  ncrblob-5.*: .#.
25b0: 23 20 20 20 20 20 54 65 73 74 20 74 68 61 74 20  #     Test that 
25c0: 6f 70 65 6e 69 6e 67 20 61 20 62 6c 6f 62 20 69  opening a blob i
25d0: 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  n an attached da
25e0: 74 61 62 61 73 65 20 77 6f 72 6b 73 2e 0a 23 0a  tabase works..#.
25f0: 69 66 63 61 70 61 62 6c 65 20 61 74 74 61 63 68  ifcapable attach
2600: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63   {.  do_test inc
2610: 72 62 6c 6f 62 2d 35 2e 31 20 7b 0a 20 20 20 20  rblob-5.1 {.    
2620: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
2630: 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f  2.db test2.db-jo
2640: 75 72 6e 61 6c 0a 20 20 20 20 73 65 74 20 3a 3a  urnal.    set ::
2650: 73 69 7a 65 20 5b 65 78 70 72 20 5b 66 69 6c 65  size [expr [file
2660: 20 73 69 7a 65 20 5b 69 6e 66 6f 20 73 63 72 69   size [info scri
2670: 70 74 5d 5d 5d 0a 20 20 20 20 65 78 65 63 73 71  pt]]].    execsq
2680: 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48  l {.      ATTACH
2690: 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61   'test2.db' AS a
26a0: 75 78 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ux;.      CREATE
26b0: 20 54 41 42 4c 45 20 61 75 78 2e 66 69 6c 65 73   TABLE aux.files
26c0: 28 6e 61 6d 65 2c 20 74 65 78 74 29 3b 0a 20 20  (name, text);.  
26d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
26e0: 61 75 78 2e 66 69 6c 65 73 20 56 41 4c 55 45 53  aux.files VALUES
26f0: 28 27 74 68 69 73 20 6f 6e 65 27 2c 20 7a 65 72  ('this one', zer
2700: 6f 62 6c 6f 62 28 24 3a 3a 73 69 7a 65 29 29 3b  oblob($::size));
2710: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 66  .    }.    set f
2720: 64 20 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20  d  [db incrblob 
2730: 61 75 78 20 66 69 6c 65 73 20 74 65 78 74 20 31  aux files text 1
2740: 5d 0a 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65  ].    fconfigure
2750: 20 24 66 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f   $fd -translatio
2760: 6e 20 62 69 6e 61 72 79 0a 20 20 20 20 73 65 74  n binary.    set
2770: 20 66 64 32 20 5b 6f 70 65 6e 20 5b 69 6e 66 6f   fd2 [open [info
2780: 20 73 63 72 69 70 74 5d 5d 0a 20 20 20 20 66 63   script]].    fc
2790: 6f 6e 66 69 67 75 72 65 20 24 66 64 32 20 2d 74  onfigure $fd2 -t
27a0: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72  ranslation binar
27b0: 79 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65  y.    puts -none
27c0: 77 6c 69 6e 65 20 24 66 64 20 5b 72 65 61 64 20  wline $fd [read 
27d0: 24 66 64 32 5d 0a 20 20 20 20 63 6c 6f 73 65 20  $fd2].    close 
27e0: 24 66 64 0a 20 20 20 20 63 6c 6f 73 65 20 24 66  $fd.    close $f
27f0: 64 32 0a 20 20 20 20 73 65 74 20 3a 3a 74 65 78  d2.    set ::tex
2800: 74 20 5b 64 62 20 6f 6e 65 20 7b 73 65 6c 65 63  t [db one {selec
2810: 74 20 74 65 78 74 20 66 72 6f 6d 20 61 75 78 2e  t text from aux.
2820: 66 69 6c 65 73 7d 5d 0a 20 20 20 20 73 74 72 69  files}].    stri
2830: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 78  ng length $::tex
2840: 74 0a 20 20 7d 20 5b 66 69 6c 65 20 73 69 7a 65  t.  } [file size
2850: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0a   [info script]].
2860: 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c    do_test incrbl
2870: 6f 62 2d 35 2e 32 20 7b 0a 20 20 20 20 73 65 74  ob-5.2 {.    set
2880: 20 66 64 32 20 5b 6f 70 65 6e 20 5b 69 6e 66 6f   fd2 [open [info
2890: 20 73 63 72 69 70 74 5d 5d 0a 20 20 20 20 66 63   script]].    fc
28a0: 6f 6e 66 69 67 75 72 65 20 24 66 64 32 20 2d 74  onfigure $fd2 -t
28b0: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72  ranslation binar
28c0: 79 0a 20 20 20 20 73 65 74 20 3a 3a 64 61 74 61  y.    set ::data
28d0: 20 5b 72 65 61 64 20 24 66 64 32 5d 0a 20 20 20   [read $fd2].   
28e0: 20 63 6c 6f 73 65 20 24 66 64 32 0a 20 20 20 20   close $fd2.    
28f0: 73 65 74 20 3a 3a 64 61 74 61 0a 20 20 7d 20 24  set ::data.  } $
2900: 3a 3a 74 65 78 74 0a 7d 0a 0a 23 20 66 72 65 65  ::text.}..# free
2910: 20 6d 65 6d 6f 72 79 0a 75 6e 73 65 74 20 2d 6e   memory.unset -n
2920: 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 64 61 74 61  ocomplain ::data
2930: 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61  .unset -nocompla
2940: 69 6e 20 3a 3a 74 65 78 74 0a 0a 23 2d 2d 2d 2d  in ::text..#----
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 69 6e 63 72 62 6c 6f 62 2d  ----.# incrblob-
29a0: 36 2e 2a 3a 20 0a 23 0a 23 20 20 20 20 20 54 65  6.*: .#.#     Te
29b0: 73 74 20 74 68 61 74 20 6f 70 65 6e 69 6e 67 20  st that opening 
29c0: 61 20 62 6c 6f 62 20 66 6f 72 20 77 72 69 74 65  a blob for write
29d0: 2d 61 63 63 65 73 73 20 69 73 20 69 6d 70 6f 73  -access is impos
29e0: 73 69 62 6c 65 20 69 66 0a 23 20 20 20 20 20 61  sible if.#     a
29f0: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
2a00: 6e 20 68 61 73 20 74 68 65 20 64 61 74 61 62 61  n has the databa
2a10: 73 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  se RESERVED lock
2a20: 2e 0a 23 0a 23 20 20 20 20 20 54 68 65 6e 20 74  ..#.#     Then t
2a30: 65 73 74 20 74 68 61 74 20 62 6c 6f 62 20 77 72  est that blob wr
2a40: 69 74 65 73 20 74 68 61 74 20 74 61 6b 65 20 70  ites that take p
2a50: 6c 61 63 65 20 69 6e 73 69 64 65 20 6f 66 20 61  lace inside of a
2a60: 0a 23 20 20 20 20 20 74 72 61 6e 73 61 63 74 69  .#     transacti
2a70: 6f 6e 20 61 72 65 20 6e 6f 74 20 76 69 73 69 62  on are not visib
2a80: 6c 65 20 74 6f 20 65 78 74 65 72 6e 61 6c 20 63  le to external c
2a90: 6f 6e 6e 65 63 74 69 6f 6e 73 20 75 6e 74 69 6c  onnections until
2aa0: 0a 23 20 20 20 20 20 61 66 74 65 72 20 74 68 65  .#     after the
2ab0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ac0: 63 6f 6d 6d 69 74 65 64 20 61 6e 64 20 74 68 65  commited and the
2ad0: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 20 0a 23   blob channel .#
2ae0: 20 20 20 20 20 63 6c 6f 73 65 64 2e 0a 23 0a 23       closed..#.#
2af0: 20 20 20 20 20 54 68 69 73 20 74 65 73 74 20 64       This test d
2b00: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 77 69 74  oes not work wit
2b10: 68 20 74 68 65 20 22 6d 65 6d 73 75 62 73 79 73  h the "memsubsys
2b20: 31 22 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  1" configuration
2b30: 2e 0a 23 20 20 20 20 20 50 65 72 6d 75 74 61 74  ..#     Permutat
2b40: 69 6f 6e 20 6d 65 6d 73 75 62 73 79 73 31 20 63  ion memsubsys1 c
2b50: 6f 6e 66 69 67 75 72 65 73 20 61 20 76 65 72 79  onfigures a very
2b60: 20 73 6d 61 6c 6c 20 73 74 61 74 69 63 20 61 6c   small static al
2b70: 6c 6f 63 61 74 69 6f 6e 20 0a 23 20 20 20 20 20  location .#     
2b80: 66 6f 72 20 75 73 65 20 61 73 20 70 61 67 65 2d  for use as page-
2b90: 63 61 63 68 65 20 6d 65 6d 6f 72 79 2e 20 54 68  cache memory. Th
2ba0: 69 73 20 63 61 75 73 65 73 20 53 51 4c 69 74 65  is causes SQLite
2bb0: 20 74 6f 20 75 70 67 72 61 64 65 0a 23 20 20 20   to upgrade.#   
2bc0: 20 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76    to an exclusiv
2bd0: 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 72 69 74  e lock when writ
2be0: 69 6e 67 20 65 61 72 6c 69 65 72 20 74 68 61 6e  ing earlier than
2bf0: 20 75 73 75 61 6c 2c 20 77 68 69 63 68 0a 23 20   usual, which.# 
2c00: 20 20 20 20 6d 61 6b 65 73 20 73 6f 6d 65 20 6f      makes some o
2c10: 66 20 74 68 65 73 65 20 74 65 73 74 73 20 66 61  f these tests fa
2c20: 69 6c 2e 0a 23 0a 73 71 6c 69 74 65 33 5f 73 6f  il..#.sqlite3_so
2c30: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 30 0a  ft_heap_limit 0.
2c40: 69 66 20 7b 5b 70 65 72 6d 75 74 61 74 69 6f 6e  if {[permutation
2c50: 5d 20 21 3d 20 22 6d 65 6d 73 75 62 73 79 73 31  ] != "memsubsys1
2c60: 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 69  "} {.  do_test i
2c70: 6e 63 72 62 6c 6f 62 2d 36 2e 31 20 7b 0a 20 20  ncrblob-6.1 {.  
2c80: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
2c90: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
2ca0: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
2cb0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2cc0: 54 4f 20 62 6c 6f 62 73 28 6b 2c 20 76 2c 20 69  TO blobs(k, v, i
2cd0: 29 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 64  ) VALUES('a', 'd
2ce0: 69 66 66 65 72 65 6e 74 27 2c 20 27 63 6f 6e 6e  ifferent', 'conn
2cf0: 65 63 74 69 6f 6e 27 29 3b 0a 20 20 20 20 7d 20  ection');.    } 
2d00: 64 62 32 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  db2.  } {}.  do_
2d10: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e  test incrblob-6.
2d20: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
2d30: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 72  {.      SELECT r
2d40: 6f 77 69 64 20 46 52 4f 4d 20 62 6c 6f 62 73 0a  owid FROM blobs.
2d50: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33      }.  } {1 2 3
2d60: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72  }.  do_test incr
2d70: 62 6c 6f 62 2d 36 2e 33 20 7b 0a 20 20 20 20 73  blob-6.3 {.    s
2d80: 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 0a 20  et rc [catch {. 
2d90: 20 20 20 20 20 64 62 20 69 6e 63 72 62 6c 6f 62       db incrblob
2da0: 20 62 6c 6f 62 73 20 76 20 31 0a 20 20 20 20 7d   blobs v 1.    }
2db0: 20 6d 73 67 5d 0a 20 20 20 20 6c 69 73 74 20 24   msg].    list $
2dc0: 72 63 20 24 6d 73 67 0a 20 20 7d 20 7b 31 20 7b  rc $msg.  } {1 {
2dd0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
2de0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69  ed}}.  do_test i
2df0: 6e 63 72 62 6c 6f 62 2d 36 2e 34 20 7b 0a 20 20  ncrblob-6.4 {.  
2e00: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
2e10: 7b 0a 20 20 20 20 20 20 64 62 20 69 6e 63 72 62  {.      db incrb
2e20: 6c 6f 62 20 62 6c 6f 62 73 20 76 20 33 0a 20 20  lob blobs v 3.  
2e30: 20 20 7d 20 6d 73 67 5d 0a 20 20 20 20 6c 69 73    } msg].    lis
2e40: 74 20 24 72 63 20 24 6d 73 67 0a 20 20 7d 20 7b  t $rc $msg.  } {
2e50: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
2e60: 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
2e70: 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 35 20 7b  t incrblob-6.5 {
2e80: 0a 20 20 20 20 73 65 74 20 3a 3a 62 6c 6f 62 20  .    set ::blob 
2e90: 5b 64 62 20 69 6e 63 72 62 6c 6f 62 20 2d 72 65  [db incrblob -re
2ea0: 61 64 6f 6e 6c 79 20 62 6c 6f 62 73 20 76 20 33  adonly blobs v 3
2eb0: 5d 0a 20 20 20 20 72 65 61 64 20 24 3a 3a 62 6c  ].    read $::bl
2ec0: 6f 62 0a 20 20 7d 20 7b 68 65 6c 6c 6f 7d 0a 20  ob.  } {hello}. 
2ed0: 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f   do_test incrblo
2ee0: 62 2d 36 2e 36 20 7b 0a 20 20 20 20 63 6c 6f 73  b-6.6 {.    clos
2ef0: 65 20 24 3a 3a 62 6c 6f 62 0a 20 20 7d 20 7b 7d  e $::blob.  } {}
2f00: 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e  .  .  do_test in
2f10: 63 72 62 6c 6f 62 2d 36 2e 37 20 7b 0a 20 20 20  crblob-6.7 {.   
2f20: 20 73 65 74 20 3a 3a 62 6c 6f 62 20 5b 64 62 32   set ::blob [db2
2f30: 20 69 6e 63 72 62 6c 6f 62 20 62 6c 6f 62 73 20   incrblob blobs 
2f40: 69 20 34 5d 0a 20 20 20 20 67 65 74 73 20 24 3a  i 4].    gets $:
2f50: 3a 62 6c 6f 62 0a 20 20 7d 20 7b 63 6f 6e 6e 65  :blob.  } {conne
2f60: 63 74 69 6f 6e 7d 0a 20 20 64 6f 5f 74 65 73 74  ction}.  do_test
2f70: 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 38 20 7b 0a   incrblob-6.8 {.
2f80: 20 20 20 20 74 65 6c 6c 20 24 3a 3a 62 6c 6f 62      tell $::blob
2f90: 0a 20 20 7d 20 7b 31 30 7d 0a 20 20 64 6f 5f 74  .  } {10}.  do_t
2fa0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 39  est incrblob-6.9
2fb0: 20 7b 0a 20 20 20 20 73 65 65 6b 20 24 3a 3a 62   {.    seek $::b
2fc0: 6c 6f 62 20 30 0a 20 20 20 20 70 75 74 73 20 2d  lob 0.    puts -
2fd0: 6e 6f 6e 65 77 6c 69 6e 65 20 24 3a 3a 62 6c 6f  nonewline $::blo
2fe0: 62 20 22 69 6e 76 6f 63 61 74 69 6f 6e 22 0a 20  b "invocation". 
2ff0: 20 20 20 66 6c 75 73 68 20 24 3a 3a 62 6c 6f 62     flush $::blob
3000: 0a 20 20 7d 20 7b 7d 0a 20 20 0a 20 20 23 20 41  .  } {}.  .  # A
3010: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6f 6d  t this point com
3020: 6d 69 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6c  mit should be il
3030: 6c 65 67 61 6c 20 28 62 65 63 61 75 73 65 20 0a  legal (because .
3040: 20 20 23 20 74 68 65 72 65 20 69 73 20 61 6e 20    # there is an 
3050: 6f 70 65 6e 20 62 6c 6f 62 20 63 68 61 6e 6e 65  open blob channe
3060: 6c 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  l)..  #.  do_tes
3070: 74 20 69 6e 63 72 62 6c 6f 62 2d 36 2e 31 31 20  t incrblob-6.11 
3080: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
3090: 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20  .      COMMIT;. 
30a0: 20 20 20 7d 20 64 62 32 0a 20 20 7d 20 7b 31 20     } db2.  } {1 
30b0: 7b 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74  {cannot commit t
30c0: 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 53 51 4c  ransaction - SQL
30d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
30e0: 72 6f 67 72 65 73 73 7d 7d 0a 20 20 0a 20 20 64  rogress}}.  .  d
30f0: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
3100: 36 2e 31 32 20 7b 0a 20 20 20 20 65 78 65 63 73  6.12 {.    execs
3110: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3120: 54 20 2a 20 46 52 4f 4d 20 62 6c 6f 62 73 20 57  T * FROM blobs W
3130: 48 45 52 45 20 72 6f 77 69 64 20 3d 20 34 3b 0a  HERE rowid = 4;.
3140: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
3150: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
3160: 36 2e 31 33 20 7b 0a 20 20 20 20 63 6c 6f 73 65  6.13 {.    close
3170: 20 24 3a 3a 62 6c 6f 62 0a 20 20 7d 20 7b 7d 0a   $::blob.  } {}.
3180: 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c    do_test incrbl
3190: 6f 62 2d 36 2e 31 34 20 7b 0a 20 20 20 20 63 61  ob-6.14 {.    ca
31a0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  tchsql {.      C
31b0: 4f 4d 4d 49 54 3b 0a 20 20 20 20 7d 20 64 62 32  OMMIT;.    } db2
31c0: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f  .  } {0 {}}.  do
31d0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 36  _test incrblob-6
31e0: 2e 31 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .15 {.    execsq
31f0: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
3200: 20 2a 20 46 52 4f 4d 20 62 6c 6f 62 73 20 57 48   * FROM blobs WH
3210: 45 52 45 20 72 6f 77 69 64 20 3d 20 34 3b 0a 20  ERE rowid = 4;. 
3220: 20 20 20 7d 0a 20 20 7d 20 7b 61 20 64 69 66 66     }.  } {a diff
3230: 65 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  erent invocation
3240: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 7d 0a  }.  db2 close.}.
3250: 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
3260: 70 5f 6c 69 6d 69 74 20 24 63 6d 64 6c 69 6e 65  p_limit $cmdline
3270: 61 72 67 28 73 6f 66 74 2d 68 65 61 70 2d 6c 69  arg(soft-heap-li
3280: 6d 69 74 29 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  mit)..#---------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
32d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
32e0: 65 73 74 73 20 76 65 72 69 66 79 20 74 68 65 20  ests verify the 
32f0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 74 68 65  behaviour of the
3300: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 49 4f 0a   incremental IO.
3310: 23 20 41 50 49 73 20 69 6e 20 74 68 65 20 66 6f  # APIs in the fo
3320: 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 3a 0a 23  llowing cases:.#
3330: 0a 23 20 20 20 20 20 37 2e 31 20 41 20 72 6f 77  .#     7.1 A row
3340: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 69 6e 67   that containing
3350: 20 61 6e 20 6f 70 65 6e 20 62 6c 6f 62 20 69 73   an open blob is
3360: 20 6d 6f 64 69 66 69 65 64 2e 0a 23 0a 23 20 20   modified..#.#  
3370: 20 20 20 37 2e 32 20 41 20 43 52 45 41 54 45 20     7.2 A CREATE 
3380: 54 41 42 4c 45 20 72 65 71 75 69 72 65 73 20 74  TABLE requires t
3390: 68 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  hat an overflow 
33a0: 70 61 67 65 20 74 68 61 74 20 69 73 20 70 61 72  page that is par
33b0: 74 0a 23 20 20 20 20 20 20 20 20 20 6f 66 20 61  t.#         of a
33c0: 6e 20 6f 70 65 6e 20 62 6c 6f 62 20 69 73 20 6d  n open blob is m
33d0: 6f 76 65 64 2e 0a 23 0a 23 20 20 20 20 20 37 2e  oved..#.#     7.
33e0: 33 20 41 6e 20 49 4e 43 52 45 4d 45 4e 54 41 4c  3 An INCREMENTAL
33f0: 20 56 41 43 55 55 4d 20 6d 6f 76 65 73 20 61 6e   VACUUM moves an
3400: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 74   overflow page t
3410: 68 61 74 20 69 73 20 70 61 72 74 0a 23 20 20 20  hat is part.#   
3420: 20 20 20 20 20 20 6f 66 20 61 6e 20 6f 70 65 6e        of an open
3430: 20 62 6c 6f 62 2e 0a 23 0a 23 20 49 6e 20 74 68   blob..#.# In th
3440: 65 20 66 69 72 73 74 20 63 61 73 65 20 61 62 6f  e first case abo
3450: 76 65 2c 20 63 6f 72 72 65 63 74 20 62 65 68 61  ve, correct beha
3460: 76 69 6f 75 72 20 69 73 20 66 6f 72 20 61 6c 6c  viour is for all
3470: 20 73 75 62 73 65 71 75 65 6e 74 0a 23 20 72 65   subsequent.# re
3480: 61 64 2f 77 72 69 74 65 20 6f 70 65 72 61 74 69  ad/write operati
3490: 6f 6e 73 20 6f 6e 20 74 68 65 20 62 6c 6f 62 2d  ons on the blob-
34a0: 68 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  handle to return
34b0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 23   SQLITE_ABORT..#
34c0: 20 4d 6f 72 65 20 61 63 63 75 72 61 74 65 6c 79   More accurately
34d0: 2c 20 62 6c 6f 62 2d 68 61 6e 64 6c 65 73 20 61  , blob-handles a
34e0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  re invalidated w
34f0: 68 65 6e 65 76 65 72 20 74 68 65 20 74 61 62 6c  henever the tabl
3500: 65 0a 23 20 74 68 65 79 20 62 65 6c 6f 6e 67 20  e.# they belong 
3510: 74 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  to is written to
3520: 2e 0a 23 0a 23 20 54 68 65 20 73 65 63 6f 6e 64  ..#.# The second
3530: 20 74 77 6f 20 63 61 73 65 73 20 68 61 76 65 20   two cases have 
3540: 6e 6f 20 65 78 74 65 72 6e 61 6c 20 65 66 66 65  no external effe
3550: 63 74 2e 20 54 68 65 79 20 61 72 65 20 74 65 73  ct. They are tes
3560: 74 69 6e 67 0a 23 20 74 68 61 74 20 74 68 65 20  ting.# that the 
3570: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6f  internal cache o
3580: 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  f overflow page 
3590: 6e 75 6d 62 65 72 73 20 69 73 20 63 6f 72 72 65  numbers is corre
35a0: 63 74 6c 79 0a 23 20 69 6e 76 61 6c 69 64 61 74  ctly.# invalidat
35b0: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e  ed..#.do_test in
35c0: 63 72 62 6c 6f 62 2d 37 2e 31 2e 30 20 7b 0a 20  crblob-7.1.0 {. 
35d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
35e0: 45 47 49 4e 3b 0a 20 20 20 20 44 52 4f 50 20 54  EGIN;.    DROP T
35f0: 41 42 4c 45 20 62 6c 6f 62 73 3b 0a 20 20 20 20  ABLE blobs;.    
3600: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 20  CREATE TABLE t1 
3610: 28 61 2c 20 62 2c 20 63 2c 20 64 20 42 4c 4f 42  (a, b, c, d BLOB
3620: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3630: 54 4f 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64  TO t1(a, b, c, d
3640: 29 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  ) VALUES(1, 2, 3
3650: 2c 20 34 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  , 4);.    COMMIT
3660: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65  ;.  }.} {}..fore
3670: 61 63 68 20 7b 74 6e 20 61 72 67 7d 20 7b 31 20  ach {tn arg} {1 
3680: 22 22 20 32 20 2d 72 65 61 64 6f 6e 6c 79 7d 20  "" 2 -readonly} 
3690: 7b 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  {..  execsql {. 
36a0: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
36b0: 20 64 20 3d 20 7a 65 72 6f 62 6c 6f 62 28 31 30   d = zeroblob(10
36c0: 30 30 30 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f  000);.  }..  do_
36d0: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e  test incrblob-7.
36e0: 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 65  1.$tn.1 {.    se
36f0: 74 20 3a 3a 62 20 5b 65 76 61 6c 20 64 62 20 69  t ::b [eval db i
3700: 6e 63 72 62 6c 6f 62 20 24 61 72 67 20 74 31 20  ncrblob $arg t1 
3710: 64 20 31 5d 0a 20 20 20 20 62 69 6e 61 72 79 20  d 1].    binary 
3720: 73 63 61 6e 20 5b 73 71 6c 69 74 65 33 5f 62 6c  scan [sqlite3_bl
3730: 6f 62 5f 72 65 61 64 20 24 3a 3a 62 20 35 30 30  ob_read $::b 500
3740: 30 20 35 5d 20 63 2a 20 63 0a 20 20 20 20 73 65  0 5] c* c.    se
3750: 74 20 63 0a 20 20 7d 20 7b 30 20 30 20 30 20 30  t c.  } {0 0 0 0
3760: 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e   0}.  do_test in
3770: 63 72 62 6c 6f 62 2d 37 2e 31 2e 24 74 6e 2e 32  crblob-7.1.$tn.2
3780: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3790: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
37a0: 20 53 45 54 20 64 20 3d 20 31 35 3b 0a 20 20 20   SET d = 15;.   
37b0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
37c0: 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 31  est incrblob-7.1
37d0: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 73 65 74  .$tn.3 {.    set
37e0: 20 72 63 20 5b 63 61 74 63 68 20 7b 20 73 71 6c   rc [catch { sql
37f0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24  ite3_blob_read $
3800: 3a 3a 62 20 35 30 30 30 20 35 20 7d 20 6d 73 67  ::b 5000 5 } msg
3810: 5d 0a 20 20 20 20 6c 69 73 74 20 24 72 63 20 24  ].    list $rc $
3820: 6d 73 67 0a 20 20 7d 20 7b 31 20 53 51 4c 49 54  msg.  } {1 SQLIT
3830: 45 5f 41 42 4f 52 54 7d 0a 20 20 64 6f 5f 74 65  E_ABORT}.  do_te
3840: 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 31 2e  st incrblob-7.1.
3850: 24 74 6e 2e 34 20 7b 0a 20 20 20 20 65 78 65 63  $tn.4 {.    exec
3860: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
3870: 43 54 20 64 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT d FROM t1;.  
3880: 20 20 7d 0a 20 20 7d 20 7b 31 35 7d 0a 20 20 64    }.  } {15}.  d
3890: 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d  o_test incrblob-
38a0: 37 2e 31 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  7.1.$tn.5 {.    
38b0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20  set rc [catch { 
38c0: 63 6c 6f 73 65 20 24 3a 3a 62 20 7d 20 6d 73 67  close $::b } msg
38d0: 5d 0a 20 20 20 20 6c 69 73 74 20 24 72 63 20 24  ].    list $rc $
38e0: 6d 73 67 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20  msg.  } {0 {}}. 
38f0: 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f   do_test incrblo
3900: 62 2d 37 2e 31 2e 24 74 6e 2e 36 20 7b 0a 20 20  b-7.1.$tn.6 {.  
3910: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3920: 20 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d 20    SELECT d FROM 
3930: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  t1;.    }.  } {1
3940: 35 7d 0a 0a 7d 0a 0a 73 65 74 20 66 64 20 5b 6f  5}..}..set fd [o
3950: 70 65 6e 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  pen [info script
3960: 5d 5d 0a 66 63 6f 6e 66 69 67 75 72 65 20 24 66  ]].fconfigure $f
3970: 64 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62  d -translation b
3980: 69 6e 61 72 79 0a 73 65 74 20 3a 3a 64 61 74 61  inary.set ::data
3990: 20 5b 72 65 61 64 20 24 66 64 20 31 34 30 30 30   [read $fd 14000
39a0: 5d 0a 63 6c 6f 73 65 20 24 66 64 0a 0a 64 62 20  ].close $fd..db 
39b0: 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74  close.forcedelet
39c0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
39d0: 62 2d 6a 6f 75 72 6e 61 6c 0a 73 71 6c 69 74 65  b-journal.sqlite
39e0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 64 6f  3 db test.db..do
39f0: 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37  _test incrblob-7
3a00: 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .2.1 {.  execsql
3a10: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
3a20: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 22 69 6e 63  to_vacuum = "inc
3a30: 72 65 6d 65 6e 74 61 6c 22 3b 0a 20 20 20 20 43  remental";.    C
3a40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
3a50: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
3a60: 20 4b 45 59 2c 20 62 29 3b 20 20 20 20 20 20 20   KEY, b);       
3a70: 20 2d 2d 20 72 6f 6f 74 40 70 61 67 65 33 0a 20   -- root@page3. 
3a80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3a90: 31 20 56 41 4c 55 45 53 28 31 32 33 2c 20 24 3a  1 VALUES(123, $:
3aa0: 3a 64 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 65  :data);.  }.  se
3ab0: 74 20 3a 3a 62 20 5b 64 62 20 69 6e 63 72 62 6c  t ::b [db incrbl
3ac0: 6f 62 20 2d 72 65 61 64 6f 6e 6c 79 20 74 31 20  ob -readonly t1 
3ad0: 62 20 31 32 33 5d 0a 20 20 66 63 6f 6e 66 69 67  b 123].  fconfig
3ae0: 75 72 65 20 24 3a 3a 62 20 2d 74 72 61 6e 73 6c  ure $::b -transl
3af0: 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 72  ation binary.  r
3b00: 65 61 64 20 24 3a 3a 62 0a 7d 20 24 3a 3a 64 61  ead $::b.} $::da
3b10: 74 61 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62  ta.do_test incrb
3b20: 6c 6f 62 2d 37 2e 32 2e 32 20 7b 0a 20 20 65 78  lob-7.2.2 {.  ex
3b30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
3b40: 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e  TE TABLE t2(a IN
3b50: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
3b60: 59 2c 20 62 29 3b 20 20 20 20 20 20 20 20 2d 2d  Y, b);        --
3b70: 20 72 6f 6f 74 40 70 61 67 65 34 0a 20 20 7d 0a   root@page4.  }.
3b80: 20 20 73 65 65 6b 20 24 3a 3a 62 20 30 0a 20 20    seek $::b 0.  
3b90: 72 65 61 64 20 24 3a 3a 62 0a 7d 20 24 3a 3a 64  read $::b.} $::d
3ba0: 61 74 61 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  ata.do_test incr
3bb0: 62 6c 6f 62 2d 37 2e 32 2e 33 20 7b 0a 20 20 63  blob-7.2.3 {.  c
3bc0: 6c 6f 73 65 20 24 3a 3a 62 0a 20 20 65 78 65 63  lose $::b.  exec
3bd0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3be0: 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
3bf0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
3c00: 7d 0a 7d 20 7b 33 20 34 7d 0a 0a 73 65 74 20 3a  }.} {3 4}..set :
3c10: 3a 6f 74 68 65 72 64 61 74 61 20 22 5b 73 74 72  :otherdata "[str
3c20: 69 6e 67 20 72 61 6e 67 65 20 24 3a 3a 64 61 74  ing range $::dat
3c30: 61 20 30 20 31 30 30 30 5d 5b 73 74 72 69 6e 67  a 0 1000][string
3c40: 20 72 61 6e 67 65 20 24 3a 3a 64 61 74 61 20 31   range $::data 1
3c50: 30 30 31 20 65 6e 64 5d 22 0a 64 6f 5f 74 65 73  001 end]".do_tes
3c60: 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 33 2e 31  t incrblob-7.3.1
3c70: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3c80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3c90: 32 20 56 41 4c 55 45 53 28 34 35 36 2c 20 24 3a  2 VALUES(456, $:
3ca0: 3a 6f 74 68 65 72 64 61 74 61 29 3b 0a 20 20 7d  :otherdata);.  }
3cb0: 0a 20 20 73 65 74 20 3a 3a 62 20 5b 64 62 20 69  .  set ::b [db i
3cc0: 6e 63 72 62 6c 6f 62 20 2d 72 65 61 64 6f 6e 6c  ncrblob -readonl
3cd0: 79 20 74 32 20 62 20 34 35 36 5d 0a 20 20 66 63  y t2 b 456].  fc
3ce0: 6f 6e 66 69 67 75 72 65 20 24 3a 3a 62 20 2d 74  onfigure $::b -t
3cf0: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72  ranslation binar
3d00: 79 0a 20 20 72 65 61 64 20 24 3a 3a 62 0a 7d 20  y.  read $::b.} 
3d10: 24 3a 3a 6f 74 68 65 72 64 61 74 61 0a 64 6f 5f  $::otherdata.do_
3d20: 74 65 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e  test incrblob-7.
3d30: 33 2e 32 20 7b 0a 20 20 65 78 70 72 20 5b 66 69  3.2 {.  expr [fi
3d40: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
3d50: 2f 31 30 32 34 0a 7d 20 33 30 0a 64 6f 5f 74 65  /1024.} 30.do_te
3d60: 73 74 20 69 6e 63 72 62 6c 6f 62 2d 37 2e 33 2e  st incrblob-7.3.
3d70: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
3d80: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
3d90: 74 31 20 57 48 45 52 45 20 61 20 3d 20 31 32 33  t1 WHERE a = 123
3da0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 49 4e 43  ;.    PRAGMA INC
3db0: 52 45 4d 45 4e 54 41 4c 5f 56 41 43 55 55 4d 28  REMENTAL_VACUUM(
3dc0: 30 29 3b 0a 20 20 7d 0a 20 20 73 65 65 6b 20 24  0);.  }.  seek $
3dd0: 3a 3a 62 20 30 0a 20 20 72 65 61 64 20 24 3a 3a  ::b 0.  read $::
3de0: 62 0a 7d 20 24 3a 3a 6f 74 68 65 72 64 61 74 61  b.} $::otherdata
3df0: 0a 0a 23 20 41 74 74 65 6d 70 74 20 74 6f 20 77  ..# Attempt to w
3e00: 72 69 74 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  rite on a read-o
3e10: 6e 6c 79 20 62 6c 6f 62 2e 20 20 4d 61 6b 65 20  nly blob.  Make 
3e20: 73 75 72 65 20 74 68 65 20 65 72 72 6f 72 20 63  sure the error c
3e30: 6f 64 65 0a 23 20 67 65 74 73 20 73 65 74 2e 20  ode.# gets set. 
3e40: 20 54 69 63 6b 65 74 20 23 32 34 36 34 2e 0a 23   Ticket #2464..#
3e50: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
3e60: 62 2d 37 2e 34 20 7b 0a 20 20 73 65 74 20 72 63  b-7.4 {.  set rc
3e70: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
3e80: 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24 3a 3a 62  _blob_write $::b
3e90: 20 31 30 20 48 45 4c 4c 4f 7d 20 6d 73 67 5d 0a   10 HELLO} msg].
3ea0: 20 20 6c 61 70 70 65 6e 64 20 72 63 20 24 6d 73    lappend rc $ms
3eb0: 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 52 45  g.} {1 SQLITE_RE
3ec0: 41 44 4f 4e 4c 59 7d 0a 64 6f 5f 74 65 73 74 20  ADONLY}.do_test 
3ed0: 69 6e 63 72 62 6c 6f 62 2d 37 2e 35 20 7b 0a 20  incrblob-7.5 {. 
3ee0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
3ef0: 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 52 45   db.} {SQLITE_RE
3f00: 41 44 4f 4e 4c 59 7d 0a 64 6f 5f 74 65 73 74 20  ADONLY}.do_test 
3f10: 69 6e 63 72 62 6c 6f 62 2d 37 2e 36 20 7b 0a 20  incrblob-7.6 {. 
3f20: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20   sqlite3_errmsg 
3f30: 64 62 0a 7d 20 7b 61 74 74 65 6d 70 74 20 74 6f  db.} {attempt to
3f40: 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c   write a readonl
3f50: 79 20 64 61 74 61 62 61 73 65 7d 0a 0a 23 20 54  y database}..# T
3f60: 65 73 74 20 74 68 61 74 20 69 66 20 65 69 74 68  est that if eith
3f70: 65 72 20 74 68 65 20 22 6f 66 66 73 65 74 22 20  er the "offset" 
3f80: 6f 72 20 22 61 6d 6f 75 6e 74 22 20 61 72 67 75  or "amount" argu
3f90: 6d 65 6e 74 73 20 74 6f 0a 23 20 73 71 6c 69 74  ments to.# sqlit
3fa0: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 20  e3_blob_write() 
3fb0: 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  are less than ze
3fc0: 72 6f 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ro, SQLITE_ERROR
3fd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 23 20   is returned..# 
3fe0: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 62 6c 6f  .do_test incrblo
3ff0: 62 2d 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  b-8.1 {.  execsq
4000: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
4010: 74 31 20 56 41 4c 55 45 53 28 33 31 34 31 35 39  t1 VALUES(314159
4020: 2c 20 27 73 71 6c 69 74 65 27 29 20 7d 0a 20 20  , 'sqlite') }.  
4030: 73 65 74 20 3a 3a 62 20 5b 64 62 20 69 6e 63 72  set ::b [db incr
4040: 62 6c 6f 62 20 74 31 20 62 20 33 31 34 31 35 39  blob t1 b 314159
4050: 5d 0a 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24  ].  fconfigure $
4060: 3a 3a 62 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  ::b -translation
4070: 20 62 69 6e 61 72 79 0a 20 20 73 65 74 20 72 63   binary.  set rc
4080: 20 5b 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33   [catch {sqlite3
4090: 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24 3a 3a 62  _blob_write $::b
40a0: 20 31 30 20 48 45 4c 4c 4f 20 2d 31 7d 20 6d 73   10 HELLO -1} ms
40b0: 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20 72 63 20  g].  lappend rc 
40c0: 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45  $msg.} {1 SQLITE
40d0: 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20  _ERROR}.do_test 
40e0: 69 6e 63 72 62 6c 6f 62 2d 38 2e 32 20 7b 0a 20  incrblob-8.2 {. 
40f0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
4100: 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52   db.} {SQLITE_ER
4110: 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63  ROR}.do_test inc
4120: 72 62 6c 6f 62 2d 38 2e 33 20 7b 0a 20 20 73 65  rblob-8.3 {.  se
4130: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73 71 6c  t rc [catch {sql
4140: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20  ite3_blob_write 
4150: 24 3a 3a 62 20 2d 31 20 48 45 4c 4c 4f 20 35 7d  $::b -1 HELLO 5}
4160: 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65 6e 64 20   msg].  lappend 
4170: 72 63 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c  rc $msg.} {1 SQL
4180: 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65  ITE_ERROR}.do_te
4190: 73 74 20 69 6e 63 72 62 6c 6f 62 2d 38 2e 34 20  st incrblob-8.4 
41a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 63  {.  sqlite3_errc
41b0: 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45  ode db.} {SQLITE
41c0: 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20  _ERROR}.do_test 
41d0: 69 6e 63 72 62 6c 6f 62 2d 38 2e 35 20 7b 0a 20  incrblob-8.5 {. 
41e0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
41f0: 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   b FROM t1 WHERE
4200: 20 61 20 3d 20 33 31 34 31 35 39 7d 0a 7d 20 7b   a = 314159}.} {
4210: 73 71 6c 69 74 65 7d 0a 64 6f 5f 74 65 73 74 20  sqlite}.do_test 
4220: 69 6e 63 72 62 6c 6f 62 2d 38 2e 36 20 7b 0a 20  incrblob-8.6 {. 
4230: 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b   set rc [catch {
4240: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
4250: 74 65 20 24 3a 3a 62 20 30 20 65 74 69 6c 71 73  te $::b 0 etilqs
4260: 20 36 7d 20 6d 73 67 5d 0a 20 20 6c 61 70 70 65   6} msg].  lappe
4270: 6e 64 20 72 63 20 24 6d 73 67 0a 7d 20 7b 30 20  nd rc $msg.} {0 
4280: 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  {}}.do_test incr
4290: 62 6c 6f 62 2d 38 2e 37 20 7b 0a 20 20 65 78 65  blob-8.7 {.  exe
42a0: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 62 20 46  csql {SELECT b F
42b0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
42c0: 20 33 31 34 31 35 39 7d 0a 7d 20 7b 65 74 69 6c   314159}.} {etil
42d0: 71 73 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  qs}..# The follo
42e0: 77 69 6e 67 20 74 65 73 74 20 63 61 73 65 20 65  wing test case e
42f0: 78 70 6f 73 65 73 20 61 6e 20 69 6e 73 74 61 6e  xposes an instan
4300: 63 65 20 69 6e 20 74 68 65 20 62 6c 6f 62 20 63  ce in the blob c
4310: 6f 64 65 20 77 68 65 72 65 0a 23 20 61 6e 20 65  ode where.# an e
4320: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 61 73  rror message was
4330: 20 73 65 74 20 75 73 69 6e 67 20 61 20 63 61 6c   set using a cal
4340: 6c 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  l similar to sql
4350: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 45 72  ite3_mprintf(zEr
4360: 72 29 2c 0a 23 20 77 68 65 72 65 20 7a 45 72 72  r),.# where zErr
4370: 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
4380: 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20 69 73   string. This is
4390: 20 6e 6f 20 67 6f 6f 64 20 69 66 20 74 68 65 20   no good if the 
43a0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 0a  string contains.
43b0: 23 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  # characters tha
43c0: 74 20 63 61 6e 20 62 65 20 6d 69 73 74 61 6b 65  t can be mistake
43d0: 6e 20 66 6f 72 20 70 72 69 6e 74 66 28 29 20 66  n for printf() f
43e0: 6f 72 6d 61 74 74 69 6e 67 20 64 69 72 65 63 74  ormatting direct
43f0: 69 76 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ives..#.do_test 
4400: 69 6e 63 72 62 6c 6f 62 2d 39 2e 31 20 7b 0a 20  incrblob-9.1 {. 
4410: 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 64   list [catch { d
4420: 62 20 69 6e 63 72 62 6c 6f 62 20 74 31 20 22 41  b incrblob t1 "A
4430: 20 74 72 69 63 6b 79 20 63 6f 6c 75 6d 6e 20 6e   tricky column n
4440: 61 6d 65 20 25 73 25 73 22 20 31 20 7d 20 6d 73  ame %s%s" 1 } ms
4450: 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 6e 6f  g] $msg.} {1 {no
4460: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 41   such column: "A
4470: 20 74 72 69 63 6b 79 20 63 6f 6c 75 6d 6e 20 6e   tricky column n
4480: 61 6d 65 20 25 73 25 73 22 7d 7d 0a 0a 0a 66 69  ame %s%s"}}...fi
4490: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.