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

Artifact 234f960d90235a9b51ec3ca1e062e8541dd558d8:


0000: 23 20 32 30 31 34 20 4f 63 74 6f 62 65 72 20 33  # 2014 October 3
0010: 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  0.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74  *******.#..set t
0170: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0180: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0190: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01a0: 74 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73 74  ter.tcl.set test
01b0: 70 72 65 66 69 78 20 65 5f 62 6c 6f 62 6f 70 65  prefix e_blobope
01c0: 6e 0a 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  n..forcedelete t
01d0: 65 73 74 2e 64 62 32 0a 0a 64 6f 5f 65 78 65 63  est.db2..do_exec
01e0: 73 71 6c 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20  sql_test 1.0 {. 
01f0: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
0200: 32 27 20 41 53 20 61 75 78 3b 0a 0a 20 20 43 52  2' AS aux;..  CR
0210: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
0220: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
0230: 4d 41 52 59 20 4b 45 59 2c 20 62 20 54 45 58 54  MARY KEY, b TEXT
0240: 2c 20 63 20 42 4c 4f 42 29 3b 0a 20 20 43 52 45  , c BLOB);.  CRE
0250: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74  ATE TEMP TABLE t
0260: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
0270: 41 52 59 20 4b 45 59 2c 20 62 20 54 45 58 54 2c  ARY KEY, b TEXT,
0280: 20 63 20 42 4c 4f 42 29 3b 0a 20 20 43 52 45 41   c BLOB);.  CREA
0290: 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74 31 28  TE TABLE aux.t1(
02a0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
02b0: 59 20 4b 45 59 2c 20 62 20 54 45 58 54 2c 20 63  Y KEY, b TEXT, c
02c0: 20 42 4c 4f 42 29 3b 0a 0a 20 20 43 52 45 41 54   BLOB);..  CREAT
02d0: 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 78 31 28  E TABLE main.x1(
02e0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
02f0: 59 20 4b 45 59 2c 20 62 20 54 45 58 54 2c 20 63  Y KEY, b TEXT, c
0300: 20 42 4c 4f 42 29 3b 0a 20 20 43 52 45 41 54 45   BLOB);.  CREATE
0310: 20 54 45 4d 50 20 54 41 42 4c 45 20 78 32 28 61   TEMP TABLE x2(a
0320: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0330: 20 4b 45 59 2c 20 62 20 54 45 58 54 2c 20 63 20   KEY, b TEXT, c 
0340: 42 4c 4f 42 29 3b 0a 20 20 43 52 45 41 54 45 20  BLOB);.  CREATE 
0350: 54 41 42 4c 45 20 61 75 78 2e 78 33 28 61 20 49  TABLE aux.x3(a I
0360: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0370: 45 59 2c 20 62 20 54 45 58 54 2c 20 63 20 42 4c  EY, b TEXT, c BL
0380: 4f 42 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49  OB);..  INSERT I
0390: 4e 54 4f 20 6d 61 69 6e 2e 74 31 20 56 41 4c 55  NTO main.t1 VALU
03a0: 45 53 28 31 2c 20 27 6d 61 69 6e 20 6f 6e 65 27  ES(1, 'main one'
03b0: 2c 20 58 27 30 31 30 31 27 29 3b 0a 20 20 49 4e  , X'0101');.  IN
03c0: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74  SERT INTO main.t
03d0: 31 20 56 41 4c 55 45 53 28 32 2c 20 27 6d 61 69  1 VALUES(2, 'mai
03e0: 6e 20 74 77 6f 27 2c 20 58 27 30 31 30 32 27 29  n two', X'0102')
03f0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0400: 6d 61 69 6e 2e 74 31 20 56 41 4c 55 45 53 28 33  main.t1 VALUES(3
0410: 2c 20 27 6d 61 69 6e 20 74 68 72 65 65 27 2c 20  , 'main three', 
0420: 58 27 30 31 30 33 27 29 3b 0a 20 20 49 4e 53 45  X'0103');.  INSE
0430: 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 31 20  RT INTO main.t1 
0440: 56 41 4c 55 45 53 28 34 2c 20 27 6d 61 69 6e 20  VALUES(4, 'main 
0450: 66 6f 75 72 27 2c 20 58 27 30 31 30 34 27 29 3b  four', X'0104');
0460: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d  .  INSERT INTO m
0470: 61 69 6e 2e 74 31 20 56 41 4c 55 45 53 28 35 2c  ain.t1 VALUES(5,
0480: 20 27 6d 61 69 6e 20 66 69 76 65 27 2c 20 58 27   'main five', X'
0490: 30 31 30 35 27 29 3b 0a 0a 20 20 49 4e 53 45 52  0105');..  INSER
04a0: 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 78 31 20 56  T INTO main.x1 V
04b0: 41 4c 55 45 53 28 31 2c 20 27 78 20 6d 61 69 6e  ALUES(1, 'x main
04c0: 20 6f 6e 65 27 2c 20 58 27 30 30 30 31 30 31 27   one', X'000101'
04d0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
04e0: 20 6d 61 69 6e 2e 78 31 20 56 41 4c 55 45 53 28   main.x1 VALUES(
04f0: 32 2c 20 27 78 20 6d 61 69 6e 20 74 77 6f 27 2c  2, 'x main two',
0500: 20 58 27 30 30 30 31 30 32 27 29 3b 0a 20 20 49   X'000102');.  I
0510: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e  NSERT INTO main.
0520: 78 31 20 56 41 4c 55 45 53 28 33 2c 20 27 78 20  x1 VALUES(3, 'x 
0530: 6d 61 69 6e 20 74 68 72 65 65 27 2c 20 58 27 30  main three', X'0
0540: 30 30 31 30 33 27 29 3b 0a 20 20 49 4e 53 45 52  00103');.  INSER
0550: 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 78 31 20 56  T INTO main.x1 V
0560: 41 4c 55 45 53 28 34 2c 20 27 78 20 6d 61 69 6e  ALUES(4, 'x main
0570: 20 66 6f 75 72 27 2c 20 58 27 30 30 30 31 30 34   four', X'000104
0580: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
0590: 4f 20 6d 61 69 6e 2e 78 31 20 56 41 4c 55 45 53  O main.x1 VALUES
05a0: 28 35 2c 20 27 78 20 6d 61 69 6e 20 66 69 76 65  (5, 'x main five
05b0: 27 2c 20 58 27 30 30 30 31 30 35 27 29 3b 0a 0a  ', X'000105');..
05c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65    INSERT INTO te
05d0: 6d 70 2e 74 31 20 56 41 4c 55 45 53 28 31 2c 20  mp.t1 VALUES(1, 
05e0: 27 74 65 6d 70 20 6f 6e 65 27 2c 20 58 27 30 32  'temp one', X'02
05f0: 30 31 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  01');.  INSERT I
0600: 4e 54 4f 20 74 65 6d 70 2e 74 31 20 56 41 4c 55  NTO temp.t1 VALU
0610: 45 53 28 32 2c 20 27 74 65 6d 70 20 74 77 6f 27  ES(2, 'temp two'
0620: 2c 20 58 27 30 32 30 32 27 29 3b 0a 20 20 49 4e  , X'0202');.  IN
0630: 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74  SERT INTO temp.t
0640: 31 20 56 41 4c 55 45 53 28 33 2c 20 27 74 65 6d  1 VALUES(3, 'tem
0650: 70 20 74 68 72 65 65 27 2c 20 58 27 30 32 30 33  p three', X'0203
0660: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
0670: 4f 20 74 65 6d 70 2e 74 31 20 56 41 4c 55 45 53  O temp.t1 VALUES
0680: 28 34 2c 20 27 74 65 6d 70 20 66 6f 75 72 27 2c  (4, 'temp four',
0690: 20 58 27 30 32 30 34 27 29 3b 0a 20 20 49 4e 53   X'0204');.  INS
06a0: 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74 31  ERT INTO temp.t1
06b0: 20 56 41 4c 55 45 53 28 35 2c 20 27 74 65 6d 70   VALUES(5, 'temp
06c0: 20 66 69 76 65 27 2c 20 58 27 30 32 30 35 27 29   five', X'0205')
06d0: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
06e0: 20 74 65 6d 70 2e 78 32 20 56 41 4c 55 45 53 28   temp.x2 VALUES(
06f0: 31 2c 20 27 78 20 74 65 6d 70 20 6f 6e 65 27 2c  1, 'x temp one',
0700: 20 58 27 30 30 30 32 30 31 27 29 3b 0a 20 20 49   X'000201');.  I
0710: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e  NSERT INTO temp.
0720: 78 32 20 56 41 4c 55 45 53 28 32 2c 20 27 78 20  x2 VALUES(2, 'x 
0730: 74 65 6d 70 20 74 77 6f 27 2c 20 58 27 30 30 30  temp two', X'000
0740: 32 30 32 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  202');.  INSERT 
0750: 49 4e 54 4f 20 74 65 6d 70 2e 78 32 20 56 41 4c  INTO temp.x2 VAL
0760: 55 45 53 28 33 2c 20 27 78 20 74 65 6d 70 20 74  UES(3, 'x temp t
0770: 68 72 65 65 27 2c 20 58 27 30 30 30 32 30 33 27  hree', X'000203'
0780: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0790: 20 74 65 6d 70 2e 78 32 20 56 41 4c 55 45 53 28   temp.x2 VALUES(
07a0: 34 2c 20 27 78 20 74 65 6d 70 20 66 6f 75 72 27  4, 'x temp four'
07b0: 2c 20 58 27 30 30 30 32 30 34 27 29 3b 0a 20 20  , X'000204');.  
07c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70  INSERT INTO temp
07d0: 2e 78 32 20 56 41 4c 55 45 53 28 35 2c 20 27 78  .x2 VALUES(5, 'x
07e0: 20 74 65 6d 70 20 66 69 76 65 27 2c 20 58 27 30   temp five', X'0
07f0: 30 30 32 30 35 27 29 3b 0a 0a 20 20 49 4e 53 45  00205');..  INSE
0800: 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 31 20 56  RT INTO aux.t1 V
0810: 41 4c 55 45 53 28 31 2c 20 27 61 75 78 20 6f 6e  ALUES(1, 'aux on
0820: 65 27 2c 20 58 27 30 33 30 31 27 29 3b 0a 20 20  e', X'0301');.  
0830: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e  INSERT INTO aux.
0840: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 61 75  t1 VALUES(2, 'au
0850: 78 20 74 77 6f 27 2c 20 58 27 30 33 30 32 27 29  x two', X'0302')
0860: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0870: 61 75 78 2e 74 31 20 56 41 4c 55 45 53 28 33 2c  aux.t1 VALUES(3,
0880: 20 27 61 75 78 20 74 68 72 65 65 27 2c 20 58 27   'aux three', X'
0890: 30 33 30 33 27 29 3b 0a 20 20 49 4e 53 45 52 54  0303');.  INSERT
08a0: 20 49 4e 54 4f 20 61 75 78 2e 74 31 20 56 41 4c   INTO aux.t1 VAL
08b0: 55 45 53 28 34 2c 20 27 61 75 78 20 66 6f 75 72  UES(4, 'aux four
08c0: 27 2c 20 58 27 30 33 30 34 27 29 3b 0a 20 20 49  ', X'0304');.  I
08d0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74  NSERT INTO aux.t
08e0: 31 20 56 41 4c 55 45 53 28 35 2c 20 27 61 75 78  1 VALUES(5, 'aux
08f0: 20 66 69 76 65 27 2c 20 58 27 30 33 30 35 27 29   five', X'0305')
0900: 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ;..  INSERT INTO
0910: 20 61 75 78 2e 78 33 20 56 41 4c 55 45 53 28 31   aux.x3 VALUES(1
0920: 2c 20 27 78 20 61 75 78 20 6f 6e 65 27 2c 20 58  , 'x aux one', X
0930: 27 30 30 30 33 30 31 27 29 3b 0a 20 20 49 4e 53  '000301');.  INS
0940: 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 78 33 20  ERT INTO aux.x3 
0950: 56 41 4c 55 45 53 28 32 2c 20 27 78 20 61 75 78  VALUES(2, 'x aux
0960: 20 74 77 6f 27 2c 20 58 27 30 30 30 33 30 32 27   two', X'000302'
0970: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0980: 20 61 75 78 2e 78 33 20 56 41 4c 55 45 53 28 33   aux.x3 VALUES(3
0990: 2c 20 27 78 20 61 75 78 20 74 68 72 65 65 27 2c  , 'x aux three',
09a0: 20 58 27 30 30 30 33 30 33 27 29 3b 0a 20 20 49   X'000303');.  I
09b0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 78  NSERT INTO aux.x
09c0: 33 20 56 41 4c 55 45 53 28 34 2c 20 27 78 20 61  3 VALUES(4, 'x a
09d0: 75 78 20 66 6f 75 72 27 2c 20 58 27 30 30 30 33  ux four', X'0003
09e0: 30 34 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  04');.  INSERT I
09f0: 4e 54 4f 20 61 75 78 2e 78 33 20 56 41 4c 55 45  NTO aux.x3 VALUE
0a00: 53 28 35 2c 20 27 78 20 61 75 78 20 66 69 76 65  S(5, 'x aux five
0a10: 27 2c 20 58 27 30 30 30 33 30 35 27 29 3b 0a 7d  ', X'000305');.}
0a20: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
0a70: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
0a80: 36 33 39 2d 35 35 39 33 38 20 54 68 69 73 20 69  639-55938 This i
0a90: 6e 74 65 72 66 61 63 65 73 20 6f 70 65 6e 73 20  nterfaces opens 
0aa0: 61 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  a handle to the 
0ab0: 42 4c 4f 42 0a 23 20 6c 6f 63 61 74 65 64 20 69  BLOB.# located i
0ac0: 6e 20 72 6f 77 20 69 52 6f 77 2c 20 63 6f 6c 75  n row iRow, colu
0ad0: 6d 6e 20 7a 43 6f 6c 75 6d 6e 2c 20 74 61 62 6c  mn zColumn, tabl
0ae0: 65 20 7a 54 61 62 6c 65 20 69 6e 20 64 61 74 61  e zTable in data
0af0: 62 61 73 65 20 7a 44 62 3b 20 69 6e 0a 23 20 6f  base zDb; in.# o
0b00: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
0b10: 73 61 6d 65 20 42 4c 4f 42 20 74 68 61 74 20 77  same BLOB that w
0b20: 6f 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64  ould be selected
0b30: 20 62 79 3a 20 53 45 4c 45 43 54 20 7a 43 6f 6c   by: SELECT zCol
0b40: 75 6d 6e 0a 23 20 46 52 4f 4d 20 7a 44 62 2e 7a  umn.# FROM zDb.z
0b50: 54 61 62 6c 65 20 57 48 45 52 45 20 72 6f 77 69  Table WHERE rowi
0b60: 64 20 3d 20 69 52 6f 77 3b 0a 23 0a 70 72 6f 63  d = iRow;.#.proc
0b70: 20 72 65 61 64 5f 62 6c 6f 62 20 7b 7a 44 62 20   read_blob {zDb 
0b80: 7a 54 61 62 20 7a 43 6f 6c 20 69 52 6f 77 7d 20  zTab zCol iRow} 
0b90: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
0ba0: 5f 6f 70 65 6e 20 64 62 20 24 7a 44 62 20 24 7a  _open db $zDb $z
0bb0: 54 61 62 20 24 7a 43 6f 6c 20 24 69 52 6f 77 20  Tab $zCol $iRow 
0bc0: 30 20 42 0a 20 20 73 65 74 20 6e 42 79 74 65 20  0 B.  set nByte 
0bd0: 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79  [sqlite3_blob_by
0be0: 74 65 73 20 24 42 5d 0a 20 20 73 65 74 20 64 61  tes $B].  set da
0bf0: 74 61 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62  ta [sqlite3_blob
0c00: 5f 72 65 61 64 20 24 42 20 30 20 24 6e 42 79 74  _read $B 0 $nByt
0c10: 65 5d 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  e].  sqlite3_blo
0c20: 62 5f 63 6c 6f 73 65 20 24 42 0a 20 20 72 65 74  b_close $B.  ret
0c30: 75 72 6e 20 24 64 61 74 61 0a 7d 0a 0a 64 6f 5f  urn $data.}..do_
0c40: 74 65 73 74 20 31 2e 31 2e 31 20 7b 20 72 65 61  test 1.1.1 { rea
0c50: 64 5f 62 6c 6f 62 20 6d 61 69 6e 20 74 31 20 62  d_blob main t1 b
0c60: 20 31 20 7d 20 22 6d 61 69 6e 20 6f 6e 65 22 0a   1 } "main one".
0c70: 64 6f 5f 74 65 73 74 20 31 2e 31 2e 32 20 7b 20  do_test 1.1.2 { 
0c80: 72 65 61 64 5f 62 6c 6f 62 20 6d 61 69 6e 20 74  read_blob main t
0c90: 31 20 63 20 31 20 7d 20 22 5c 30 31 5c 30 31 22  1 c 1 } "\01\01"
0ca0: 0a 64 6f 5f 74 65 73 74 20 31 2e 31 2e 33 20 7b  .do_test 1.1.3 {
0cb0: 20 72 65 61 64 5f 62 6c 6f 62 20 74 65 6d 70 20   read_blob temp 
0cc0: 74 31 20 62 20 31 20 7d 20 22 74 65 6d 70 20 6f  t1 b 1 } "temp o
0cd0: 6e 65 22 0a 64 6f 5f 74 65 73 74 20 31 2e 31 2e  ne".do_test 1.1.
0ce0: 34 20 7b 20 72 65 61 64 5f 62 6c 6f 62 20 74 65  4 { read_blob te
0cf0: 6d 70 20 74 31 20 63 20 31 20 7d 20 22 5c 30 32  mp t1 c 1 } "\02
0d00: 5c 30 31 22 0a 64 6f 5f 74 65 73 74 20 31 2e 31  \01".do_test 1.1
0d10: 2e 36 20 7b 20 72 65 61 64 5f 62 6c 6f 62 20 61  .6 { read_blob a
0d20: 75 78 20 20 74 31 20 62 20 31 20 7d 20 22 61 75  ux  t1 b 1 } "au
0d30: 78 20 6f 6e 65 22 0a 64 6f 5f 74 65 73 74 20 31  x one".do_test 1
0d40: 2e 31 2e 37 20 7b 20 72 65 61 64 5f 62 6c 6f 62  .1.7 { read_blob
0d50: 20 61 75 78 20 20 74 31 20 63 20 31 20 7d 20 22   aux  t1 c 1 } "
0d60: 5c 30 33 5c 30 31 22 0a 0a 64 6f 5f 74 65 73 74  \03\01"..do_test
0d70: 20 31 2e 32 2e 31 20 7b 20 72 65 61 64 5f 62 6c   1.2.1 { read_bl
0d80: 6f 62 20 6d 61 69 6e 20 74 31 20 62 20 34 20 7d  ob main t1 b 4 }
0d90: 20 22 6d 61 69 6e 20 66 6f 75 72 22 0a 64 6f 5f   "main four".do_
0da0: 74 65 73 74 20 31 2e 32 2e 32 20 7b 20 72 65 61  test 1.2.2 { rea
0db0: 64 5f 62 6c 6f 62 20 6d 61 69 6e 20 74 31 20 63  d_blob main t1 c
0dc0: 20 34 20 7d 20 22 5c 30 31 5c 30 34 22 0a 64 6f   4 } "\01\04".do
0dd0: 5f 74 65 73 74 20 31 2e 32 2e 33 20 7b 20 72 65  _test 1.2.3 { re
0de0: 61 64 5f 62 6c 6f 62 20 74 65 6d 70 20 74 31 20  ad_blob temp t1 
0df0: 62 20 34 20 7d 20 22 74 65 6d 70 20 66 6f 75 72  b 4 } "temp four
0e00: 22 0a 64 6f 5f 74 65 73 74 20 31 2e 32 2e 34 20  ".do_test 1.2.4 
0e10: 7b 20 72 65 61 64 5f 62 6c 6f 62 20 74 65 6d 70  { read_blob temp
0e20: 20 74 31 20 63 20 34 20 7d 20 22 5c 30 32 5c 30   t1 c 4 } "\02\0
0e30: 34 22 0a 64 6f 5f 74 65 73 74 20 31 2e 32 2e 36  4".do_test 1.2.6
0e40: 20 7b 20 72 65 61 64 5f 62 6c 6f 62 20 61 75 78   { read_blob aux
0e50: 20 20 74 31 20 62 20 34 20 7d 20 22 61 75 78 20    t1 b 4 } "aux 
0e60: 66 6f 75 72 22 0a 64 6f 5f 74 65 73 74 20 31 2e  four".do_test 1.
0e70: 32 2e 37 20 7b 20 72 65 61 64 5f 62 6c 6f 62 20  2.7 { read_blob 
0e80: 61 75 78 20 20 74 31 20 63 20 34 20 7d 20 22 5c  aux  t1 c 4 } "\
0e90: 30 33 5c 30 34 22 0a 0a 64 6f 5f 74 65 73 74 20  03\04"..do_test 
0ea0: 31 2e 33 2e 31 20 7b 20 72 65 61 64 5f 62 6c 6f  1.3.1 { read_blo
0eb0: 62 20 6d 61 69 6e 20 78 31 20 62 20 32 20 7d 20  b main x1 b 2 } 
0ec0: 22 78 20 6d 61 69 6e 20 74 77 6f 22 0a 64 6f 5f  "x main two".do_
0ed0: 74 65 73 74 20 31 2e 33 2e 32 20 7b 20 72 65 61  test 1.3.2 { rea
0ee0: 64 5f 62 6c 6f 62 20 6d 61 69 6e 20 78 31 20 63  d_blob main x1 c
0ef0: 20 32 20 7d 20 22 5c 30 30 5c 30 31 5c 30 32 22   2 } "\00\01\02"
0f00: 0a 64 6f 5f 74 65 73 74 20 31 2e 33 2e 33 20 7b  .do_test 1.3.3 {
0f10: 20 72 65 61 64 5f 62 6c 6f 62 20 74 65 6d 70 20   read_blob temp 
0f20: 78 32 20 62 20 32 20 7d 20 22 78 20 74 65 6d 70  x2 b 2 } "x temp
0f30: 20 74 77 6f 22 0a 64 6f 5f 74 65 73 74 20 31 2e   two".do_test 1.
0f40: 33 2e 34 20 7b 20 72 65 61 64 5f 62 6c 6f 62 20  3.4 { read_blob 
0f50: 74 65 6d 70 20 78 32 20 63 20 32 20 7d 20 22 5c  temp x2 c 2 } "\
0f60: 30 30 5c 30 32 5c 30 32 22 0a 64 6f 5f 74 65 73  00\02\02".do_tes
0f70: 74 20 31 2e 33 2e 36 20 7b 20 72 65 61 64 5f 62  t 1.3.6 { read_b
0f80: 6c 6f 62 20 61 75 78 20 20 78 33 20 62 20 32 20  lob aux  x3 b 2 
0f90: 7d 20 22 78 20 61 75 78 20 74 77 6f 22 0a 64 6f  } "x aux two".do
0fa0: 5f 74 65 73 74 20 31 2e 33 2e 37 20 7b 20 72 65  _test 1.3.7 { re
0fb0: 61 64 5f 62 6c 6f 62 20 61 75 78 20 20 78 33 20  ad_blob aux  x3 
0fc0: 63 20 32 20 7d 20 22 5c 30 30 5c 30 33 5c 30 32  c 2 } "\00\03\02
0fd0: 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "..#------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
1020: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1030: 37 32 33 34 2d 30 35 37 36 31 20 50 61 72 61 6d  7234-05761 Param
1040: 65 74 65 72 20 7a 44 62 20 69 73 20 6e 6f 74 20  eter zDb is not 
1050: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 68 61  the filename tha
1060: 74 0a 23 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  t.# contains the
1070: 20 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 72   database, but r
1080: 61 74 68 65 72 20 74 68 65 20 73 79 6d 62 6f 6c  ather the symbol
1090: 69 63 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  ic name of the d
10a0: 61 74 61 62 61 73 65 2e 0a 23 20 46 6f 72 20 61  atabase..# For a
10b0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
10c0: 73 2c 20 74 68 69 73 20 69 73 20 74 68 65 20 6e  s, this is the n
10d0: 61 6d 65 20 74 68 61 74 20 61 70 70 65 61 72 73  ame that appears
10e0: 20 61 66 74 65 72 20 74 68 65 20 41 53 0a 23 20   after the AS.# 
10f0: 6b 65 79 77 6f 72 64 20 69 6e 20 74 68 65 20 41  keyword in the A
1100: 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 2e  TTACH statement.
1110: 20 46 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   For the main da
1120: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
1130: 0a 23 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  .# database name
1140: 20 69 73 20 22 6d 61 69 6e 22 2e 20 46 6f 72 20   is "main". For 
1150: 54 45 4d 50 20 74 61 62 6c 65 73 2c 20 74 68 65  TEMP tables, the
1160: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
1170: 73 20 22 74 65 6d 70 22 2e 0a 23 0a 23 20 20 20  s "temp"..#.#   
1180: 54 68 65 20 74 65 73 74 20 63 61 73 65 73 20 69  The test cases i
1190: 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 6f 76 65  mmediately above
11a0: 20 64 65 6d 6f 6e 73 74 72 61 74 65 20 74 68 61   demonstrate tha
11b0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  t the database n
11c0: 61 6d 65 0a 23 20 20 20 66 6f 72 20 74 68 65 20  ame.#   for the 
11d0: 6d 61 69 6e 20 64 62 2c 20 66 6f 72 20 54 45 4d  main db, for TEM
11e0: 50 20 74 61 62 6c 65 73 20 61 6e 64 20 66 6f 72  P tables and for
11f0: 20 74 68 6f 73 65 20 69 6e 20 61 74 74 61 63 68   those in attach
1200: 65 64 20 64 61 74 61 62 61 73 65 73 0a 23 20 20  ed databases.#  
1210: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 54 68 65   is correct. The
1220: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
1230: 20 63 68 65 63 6b 20 74 68 61 74 20 66 69 6c 65   check that file
1240: 6e 61 6d 65 73 20 63 61 6e 6e 6f 74 20 62 65 0a  names cannot be.
1250: 23 20 20 20 75 73 65 64 20 61 73 20 77 65 6c 6c  #   used as well
1260: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 32 2e 31 20  ..#.do_test 2.1 
1270: 7b 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20  {.  list [catch 
1280: 7b 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  { sqlite3_blob_o
1290: 70 65 6e 20 64 62 20 22 74 65 73 74 2e 64 62 22  pen db "test.db"
12a0: 20 74 31 20 62 20 31 20 30 20 42 20 7d 20 6d 73   t1 b 1 0 B } ms
12b0: 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c  g] $msg.} {1 SQL
12c0: 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65  ITE_ERROR}.do_te
12d0: 73 74 20 32 2e 32 20 7b 0a 20 20 6c 69 73 74 20  st 2.2 {.  list 
12e0: 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33  [catch { sqlite3
12f0: 5f 62 6c 6f 62 5f 6f 70 65 6e 20 64 62 20 22 74  _blob_open db "t
1300: 65 73 74 2e 64 62 32 22 20 74 31 20 62 20 31 20  est.db2" t1 b 1 
1310: 30 20 42 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a  0 B } msg] $msg.
1320: 7d 20 7b 31 20 53 51 4c 49 54 45 5f 45 52 52 4f  } {1 SQLITE_ERRO
1330: 52 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  R}..#-----------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1380: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1390: 35 30 38 35 34 2d 35 33 39 37 39 20 49 66 20 74  50854-53979 If t
13a0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
13b0: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
13c0: 74 68 65 6e 0a 23 20 74 68 65 20 42 4c 4f 42 20  then.# the BLOB 
13d0: 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  is opened for re
13e0: 61 64 20 61 6e 64 20 77 72 69 74 65 20 61 63 63  ad and write acc
13f0: 65 73 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ess..#.# EVIDENC
1400: 45 2d 4f 46 3a 20 52 2d 30 33 39 32 32 2d 34 31  E-OF: R-03922-41
1410: 31 36 30 20 49 66 20 74 68 65 20 66 6c 61 67 73  160 If the flags
1420: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65   parameter is ze
1430: 72 6f 2c 20 74 68 65 20 42 4c 4f 42 20 69 73 0a  ro, the BLOB is.
1440: 23 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  # opened for rea
1450: 64 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 23  d-only access..#
1460: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 69 52 6f  .foreach {tn iRo
1470: 77 20 66 6c 61 67 73 7d 20 7b 0a 20 20 31 20 31  w flags} {.  1 1
1480: 20 20 20 30 0a 20 20 32 20 32 20 20 20 31 0a 20     0.  2 2   1. 
1490: 20 33 20 33 20 20 2d 31 0a 20 20 34 20 34 20 20   3 3  -1.  4 4  
14a0: 20 32 31 34 37 34 38 33 36 34 37 0a 20 20 35 20   2147483647.  5 
14b0: 35 20 20 2d 32 31 34 37 34 38 33 36 34 38 0a 7d  5  -2147483648.}
14c0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 33 2e 24   {.  do_test 3.$
14d0: 74 6e 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74  tn.1 {.    sqlit
14e0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 20 64 62 20  e3_blob_open db 
14f0: 6d 61 69 6e 20 78 31 20 63 20 24 69 52 6f 77 20  main x1 c $iRow 
1500: 24 66 6c 61 67 73 20 42 0a 20 20 20 20 73 65 74  $flags B.    set
1510: 20 6e 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62   n [sqlite3_blob
1520: 5f 62 79 74 65 73 20 24 42 5d 0a 20 20 20 20 73  _bytes $B].    s
1530: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
1540: 20 24 42 20 30 20 24 6e 0a 20 20 7d 20 5b 62 69   $B 0 $n.  } [bi
1550: 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 63 63 20  nary format ccc 
1560: 30 20 31 20 24 69 52 6f 77 5d 0a 0a 20 20 69 66  0 1 $iRow]..  if
1570: 20 7b 24 66 6c 61 67 73 3d 3d 30 7d 20 7b 0a 20   {$flags==0} {. 
1580: 20 20 20 23 20 42 6c 6f 62 20 77 61 73 20 6f 70     # Blob was op
1590: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2d 6f 6e  ened for read-on
15a0: 6c 79 20 61 63 63 65 73 73 20 2d 20 77 72 69 74  ly access - writ
15b0: 69 6e 67 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ing returns an e
15c0: 72 72 6f 72 2e 0a 20 20 20 20 64 6f 5f 74 65 73  rror..    do_tes
15d0: 74 20 33 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  t 3.$tn.2 {.    
15e0: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20    list [catch { 
15f0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
1600: 74 65 20 24 42 20 30 20 78 78 78 20 33 20 7d 20  te $B 0 xxx 3 } 
1610: 6d 73 67 5d 20 24 6d 73 67 0a 20 20 20 20 7d 20  msg] $msg.    } 
1620: 7b 31 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  {1 SQLITE_READON
1630: 4c 59 7d 0a 0a 20 20 20 20 64 6f 5f 65 78 65 63  LY}..    do_exec
1640: 73 71 6c 5f 74 65 73 74 20 33 2e 24 74 6e 2e 33  sql_test 3.$tn.3
1650: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1660: 63 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20  c FROM x1 WHERE 
1670: 61 3d 24 69 52 6f 77 3b 0a 20 20 20 20 7d 20 5b  a=$iRow;.    } [
1680: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 63  binary format cc
1690: 63 20 30 20 31 20 24 69 52 6f 77 5d 0a 20 20 7d  c 0 1 $iRow].  }
16a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 23 20 42 6c   else {.    # Bl
16b0: 6f 62 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f  ob was opened fo
16c0: 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
16d0: 65 73 73 20 2d 20 77 72 69 74 69 6e 67 20 73 75  ess - writing su
16e0: 63 63 65 65 64 73 0a 20 20 20 20 64 6f 5f 74 65  cceeds.    do_te
16f0: 73 74 20 33 2e 24 74 6e 2e 34 20 7b 0a 20 20 20  st 3.$tn.4 {.   
1700: 20 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b     list [catch {
1710: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
1720: 69 74 65 20 24 42 20 30 20 78 78 78 20 33 20 7d  ite $B 0 xxx 3 }
1730: 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20 20 20 7d   msg] $msg.    }
1740: 20 7b 30 20 7b 7d 7d 0a 0a 20 20 20 20 64 6f 5f   {0 {}}..    do_
1750: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 24  execsql_test 3.$
1760: 74 6e 2e 35 20 7b 0a 20 20 20 20 20 20 53 45 4c  tn.5 {.      SEL
1770: 45 43 54 20 63 20 46 52 4f 4d 20 78 31 20 57 48  ECT c FROM x1 WH
1780: 45 52 45 20 61 3d 24 69 52 6f 77 3b 0a 20 20 20  ERE a=$iRow;.   
1790: 20 7d 20 7b 78 78 78 7d 0a 20 20 7d 0a 0a 20 20   } {xxx}.  }..  
17a0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
17b0: 73 65 20 24 42 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  se $B.}..#------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64  ---.#.reset_db.d
1810: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
1820: 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .0 {.  CREATE TA
1830: 42 4c 45 20 74 31 28 78 2c 20 79 29 3b 0a 20 20  BLE t1(x, y);.  
1840: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1850: 41 4c 55 45 53 28 27 61 62 63 64 27 2c 20 31 35  ALUES('abcd', 15
1860: 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2);.  INSERT INT
1870: 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c  O t1 VALUES(NULL
1880: 2c 20 58 27 30 30 30 31 30 32 30 33 27 29 3b 0a  , X'00010203');.
1890: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
18a0: 20 56 41 4c 55 45 53 28 27 27 2c 20 31 35 34 2e   VALUES('', 154.
18b0: 32 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41  2);..  CREATE TA
18c0: 42 4c 45 20 74 32 28 78 20 50 52 49 4d 41 52 59  BLE t2(x PRIMARY
18d0: 20 4b 45 59 2c 20 79 29 20 57 49 54 48 4f 55 54   KEY, y) WITHOUT
18e0: 20 52 4f 57 49 44 3b 0a 20 20 49 4e 53 45 52 54   ROWID;.  INSERT
18f0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1900: 31 2c 20 27 62 6c 6f 62 27 29 3b 0a 0a 20 20 43  1, 'blob');..  C
1910: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
1920: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c   PRIMARY KEY, b,
1930: 20 63 2c 20 64 2c 20 65 2c 20 66 2c 20 55 4e 49   c, d, e, f, UNI
1940: 51 55 45 28 65 2c 20 66 29 29 3b 0a 20 20 49 4e  QUE(e, f));.  IN
1950: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
1960: 55 45 53 28 27 61 61 61 61 27 2c 20 27 62 62 62  UES('aaaa', 'bbb
1970: 62 27 2c 20 27 63 63 63 63 27 2c 20 27 64 64 64  b', 'cccc', 'ddd
1980: 64 27 2c 20 27 65 65 65 65 27 2c 20 27 66 66 66  d', 'eeee', 'fff
1990: 66 27 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  f');.  CREATE IN
19a0: 44 45 58 20 74 33 62 20 4f 4e 20 74 33 28 62 29  DEX t3b ON t3(b)
19b0: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  ;..  CREATE TABL
19c0: 45 20 70 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E p1(x PRIMARY K
19d0: 45 59 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  EY);.  INSERT IN
19e0: 54 4f 20 70 31 20 56 41 4c 55 45 53 28 27 61 62  TO p1 VALUES('ab
19f0: 63 27 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  c');..  CREATE T
1a00: 41 42 4c 45 20 63 31 28 61 20 49 4e 54 45 47 45  ABLE c1(a INTEGE
1a10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
1a20: 20 52 45 46 45 52 45 4e 43 45 53 20 70 31 29 3b   REFERENCES p1);
1a30: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
1a40: 31 20 56 41 4c 55 45 53 28 34 35 2c 20 27 61 62  1 VALUES(45, 'ab
1a50: 63 27 29 3b 0a 7d 0a 0a 70 72 6f 63 20 74 65 73  c');.}..proc tes
1a60: 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 7b 74 6e 20  t_blob_open {tn 
1a70: 7a 44 62 20 7a 54 61 62 20 7a 43 6f 6c 20 69 52  zDb zTab zCol iR
1a80: 6f 77 20 66 6c 61 67 73 20 20 20 20 65 72 72 63  ow flags    errc
1a90: 6f 64 65 20 65 72 72 6d 73 67 7d 20 7b 0a 20 20  ode errmsg} {.  
1aa0: 67 6c 6f 62 61 6c 20 42 0a 20 20 73 65 74 20 42  global B.  set B
1ab0: 20 22 30 78 31 32 33 34 22 0a 0a 20 20 69 66 20   "0x1234"..  if 
1ac0: 7b 24 65 72 72 63 6f 64 65 3d 3d 22 53 51 4c 49  {$errcode=="SQLI
1ad0: 54 45 5f 4f 4b 22 7d 20 7b 0a 20 20 20 20 73 65  TE_OK"} {.    se
1ae0: 74 20 65 78 70 65 63 74 65 64 20 22 30 20 7b 7d  t expected "0 {}
1af0: 22 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ".  } else {.   
1b00: 20 73 65 74 20 65 78 70 65 63 74 65 64 20 22 31   set expected "1
1b10: 20 24 65 72 72 63 6f 64 65 22 0a 20 20 7d 0a 0a   $errcode".  }..
1b20: 20 20 73 65 74 20 3a 3a 72 65 73 20 5b 6c 69 73    set ::res [lis
1b30: 74 20 5b 0a 20 20 20 20 63 61 74 63 68 20 7b 20  t [.    catch { 
1b40: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
1b50: 6e 20 64 62 20 24 7a 44 62 20 24 7a 54 61 62 20  n db $zDb $zTab 
1b60: 24 7a 43 6f 6c 20 24 69 52 6f 77 20 24 66 6c 61  $zCol $iRow $fla
1b70: 67 73 20 42 20 7d 20 6d 73 67 0a 20 20 5d 20 24  gs B } msg.  ] $
1b80: 6d 73 67 5d 0a 20 20 64 6f 5f 74 65 73 74 20 34  msg].  do_test 4
1b90: 2e 24 74 6e 2e 31 20 7b 20 73 65 74 20 3a 3a 72  .$tn.1 { set ::r
1ba0: 65 73 20 7d 20 24 65 78 70 65 63 74 65 64 0a 0a  es } $expected..
1bb0: 20 20 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a    # EVIDENCE-OF:
1bc0: 20 52 2d 30 38 39 34 30 2d 32 31 33 30 35 20 55   R-08940-21305 U
1bd0: 6e 6c 65 73 73 20 69 74 20 72 65 74 75 72 6e 73  nless it returns
1be0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
1bf0: 74 68 69 73 0a 20 20 23 20 66 75 6e 63 74 69 6f  this.  # functio
1c00: 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61 62  n sets the datab
1c10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65  ase connection e
1c20: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
1c30: 73 73 61 67 65 0a 20 20 23 20 61 63 63 65 73 73  ssage.  # access
1c40: 69 62 6c 65 20 76 69 61 20 73 71 6c 69 74 65 33  ible via sqlite3
1c50: 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
1c60: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20  qlite3_errmsg() 
1c70: 61 6e 64 20 72 65 6c 61 74 65 64 0a 20 20 23 20  and related.  # 
1c80: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 23 0a 20  functions..  #. 
1c90: 20 23 20 20 20 54 68 69 73 20 70 72 6f 63 20 28   #   This proc (
1ca0: 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 29 20  test_blob_open) 
1cb0: 69 73 20 75 73 65 64 20 62 65 6c 6f 77 20 74 6f  is used below to
1cc0: 20 74 65 73 74 20 76 61 72 69 6f 75 73 20 65 72   test various er
1cd0: 72 6f 72 20 61 6e 64 0a 20 20 23 20 20 20 6e 6f  ror and.  #   no
1ce0: 6e 2d 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n-error conditio
1cf0: 6e 73 2e 20 42 75 74 20 6e 65 76 65 72 20 53 51  ns. But never SQ
1d00: 4c 49 54 45 5f 4d 49 53 55 53 45 20 63 6f 6e 64  LITE_MISUSE cond
1d10: 69 74 69 6f 6e 73 2e 20 53 6f 20 74 68 65 73 65  itions. So these
1d20: 0a 20 20 23 20 20 20 74 65 73 74 20 63 61 73 65  .  #   test case
1d30: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1d40: 20 61 73 20 70 61 72 74 6c 79 20 76 65 72 69 66   as partly verif
1d50: 79 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ying the require
1d60: 6d 65 6e 74 20 61 62 6f 76 65 2e 0a 20 20 23 20  ment above..  # 
1d70: 20 20 53 65 65 20 62 65 6c 6f 77 20 66 6f 72 20    See below for 
1d80: 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 53 51  a test of the SQ
1d90: 4c 49 54 45 5f 4d 49 53 55 53 45 20 63 61 73 65  LITE_MISUSE case
1da0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
1db0: 34 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 73 71  4.$tn.2 {.    sq
1dc0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62  lite3_errcode db
1dd0: 0a 20 20 7d 20 24 65 72 72 63 6f 64 65 0a 20 20  .  } $errcode.  
1de0: 64 6f 5f 74 65 73 74 20 34 2e 24 74 6e 2e 33 20  do_test 4.$tn.3 
1df0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72  {.    sqlite3_er
1e00: 72 6d 73 67 20 64 62 0a 20 20 7d 20 24 65 72 72  rmsg db.  } $err
1e10: 6d 73 67 0a 0a 20 20 23 20 45 56 49 44 45 4e 43  msg..  # EVIDENC
1e20: 45 2d 4f 46 3a 20 52 2d 33 31 30 38 36 2d 33 35  E-OF: R-31086-35
1e30: 35 32 31 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  521 On success, 
1e40: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e50: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 0a 20 20  urned and the.  
1e60: 23 20 6e 65 77 20 42 4c 4f 42 20 68 61 6e 64 6c  # new BLOB handl
1e70: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  e is stored in *
1e80: 70 70 42 6c 6f 62 2e 20 4f 74 68 65 72 77 69 73  ppBlob. Otherwis
1e90: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
1ea0: 69 73 0a 20 20 23 20 72 65 74 75 72 6e 65 64 20  is.  # returned 
1eb0: 61 6e 64 2c 20 75 6e 6c 65 73 73 20 74 68 65 20  and, unless the 
1ec0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
1ed0: 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 2a 70 70  LITE_MISUSE, *pp
1ee0: 42 6c 6f 62 20 69 73 20 73 65 74 0a 20 20 23 20  Blob is set.  # 
1ef0: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 23 0a 20 20 64  to NULL..  #.  d
1f00: 6f 5f 74 65 73 74 20 34 2e 24 74 6e 2e 34 20 7b  o_test 4.$tn.4 {
1f10: 0a 20 20 20 20 65 78 70 72 20 7b 24 42 20 3d 3d  .    expr {$B ==
1f20: 20 22 30 22 7d 0a 20 20 7d 20 5b 65 78 70 72 20   "0"}.  } [expr 
1f30: 7b 24 65 72 72 63 6f 64 65 20 21 3d 20 22 53 51  {$errcode != "SQ
1f40: 4c 49 54 45 5f 4f 4b 22 7d 5d 0a 0a 20 20 23 20  LITE_OK"}]..  # 
1f50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
1f60: 33 34 32 31 2d 31 35 35 32 31 20 54 68 69 73 20  3421-15521 This 
1f70: 6d 65 61 6e 73 20 74 68 61 74 2c 20 70 72 6f 76  means that, prov
1f80: 69 64 65 64 20 74 68 65 20 41 50 49 20 69 73 20  ided the API is 
1f90: 6e 6f 74 0a 20 20 23 20 6d 69 73 75 73 65 64 2c  not.  # misused,
1fa0: 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 61   it is always sa
1fb0: 66 65 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  fe to call sqlit
1fc0: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 29 20  e3_blob_close() 
1fd0: 6f 6e 20 2a 70 70 42 6c 6f 62 0a 20 20 23 20 61  on *ppBlob.  # a
1fe0: 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1ff0: 6f 6e 20 69 74 20 72 65 74 75 72 6e 73 2e 0a 20  on it returns.. 
2000: 20 64 6f 5f 74 65 73 74 20 34 2e 24 74 6e 2e 35   do_test 4.$tn.5
2010: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   {.    sqlite3_b
2020: 6c 6f 62 5f 63 6c 6f 73 65 20 24 42 0a 20 20 7d  lob_close $B.  }
2030: 20 7b 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43   {}.}..# EVIDENC
2040: 45 2d 4f 46 3a 20 52 2d 33 31 32 30 34 2d 34 34  E-OF: R-31204-44
2050: 37 38 30 20 44 61 74 61 62 61 73 65 20 7a 44 62  780 Database zDb
2060: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 0a   does not exist.
2070: 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 31  test_blob_open 1
2080: 20 6e 6f 73 75 63 68 64 62 20 74 31 20 78 20 31   nosuchdb t1 x 1
2090: 20 30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   0 SQLITE_ERROR 
20a0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
20b0: 6e 6f 73 75 63 68 64 62 2e 74 31 22 0a 0a 23 20  nosuchdb.t1"..# 
20c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
20d0: 38 36 37 36 2d 30 38 30 30 35 20 54 61 62 6c 65  8676-08005 Table
20e0: 20 7a 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74   zTable does not
20f0: 20 65 78 69 73 74 20 77 69 74 68 69 6e 20 64 61   exist within da
2100: 74 61 62 61 73 65 20 7a 44 62 0a 74 65 73 74 5f  tabase zDb.test_
2110: 62 6c 6f 62 5f 6f 70 65 6e 20 32 20 6d 61 69 6e  blob_open 2 main
2120: 20 74 74 31 20 78 20 31 20 30 20 20 20 20 53 51   tt1 x 1 0    SQ
2130: 4c 49 54 45 5f 45 52 52 4f 52 20 22 6e 6f 20 73  LITE_ERROR "no s
2140: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
2150: 74 74 31 22 0a 0a 23 20 45 56 49 44 45 4e 43 45  tt1"..# EVIDENCE
2160: 2d 4f 46 3a 20 52 2d 34 30 31 33 34 2d 33 30 32  -OF: R-40134-302
2170: 39 36 20 54 61 62 6c 65 20 7a 54 61 62 6c 65 20  96 Table zTable 
2180: 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  is a WITHOUT ROW
2190: 49 44 20 74 61 62 6c 65 0a 74 65 73 74 5f 62 6c  ID table.test_bl
21a0: 6f 62 5f 6f 70 65 6e 20 33 20 6d 61 69 6e 20 74  ob_open 3 main t
21b0: 32 20 79 20 31 20 30 20 20 20 20 20 53 51 4c 49  2 y 1 0     SQLI
21c0: 54 45 5f 45 52 52 4f 52 20 5c 0a 20 20 20 20 22  TE_ERROR \.    "
21d0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 62 6c  cannot open tabl
21e0: 65 20 77 69 74 68 6f 75 74 20 72 6f 77 69 64 3a  e without rowid:
21f0: 20 74 32 22 0a 0a 23 20 45 56 49 44 45 4e 43 45   t2"..# EVIDENCE
2200: 2d 4f 46 3a 20 52 2d 35 36 33 37 36 2d 32 31 32  -OF: R-56376-212
2210: 36 31 20 43 6f 6c 75 6d 6e 20 7a 43 6f 6c 75 6d  61 Column zColum
2220: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
2230: 0a 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20  .test_blob_open 
2240: 34 20 6d 61 69 6e 20 74 31 20 7a 20 32 20 30 20  4 main t1 z 2 0 
2250: 20 20 20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52      SQLITE_ERROR
2260: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
2270: 3a 20 5c 22 7a 5c 22 22 0a 0a 23 20 45 56 49 44  : \"z\""..# EVID
2280: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 32 35 38  ENCE-OF: R-28258
2290: 2d 32 33 31 36 36 20 52 6f 77 20 69 52 6f 77 20  -23166 Row iRow 
22a0: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
22b0: 6e 20 74 68 65 20 74 61 62 6c 65 0a 74 65 73 74  n the table.test
22c0: 5f 62 6c 6f 62 5f 6f 70 65 6e 20 35 20 6d 61 69  _blob_open 5 mai
22d0: 6e 20 74 31 20 79 20 36 20 30 20 20 20 20 20 53  n t1 y 6 0     S
22e0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 22 6e 6f 20  QLITE_ERROR "no 
22f0: 73 75 63 68 20 72 6f 77 69 64 3a 20 36 22 0a 0a  such rowid: 6"..
2300: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2310: 2d 31 31 36 38 33 2d 36 32 33 38 30 20 54 68 65  -11683-62380 The
2320: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
2330: 6e 20 6f 66 20 72 6f 77 20 69 52 6f 77 20 63 6f  n of row iRow co
2340: 6e 74 61 69 6e 73 20 61 0a 23 20 76 61 6c 75 65  ntains a.# value
2350: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 54   that is not a T
2360: 45 58 54 20 6f 72 20 42 4c 4f 42 20 76 61 6c 75  EXT or BLOB valu
2370: 65 0a 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e  e.test_blob_open
2380: 20 36 20 6d 61 69 6e 20 74 31 20 78 20 32 20 30   6 main t1 x 2 0
2390: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 22 63   SQLITE_ERROR "c
23a0: 61 6e 6e 6f 74 20 6f 70 65 6e 20 76 61 6c 75 65  annot open value
23b0: 20 6f 66 20 74 79 70 65 20 6e 75 6c 6c 22 0a 74   of type null".t
23c0: 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 37 20  est_blob_open 7 
23d0: 6d 61 69 6e 20 74 31 20 79 20 31 20 30 20 53 51  main t1 y 1 0 SQ
23e0: 4c 49 54 45 5f 45 52 52 4f 52 20 22 63 61 6e 6e  LITE_ERROR "cann
23f0: 6f 74 20 6f 70 65 6e 20 76 61 6c 75 65 20 6f 66  ot open value of
2400: 20 74 79 70 65 20 69 6e 74 65 67 65 72 22 0a 74   type integer".t
2410: 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 38 20  est_blob_open 8 
2420: 6d 61 69 6e 20 74 31 20 79 20 33 20 30 20 53 51  main t1 y 3 0 SQ
2430: 4c 49 54 45 5f 45 52 52 4f 52 20 22 63 61 6e 6e  LITE_ERROR "cann
2440: 6f 74 20 6f 70 65 6e 20 76 61 6c 75 65 20 6f 66  ot open value of
2450: 20 74 79 70 65 20 72 65 61 6c 22 0a 0a 23 20 45   type real"..# E
2460: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34  VIDENCE-OF: R-34
2470: 31 34 36 2d 33 30 37 38 32 20 43 6f 6c 75 6d 6e  146-30782 Column
2480: 20 7a 43 6f 6c 75 6d 6e 20 69 73 20 70 61 72 74   zColumn is part
2490: 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 20 50 52   of an index, PR
24a0: 49 4d 41 52 59 0a 23 20 4b 45 59 20 6f 72 20 55  IMARY.# KEY or U
24b0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
24c0: 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 20 69 73   and the blob is
24d0: 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 66 6f   being opened fo
24e0: 72 20 72 65 61 64 2f 77 72 69 74 65 0a 23 20 61  r read/write.# a
24f0: 63 63 65 73 73 0a 23 0a 23 20 54 65 73 74 20 63  ccess.#.# Test c
2500: 61 73 65 73 20 38 2e 31 2e 2a 20 73 68 6f 77 20  ases 8.1.* show 
2510: 74 68 61 74 20 73 75 63 68 20 63 6f 6c 75 6d 6e  that such column
2520: 73 20 63 61 6e 20 62 65 20 6f 70 65 6e 65 64 20  s can be opened 
2530: 66 6f 72 20 72 65 61 64 2d 61 63 63 65 73 73 2e  for read-access.
2540: 20 0a 23 20 54 65 73 74 73 20 38 2e 32 2e 2a 20   .# Tests 8.2.* 
2550: 73 68 6f 77 20 74 68 61 74 20 72 65 61 64 2d 77  show that read-w
2560: 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 64  rite access is d
2570: 69 66 66 65 72 65 6e 74 2e 20 43 6f 6c 75 6d 6e  ifferent. Column
2580: 73 20 22 63 22 20 61 6e 64 20 22 63 22 0a 23 20  s "c" and "c".# 
2590: 61 72 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20  are not part of 
25a0: 61 6e 20 69 6e 64 65 78 2c 20 50 4b 20 6f 72 20  an index, PK or 
25b0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
25c0: 74 2c 20 73 6f 20 74 68 65 79 20 77 6f 72 6b 20  t, so they work 
25d0: 69 6e 20 62 6f 74 68 0a 23 20 63 61 73 65 73 2e  in both.# cases.
25e0: 0a 23 0a 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65  .#.test_blob_ope
25f0: 6e 20 38 2e 31 2e 31 20 6d 61 69 6e 20 74 33 20  n 8.1.1 main t3 
2600: 61 20 31 20 30 20 53 51 4c 49 54 45 5f 4f 4b 20  a 1 0 SQLITE_OK 
2610: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 0a 74  "not an error".t
2620: 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 38 2e  est_blob_open 8.
2630: 31 2e 32 20 6d 61 69 6e 20 74 33 20 62 20 31 20  1.2 main t3 b 1 
2640: 30 20 53 51 4c 49 54 45 5f 4f 4b 20 22 6e 6f 74  0 SQLITE_OK "not
2650: 20 61 6e 20 65 72 72 6f 72 22 0a 74 65 73 74 5f   an error".test_
2660: 62 6c 6f 62 5f 6f 70 65 6e 20 38 2e 31 2e 33 20  blob_open 8.1.3 
2670: 6d 61 69 6e 20 74 33 20 63 20 31 20 30 20 53 51  main t3 c 1 0 SQ
2680: 4c 49 54 45 5f 4f 4b 20 22 6e 6f 74 20 61 6e 20  LITE_OK "not an 
2690: 65 72 72 6f 72 22 0a 74 65 73 74 5f 62 6c 6f 62  error".test_blob
26a0: 5f 6f 70 65 6e 20 38 2e 31 2e 34 20 6d 61 69 6e  _open 8.1.4 main
26b0: 20 74 33 20 64 20 31 20 30 20 53 51 4c 49 54 45   t3 d 1 0 SQLITE
26c0: 5f 4f 4b 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f  _OK "not an erro
26d0: 72 22 0a 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65  r".test_blob_ope
26e0: 6e 20 38 2e 31 2e 35 20 6d 61 69 6e 20 74 33 20  n 8.1.5 main t3 
26f0: 65 20 31 20 30 20 53 51 4c 49 54 45 5f 4f 4b 20  e 1 0 SQLITE_OK 
2700: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 0a 74  "not an error".t
2710: 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 38 2e  est_blob_open 8.
2720: 31 2e 36 20 6d 61 69 6e 20 74 33 20 66 20 31 20  1.6 main t3 f 1 
2730: 30 20 53 51 4c 49 54 45 5f 4f 4b 20 22 6e 6f 74  0 SQLITE_OK "not
2740: 20 61 6e 20 65 72 72 6f 72 22 0a 0a 73 65 74 20   an error"..set 
2750: 63 61 6e 6e 6f 74 20 22 63 61 6e 6e 6f 74 20 6f  cannot "cannot o
2760: 70 65 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  pen indexed colu
2770: 6d 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 22 0a  mn for writing".
2780: 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 38  test_blob_open 8
2790: 2e 32 2e 31 20 6d 61 69 6e 20 74 33 20 61 20 31  .2.1 main t3 a 1
27a0: 20 38 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   8 SQLITE_ERROR 
27b0: 24 63 61 6e 6e 6f 74 0a 74 65 73 74 5f 62 6c 6f  $cannot.test_blo
27c0: 62 5f 6f 70 65 6e 20 38 2e 32 2e 32 20 6d 61 69  b_open 8.2.2 mai
27d0: 6e 20 74 33 20 62 20 31 20 38 20 53 51 4c 49 54  n t3 b 1 8 SQLIT
27e0: 45 5f 45 52 52 4f 52 20 24 63 61 6e 6e 6f 74 0a  E_ERROR $cannot.
27f0: 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 38  test_blob_open 8
2800: 2e 32 2e 33 20 6d 61 69 6e 20 74 33 20 63 20 31  .2.3 main t3 c 1
2810: 20 38 20 53 51 4c 49 54 45 5f 4f 4b 20 22 6e 6f   8 SQLITE_OK "no
2820: 74 20 61 6e 20 65 72 72 6f 72 22 0a 74 65 73 74  t an error".test
2830: 5f 62 6c 6f 62 5f 6f 70 65 6e 20 38 2e 32 2e 34  _blob_open 8.2.4
2840: 20 6d 61 69 6e 20 74 33 20 64 20 31 20 38 20 53   main t3 d 1 8 S
2850: 51 4c 49 54 45 5f 4f 4b 20 22 6e 6f 74 20 61 6e  QLITE_OK "not an
2860: 20 65 72 72 6f 72 22 0a 74 65 73 74 5f 62 6c 6f   error".test_blo
2870: 62 5f 6f 70 65 6e 20 38 2e 32 2e 35 20 6d 61 69  b_open 8.2.5 mai
2880: 6e 20 74 33 20 65 20 31 20 38 20 53 51 4c 49 54  n t3 e 1 8 SQLIT
2890: 45 5f 45 52 52 4f 52 20 24 63 61 6e 6e 6f 74 0a  E_ERROR $cannot.
28a0: 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 38  test_blob_open 8
28b0: 2e 32 2e 36 20 6d 61 69 6e 20 74 33 20 66 20 31  .2.6 main t3 f 1
28c0: 20 38 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   8 SQLITE_ERROR 
28d0: 24 63 61 6e 6e 6f 74 0a 0a 23 20 45 56 49 44 45  $cannot..# EVIDE
28e0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 31 31 37 2d  NCE-OF: R-50117-
28f0: 35 35 32 30 34 20 46 6f 72 65 69 67 6e 20 6b 65  55204 Foreign ke
2900: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
2910: 65 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6c 75 6d  e enabled, colum
2920: 6e 0a 23 20 7a 43 6f 6c 75 6d 6e 20 69 73 20 70  n.# zColumn is p
2930: 61 72 74 20 6f 66 20 61 20 63 68 69 6c 64 20 6b  art of a child k
2940: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 20 61 6e  ey definition an
2950: 64 20 74 68 65 20 62 6c 6f 62 20 69 73 20 62 65  d the blob is be
2960: 69 6e 67 20 6f 70 65 6e 65 64 0a 23 20 66 6f 72  ing opened.# for
2970: 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2980: 73 73 0a 23 0a 23 20 20 20 39 2e 31 3a 20 46 4b  ss.#.#   9.1: FK
2990: 20 64 69 73 61 62 6c 65 64 2c 20 72 65 61 64 2d   disabled, read-
29a0: 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 23 20 20  only access..#  
29b0: 20 39 2e 32 3a 20 46 4b 20 64 69 73 61 62 6c 65   9.2: FK disable
29c0: 64 2c 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63  d, read-only acc
29d0: 65 73 73 2e 0a 23 20 20 20 39 2e 33 3a 20 46 4b  ess..#   9.3: FK
29e0: 20 65 6e 61 62 6c 65 64 2c 20 72 65 61 64 2f 77   enabled, read/w
29f0: 72 69 74 65 20 61 63 63 65 73 73 2e 0a 23 20 20  rite access..#  
2a00: 20 39 2e 34 3a 20 46 4b 20 65 6e 61 62 6c 65 64   9.4: FK enabled
2a10: 2c 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  , read/write acc
2a20: 65 73 73 2e 0a 23 0a 74 65 73 74 5f 62 6c 6f 62  ess..#.test_blob
2a30: 5f 6f 70 65 6e 20 39 2e 31 20 6d 61 69 6e 20 63  _open 9.1 main c
2a40: 31 20 62 20 34 35 20 30 20 53 51 4c 49 54 45 5f  1 b 45 0 SQLITE_
2a50: 4f 4b 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72  OK "not an error
2a60: 22 0a 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e  ".test_blob_open
2a70: 20 39 2e 32 20 6d 61 69 6e 20 63 31 20 62 20 34   9.2 main c1 b 4
2a80: 35 20 31 20 53 51 4c 49 54 45 5f 4f 4b 20 22 6e  5 1 SQLITE_OK "n
2a90: 6f 74 20 61 6e 20 65 72 72 6f 72 22 0a 65 78 65  ot an error".exe
2aa0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 66 6f  csql { PRAGMA fo
2ab0: 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e 20  reign_keys = ON 
2ac0: 7d 0a 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65 6e  }.test_blob_open
2ad0: 20 39 2e 33 20 6d 61 69 6e 20 63 31 20 62 20 34   9.3 main c1 b 4
2ae0: 35 20 30 20 53 51 4c 49 54 45 5f 4f 4b 20 22 6e  5 0 SQLITE_OK "n
2af0: 6f 74 20 61 6e 20 65 72 72 6f 72 22 0a 74 65 73  ot an error".tes
2b00: 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 39 2e 34 20  t_blob_open 9.4 
2b10: 6d 61 69 6e 20 63 31 20 62 20 34 35 20 31 20 53  main c1 b 45 1 S
2b20: 51 4c 49 54 45 5f 45 52 52 4f 52 20 5c 0a 20 20  QLITE_ERROR \.  
2b30: 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70        "cannot op
2b40: 65 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  en foreign key c
2b50: 6f 6c 75 6d 6e 20 66 6f 72 20 77 72 69 74 69 6e  olumn for writin
2b60: 67 22 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  g"..#-----------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2bb0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2bc0: 30 38 39 34 30 2d 32 31 33 30 35 20 55 6e 6c 65  08940-21305 Unle
2bd0: 73 73 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ss it returns SQ
2be0: 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 74 68 69  LITE_MISUSE, thi
2bf0: 73 0a 23 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  s.# function set
2c00: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2c10: 6f 6e 6e 65 63 74 69 6f 6e 20 65 72 72 6f 72 20  onnection error 
2c20: 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65  code and message
2c30: 0a 23 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  .# accessible vi
2c40: 61 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  a sqlite3_errcod
2c50: 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  e() and sqlite3_
2c60: 65 72 72 6d 73 67 28 29 20 61 6e 64 20 72 65 6c  errmsg() and rel
2c70: 61 74 65 64 0a 23 20 66 75 6e 63 74 69 6f 6e 73  ated.# functions
2c80: 2e 0a 23 0a 23 20 20 20 54 68 69 73 20 72 65 71  ..#.#   This req
2c90: 75 69 72 65 6d 65 6e 74 20 69 73 20 70 61 72 74  uirement is part
2ca0: 69 61 6c 6c 79 20 76 65 72 69 66 69 65 64 20 62  ially verified b
2cb0: 79 20 74 68 65 20 6d 61 6e 79 20 75 73 65 73 20  y the many uses 
2cc0: 6f 66 20 74 65 73 74 0a 23 20 20 20 63 6f 6d 6d  of test.#   comm
2cd0: 61 6e 64 20 5b 74 65 73 74 5f 62 6c 6f 62 5f 6f  and [test_blob_o
2ce0: 70 65 6e 5d 20 61 62 6f 76 65 2e 20 41 6c 6c 20  pen] above. All 
2cf0: 74 68 61 74 20 69 73 20 6c 65 66 74 20 69 73 20  that is left is 
2d00: 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 23 20  to verify the.# 
2d10: 20 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20    SQLITE_MISUSE 
2d20: 63 61 73 65 2e 0a 23 0a 23 20 20 20 53 51 4c 49  case..#.#   SQLI
2d30: 54 45 5f 4d 49 53 55 53 45 20 69 73 20 6f 6e 6c  TE_MISUSE is onl
2d40: 79 20 72 65 74 75 72 6e 65 64 20 69 66 20 53 51  y returned if SQ
2d50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
2d60: 41 52 4d 4f 52 20 69 73 20 64 65 66 69 6e 65 64  ARMOR is defined
2d70: 0a 23 20 20 20 64 75 72 69 6e 67 20 63 6f 6d 70  .#   during comp
2d80: 69 6c 61 74 69 6f 6e 2e 0a 23 0a 69 66 63 61 70  ilation..#.ifcap
2d90: 61 62 6c 65 20 61 70 69 5f 61 72 6d 6f 72 20 7b  able api_armor {
2da0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  .  sqlite3_blob_
2db0: 6f 70 65 6e 20 64 62 20 6d 61 69 6e 20 74 31 20  open db main t1 
2dc0: 78 20 31 20 30 20 42 0a 0a 20 20 64 6f 5f 74 65  x 1 0 B..  do_te
2dd0: 73 74 20 31 30 2e 31 2e 31 20 7b 0a 20 20 20 20  st 10.1.1 {.    
2de0: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73 71 6c  list [catch {sql
2df0: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 20 24  ite3_blob_open $
2e00: 42 20 6d 61 69 6e 20 74 31 20 78 20 31 20 30 20  B main t1 x 1 0 
2e10: 42 32 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 20 20  B2} msg] $msg.  
2e20: 7d 20 7b 31 20 53 51 4c 49 54 45 5f 4d 49 53 55  } {1 SQLITE_MISU
2e30: 53 45 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31 30  SE}.  do_test 10
2e40: 2e 31 2e 32 20 7b 0a 20 20 20 20 6c 69 73 74 20  .1.2 {.    list 
2e50: 5b 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  [sqlite3_errcode
2e60: 20 64 62 5d 20 5b 73 71 6c 69 74 65 33 5f 65 72   db] [sqlite3_er
2e70: 72 6d 73 67 20 64 62 5d 0a 20 20 7d 20 7b 53 51  rmsg db].  } {SQ
2e80: 4c 49 54 45 5f 4f 4b 20 7b 6e 6f 74 20 61 6e 20  LITE_OK {not an 
2e90: 65 72 72 6f 72 7d 7d 0a 20 20 73 71 6c 69 74 65  error}}.  sqlite
2ea0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 24 42 0a  3_blob_close $B.
2eb0: 0a 20 20 64 6f 5f 74 65 73 74 20 31 30 2e 32 2e  .  do_test 10.2.
2ec0: 31 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 63 61  1 {.    list [ca
2ed0: 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 62 6c 6f  tch {sqlite3_blo
2ee0: 62 5f 6f 70 65 6e 20 64 62 20 6d 61 69 6e 20 7b  b_open db main {
2ef0: 7d 20 78 20 31 20 30 20 42 7d 20 6d 73 67 5d 20  } x 1 0 B} msg] 
2f00: 24 6d 73 67 0a 20 20 7d 20 7b 31 20 53 51 4c 49  $msg.  } {1 SQLI
2f10: 54 45 5f 4d 49 53 55 53 45 7d 0a 20 20 64 6f 5f  TE_MISUSE}.  do_
2f20: 74 65 73 74 20 31 30 2e 32 2e 32 20 7b 0a 20 20  test 10.2.2 {.  
2f30: 20 20 6c 69 73 74 20 5b 73 71 6c 69 74 65 33 5f    list [sqlite3_
2f40: 65 72 72 63 6f 64 65 20 64 62 5d 20 5b 73 71 6c  errcode db] [sql
2f50: 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62 5d 0a  ite3_errmsg db].
2f60: 20 20 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 20 7b    } {SQLITE_OK {
2f70: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 7d 0a 7d  not an error}}.}
2f80: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45  ------------.# E
2fd0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30  VIDENCE-OF: R-50
2fe0: 35 34 32 2d 36 32 35 38 39 20 49 66 20 74 68 65  542-62589 If the
2ff0: 20 72 6f 77 20 74 68 61 74 20 61 20 42 4c 4f 42   row that a BLOB
3000: 20 68 61 6e 64 6c 65 20 70 6f 69 6e 74 73 20 74   handle points t
3010: 6f 20 69 73 0a 23 20 6d 6f 64 69 66 69 65 64 20  o is.# modified 
3020: 62 79 20 61 6e 20 55 50 44 41 54 45 2c 20 44 45  by an UPDATE, DE
3030: 4c 45 54 45 2c 20 6f 72 20 62 79 20 4f 4e 20 43  LETE, or by ON C
3040: 4f 4e 46 4c 49 43 54 20 73 69 64 65 2d 65 66 66  ONFLICT side-eff
3050: 65 63 74 73 20 74 68 65 6e 20 74 68 65 0a 23 20  ects then the.# 
3060: 42 4c 4f 42 20 68 61 6e 64 6c 65 20 69 73 20 6d  BLOB handle is m
3070: 61 72 6b 65 64 20 61 73 20 22 65 78 70 69 72 65  arked as "expire
3080: 64 22 2e 20 54 68 69 73 20 69 73 20 74 72 75 65  d". This is true
3090: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   if any column o
30a0: 66 20 74 68 65 0a 23 20 72 6f 77 20 69 73 20 63  f the.# row is c
30b0: 68 61 6e 67 65 64 2c 20 65 76 65 6e 20 61 20 63  hanged, even a c
30c0: 6f 6c 75 6d 6e 20 6f 74 68 65 72 20 74 68 61 6e  olumn other than
30d0: 20 74 68 65 20 6f 6e 65 20 74 68 65 20 42 4c 4f   the one the BLO
30e0: 42 20 68 61 6e 64 6c 65 20 69 73 0a 23 20 6f 70  B handle is.# op
30f0: 65 6e 20 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45  en on..#.# EVIDE
3100: 4e 43 45 2d 4f 46 3a 20 52 2d 34 38 33 36 37 2d  NCE-OF: R-48367-
3110: 32 30 30 34 38 20 43 61 6c 6c 73 20 74 6f 20 73  20048 Calls to s
3120: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
3130: 28 29 20 61 6e 64 0a 23 20 73 71 6c 69 74 65 33  () and.# sqlite3
3140: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 20 66 6f  _blob_write() fo
3150: 72 20 61 6e 20 65 78 70 69 72 65 64 20 42 4c 4f  r an expired BLO
3160: 42 20 68 61 6e 64 6c 65 20 66 61 69 6c 20 77 69  B handle fail wi
3170: 74 68 20 61 20 72 65 74 75 72 6e 0a 23 20 63 6f  th a return.# co
3180: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 41 42 4f  de of SQLITE_ABO
3190: 52 54 2e 0a 23 0a 23 20 20 20 31 31 2e 32 3a 20  RT..#.#   11.2: 
31a0: 72 65 61 64 2d 6f 6e 6c 79 20 68 61 6e 64 6c 65  read-only handle
31b0: 2c 20 44 45 4c 45 54 45 2e 0a 23 20 20 20 31 31  , DELETE..#   11
31c0: 2e 33 3a 20 72 65 61 64 2d 6f 6e 6c 79 20 68 61  .3: read-only ha
31d0: 6e 64 6c 65 2c 20 55 50 44 41 54 45 2e 0a 23 20  ndle, UPDATE..# 
31e0: 20 20 31 31 2e 34 3a 20 72 65 61 64 2d 6f 6e 6c    11.4: read-onl
31f0: 79 20 68 61 6e 64 6c 65 2c 20 52 45 50 4c 41 43  y handle, REPLAC
3200: 45 2e 0a 23 20 20 20 31 31 2e 35 3a 20 72 65 61  E..#   11.5: rea
3210: 64 2f 77 72 69 74 65 20 68 61 6e 64 6c 65 2c 20  d/write handle, 
3220: 44 45 4c 45 54 45 2e 0a 23 20 20 20 31 31 2e 36  DELETE..#   11.6
3230: 3a 20 72 65 61 64 2f 77 72 69 74 65 20 68 61 6e  : read/write han
3240: 64 6c 65 2c 20 55 50 44 41 54 45 2e 0a 23 20 20  dle, UPDATE..#  
3250: 20 31 31 2e 37 3a 20 72 65 61 64 2f 77 72 69 74   11.7: read/writ
3260: 65 20 68 61 6e 64 6c 65 2c 20 52 45 50 4c 41 43  e handle, REPLAC
3270: 45 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  E..#.do_execsql_
3280: 74 65 73 74 20 31 31 2e 31 20 7b 0a 20 20 43 52  test 11.1 {.  CR
3290: 45 41 54 45 20 54 41 42 4c 45 20 62 31 28 61 20  EATE TABLE b1(a 
32a0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
32b0: 4b 45 59 2c 20 62 2c 20 63 20 55 4e 49 51 55 45  KEY, b, c UNIQUE
32c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
32d0: 20 62 31 20 56 41 4c 55 45 53 28 31 2c 20 27 31   b1 VALUES(1, '1
32e0: 32 33 34 35 36 37 38 39 30 27 2c 20 31 29 3b 0a  234567890', 1);.
32f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 31    INSERT INTO b1
3300: 20 56 41 4c 55 45 53 28 32 2c 20 27 31 32 33 34   VALUES(2, '1234
3310: 35 36 37 38 39 30 27 2c 20 32 29 3b 0a 20 20 49  567890', 2);.  I
3320: 4e 53 45 52 54 20 49 4e 54 4f 20 62 31 20 56 41  NSERT INTO b1 VA
3330: 4c 55 45 53 28 33 2c 20 27 31 32 33 34 35 36 37  LUES(3, '1234567
3340: 38 39 30 27 2c 20 33 29 3b 0a 20 20 49 4e 53 45  890', 3);.  INSE
3350: 52 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45  RT INTO b1 VALUE
3360: 53 28 34 2c 20 27 31 32 33 34 35 36 37 38 39 30  S(4, '1234567890
3370: 27 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 4);.  INSERT 
3380: 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 35  INTO b1 VALUES(5
3390: 2c 20 27 31 32 33 34 35 36 37 38 39 30 27 2c 20  , '1234567890', 
33a0: 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  5);.  INSERT INT
33b0: 4f 20 62 31 20 56 41 4c 55 45 53 28 36 2c 20 27  O b1 VALUES(6, '
33c0: 31 32 33 34 35 36 37 38 39 30 27 2c 20 36 29 3b  1234567890', 6);
33d0: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
33e0: 20 62 32 28 61 20 49 4e 54 45 47 45 52 20 50 52   b2(a INTEGER PR
33f0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 20  IMARY KEY, b, c 
3400: 55 4e 49 51 55 45 29 3b 0a 20 20 49 4e 53 45 52  UNIQUE);.  INSER
3410: 54 20 49 4e 54 4f 20 62 32 20 56 41 4c 55 45 53  T INTO b2 VALUES
3420: 28 31 2c 20 27 31 32 33 34 35 36 37 38 39 30 27  (1, '1234567890'
3430: 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 1);.  INSERT I
3440: 4e 54 4f 20 62 32 20 56 41 4c 55 45 53 28 32 2c  NTO b2 VALUES(2,
3450: 20 27 31 32 33 34 35 36 37 38 39 30 27 2c 20 32   '1234567890', 2
3460: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3470: 20 62 32 20 56 41 4c 55 45 53 28 33 2c 20 27 31   b2 VALUES(3, '1
3480: 32 33 34 35 36 37 38 39 30 27 2c 20 33 29 3b 0a  234567890', 3);.
3490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 32    INSERT INTO b2
34a0: 20 56 41 4c 55 45 53 28 34 2c 20 27 31 32 33 34   VALUES(4, '1234
34b0: 35 36 37 38 39 30 27 2c 20 34 29 3b 0a 20 20 49  567890', 4);.  I
34c0: 4e 53 45 52 54 20 49 4e 54 4f 20 62 32 20 56 41  NSERT INTO b2 VA
34d0: 4c 55 45 53 28 35 2c 20 27 31 32 33 34 35 36 37  LUES(5, '1234567
34e0: 38 39 30 27 2c 20 35 29 3b 0a 20 20 49 4e 53 45  890', 5);.  INSE
34f0: 52 54 20 49 4e 54 4f 20 62 32 20 56 41 4c 55 45  RT INTO b2 VALUE
3500: 53 28 36 2c 20 27 31 32 33 34 35 36 37 38 39 30  S(6, '1234567890
3510: 27 2c 20 36 29 3b 0a 7d 0a 0a 64 6f 5f 74 65 73  ', 6);.}..do_tes
3520: 74 20 31 31 2e 32 2e 31 20 7b 0a 20 20 73 71 6c  t 11.2.1 {.  sql
3530: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 20 64  ite3_blob_open d
3540: 62 20 6d 61 69 6e 20 62 31 20 62 20 32 20 30 20  b main b1 b 2 0 
3550: 42 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  B.  sqlite3_blob
3560: 5f 72 65 61 64 20 24 42 20 30 20 31 30 0a 7d 20  _read $B 0 10.} 
3570: 7b 31 32 33 34 35 36 37 38 39 30 7d 0a 64 6f 5f  {1234567890}.do_
3580: 74 65 73 74 20 31 31 2e 32 2e 32 20 7b 0a 20 20  test 11.2.2 {.  
3590: 23 20 44 65 6c 65 74 69 6e 67 20 61 20 64 69 66  # Deleting a dif
35a0: 66 65 72 65 6e 74 20 72 6f 77 20 64 6f 65 73 20  ferent row does 
35b0: 6e 6f 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  not invalidate t
35c0: 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a  he blob handle..
35d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45    execsql { DELE
35e0: 54 45 20 46 52 4f 4d 20 62 31 20 57 48 45 52 45  TE FROM b1 WHERE
35f0: 20 61 20 3d 20 31 20 7d 0a 20 20 73 71 6c 69 74   a = 1 }.  sqlit
3600: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24 42 20  e3_blob_read $B 
3610: 30 20 31 30 0a 7d 20 7b 31 32 33 34 35 36 37 38  0 10.} {12345678
3620: 39 30 7d 0a 64 6f 5f 74 65 73 74 20 31 31 2e 32  90}.do_test 11.2
3630: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
3640: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 62 31 20   DELETE FROM b1 
3650: 57 48 45 52 45 20 61 20 3d 20 32 20 7d 0a 20 20  WHERE a = 2 }.  
3660: 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71  list [catch { sq
3670: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20  lite3_blob_read 
3680: 24 42 20 30 20 31 30 20 7d 20 6d 73 67 5d 20 24  $B 0 10 } msg] $
3690: 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f  msg.} {1 SQLITE_
36a0: 41 42 4f 52 54 7d 0a 64 6f 5f 74 65 73 74 20 31  ABORT}.do_test 1
36b0: 31 2e 32 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65  1.2.4 {.  sqlite
36c0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 24 42 0a  3_blob_close $B.
36d0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 31  } {}..do_test 11
36e0: 2e 33 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .3.1 {.  sqlite3
36f0: 5f 62 6c 6f 62 5f 6f 70 65 6e 20 64 62 20 6d 61  _blob_open db ma
3700: 69 6e 20 62 31 20 62 20 33 20 30 20 42 0a 20 20  in b1 b 3 0 B.  
3710: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
3720: 64 20 24 42 20 30 20 31 30 0a 7d 20 7b 31 32 33  d $B 0 10.} {123
3730: 34 35 36 37 38 39 30 7d 0a 64 6f 5f 74 65 73 74  4567890}.do_test
3740: 20 31 31 2e 33 2e 32 20 7b 0a 20 20 23 20 55 70   11.3.2 {.  # Up
3750: 64 61 74 69 6e 67 20 61 20 64 69 66 66 65 72 65  dating a differe
3760: 6e 74 20 72 6f 77 0a 20 20 65 78 65 63 73 71 6c  nt row.  execsql
3770: 20 7b 20 55 50 44 41 54 45 20 62 31 20 53 45 54   { UPDATE b1 SET
3780: 20 63 20 3d 20 34 32 20 57 48 45 52 45 20 61 3d   c = 42 WHERE a=
3790: 34 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  4 }.  sqlite3_bl
37a0: 6f 62 5f 72 65 61 64 20 24 42 20 30 20 31 30 0a  ob_read $B 0 10.
37b0: 7d 20 7b 31 32 33 34 35 36 37 38 39 30 7d 0a 64  } {1234567890}.d
37c0: 6f 5f 74 65 73 74 20 31 31 2e 33 2e 33 20 7b 0a  o_test 11.3.3 {.
37d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41    execsql { UPDA
37e0: 54 45 20 62 31 20 53 45 54 20 63 20 3d 20 34 33  TE b1 SET c = 43
37f0: 20 57 48 45 52 45 20 61 3d 33 20 7d 0a 20 20 6c   WHERE a=3 }.  l
3800: 69 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c  ist [catch { sql
3810: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24  ite3_blob_read $
3820: 42 20 30 20 31 30 20 7d 20 6d 73 67 5d 20 24 6d  B 0 10 } msg] $m
3830: 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f 41  sg.} {1 SQLITE_A
3840: 42 4f 52 54 7d 0a 64 6f 5f 74 65 73 74 20 31 31  BORT}.do_test 11
3850: 2e 33 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65 33  .3.4 {.  sqlite3
3860: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 24 42 0a 7d  _blob_close $B.}
3870: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 31 2e   {}..do_test 11.
3880: 34 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  4.1 {.  sqlite3_
3890: 62 6c 6f 62 5f 6f 70 65 6e 20 64 62 20 6d 61 69  blob_open db mai
38a0: 6e 20 62 31 20 62 20 36 20 30 20 42 0a 20 20 73  n b1 b 6 0 B.  s
38b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
38c0: 20 24 42 20 30 20 31 30 0a 7d 20 7b 31 32 33 34   $B 0 10.} {1234
38d0: 35 36 37 38 39 30 7d 0a 64 6f 5f 74 65 73 74 20  567890}.do_test 
38e0: 31 31 2e 34 2e 32 20 7b 0a 20 20 23 20 52 65 70  11.4.2 {.  # Rep
38f0: 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
3900: 20 72 6f 77 0a 20 20 65 78 65 63 73 71 6c 20 7b   row.  execsql {
3910: 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41   INSERT OR REPLA
3920: 43 45 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45  CE INTO b1 VALUE
3930: 53 28 31 30 2c 20 27 61 62 63 64 65 66 67 68 69  S(10, 'abcdefghi
3940: 6a 27 2c 20 35 29 20 7d 0a 20 20 73 71 6c 69 74  j', 5) }.  sqlit
3950: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 24 42 20  e3_blob_read $B 
3960: 30 20 31 30 0a 7d 20 7b 31 32 33 34 35 36 37 38  0 10.} {12345678
3970: 39 30 7d 0a 64 6f 5f 74 65 73 74 20 31 31 2e 34  90}.do_test 11.4
3980: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
3990: 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41   INSERT OR REPLA
39a0: 43 45 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45  CE INTO b1 VALUE
39b0: 53 28 31 31 2c 20 27 61 62 63 64 65 66 67 68 69  S(11, 'abcdefghi
39c0: 6a 27 2c 20 36 29 20 7d 0a 20 20 6c 69 73 74 20  j', 6) }.  list 
39d0: 5b 63 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33  [catch { sqlite3
39e0: 5f 62 6c 6f 62 5f 72 65 61 64 20 24 42 20 30 20  _blob_read $B 0 
39f0: 31 30 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d  10 } msg] $msg.}
3a00: 20 7b 31 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   {1 SQLITE_ABORT
3a10: 7d 0a 64 6f 5f 74 65 73 74 20 31 31 2e 34 2e 34  }.do_test 11.4.4
3a20: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f   {.  sqlite3_blo
3a30: 62 5f 63 6c 6f 73 65 20 24 42 0a 7d 20 7b 7d 0a  b_close $B.} {}.
3a40: 0a 64 6f 5f 74 65 73 74 20 31 31 2e 34 2e 31 20  .do_test 11.4.1 
3a50: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
3a60: 5f 6f 70 65 6e 20 64 62 20 6d 61 69 6e 20 62 32  _open db main b2
3a70: 20 62 20 32 20 31 20 42 0a 20 20 73 71 6c 69 74   b 2 1 B.  sqlit
3a80: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24 42  e3_blob_write $B
3a90: 20 30 20 22 61 62 63 64 65 66 67 68 69 6a 22 0a   0 "abcdefghij".
3aa0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 31 31 2e  } {}.do_test 11.
3ab0: 34 2e 32 20 7b 0a 20 20 23 20 44 65 6c 65 74 69  4.2 {.  # Deleti
3ac0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  ng a different r
3ad0: 6f 77 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 61  ow does not inva
3ae0: 6c 69 64 61 74 65 20 74 68 65 20 62 6c 6f 62 20  lidate the blob 
3af0: 68 61 6e 64 6c 65 2e 0a 20 20 65 78 65 63 73 71  handle..  execsq
3b00: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
3b10: 62 32 20 57 48 45 52 45 20 61 20 3d 20 31 20 7d  b2 WHERE a = 1 }
3b20: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  .  sqlite3_blob_
3b30: 77 72 69 74 65 20 24 42 20 30 20 22 41 42 43 44  write $B 0 "ABCD
3b40: 45 46 47 48 49 4a 22 0a 7d 20 7b 7d 0a 64 6f 5f  EFGHIJ".} {}.do_
3b50: 74 65 73 74 20 31 31 2e 34 2e 33 20 7b 0a 20 20  test 11.4.3 {.  
3b60: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
3b70: 20 46 52 4f 4d 20 62 32 20 57 48 45 52 45 20 61   FROM b2 WHERE a
3b80: 20 3d 20 32 20 7d 0a 20 20 6c 69 73 74 20 5b 63   = 2 }.  list [c
3b90: 61 74 63 68 20 7b 20 73 71 6c 69 74 65 33 5f 62  atch { sqlite3_b
3ba0: 6c 6f 62 5f 77 72 69 74 65 20 24 42 20 30 20 22  lob_write $B 0 "
3bb0: 30 39 38 37 36 35 34 33 32 31 22 20 7d 20 6d 73  0987654321" } ms
3bc0: 67 5d 20 24 6d 73 67 0a 7d 20 7b 31 20 53 51 4c  g] $msg.} {1 SQL
3bd0: 49 54 45 5f 41 42 4f 52 54 7d 0a 64 6f 5f 74 65  ITE_ABORT}.do_te
3be0: 73 74 20 31 31 2e 34 2e 34 20 7b 0a 20 20 73 71  st 11.4.4 {.  sq
3bf0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
3c00: 20 24 42 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73   $B.} {}..do_tes
3c10: 74 20 31 31 2e 35 2e 31 20 7b 0a 20 20 73 71 6c  t 11.5.1 {.  sql
3c20: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 20 64  ite3_blob_open d
3c30: 62 20 6d 61 69 6e 20 62 32 20 62 20 33 20 31 20  b main b2 b 3 1 
3c40: 42 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  B.  sqlite3_blob
3c50: 5f 77 72 69 74 65 20 24 42 20 30 20 22 61 62 63  _write $B 0 "abc
3c60: 64 65 66 67 68 69 6a 22 0a 7d 20 7b 7d 0a 64 6f  defghij".} {}.do
3c70: 5f 74 65 73 74 20 31 31 2e 35 2e 32 20 7b 0a 20  _test 11.5.2 {. 
3c80: 20 23 20 55 70 64 61 74 69 6e 67 20 61 20 64 69   # Updating a di
3c90: 66 66 65 72 65 6e 74 20 72 6f 77 0a 20 20 65 78  fferent row.  ex
3ca0: 65 63 73 71 6c 20 7b 20 55 50 44 41 54 45 20 62  ecsql { UPDATE b
3cb0: 32 20 53 45 54 20 63 20 3d 20 34 32 20 57 48 45  2 SET c = 42 WHE
3cc0: 52 45 20 61 3d 34 20 7d 0a 20 20 73 71 6c 69 74  RE a=4 }.  sqlit
3cd0: 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24 42  e3_blob_write $B
3ce0: 20 30 20 22 41 42 43 44 45 46 47 48 49 4a 22 0a   0 "ABCDEFGHIJ".
3cf0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 31 31 2e  } {}.do_test 11.
3d00: 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.3 {.  execsql 
3d10: 7b 20 55 50 44 41 54 45 20 62 32 20 53 45 54 20  { UPDATE b2 SET 
3d20: 63 20 3d 20 34 33 20 57 48 45 52 45 20 61 3d 33  c = 43 WHERE a=3
3d30: 20 7d 0a 20 20 6c 69 73 74 20 5b 63 61 74 63 68   }.  list [catch
3d40: 20 7b 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   { sqlite3_blob_
3d50: 77 72 69 74 65 20 24 42 20 30 20 22 30 39 38 37  write $B 0 "0987
3d60: 36 35 34 33 32 31 22 20 7d 20 6d 73 67 5d 20 24  654321" } msg] $
3d70: 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f  msg.} {1 SQLITE_
3d80: 41 42 4f 52 54 7d 0a 64 6f 5f 74 65 73 74 20 31  ABORT}.do_test 1
3d90: 31 2e 35 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65  1.5.4 {.  sqlite
3da0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 24 42 0a  3_blob_close $B.
3db0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 31  } {}..do_test 11
3dc0: 2e 36 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .6.1 {.  sqlite3
3dd0: 5f 62 6c 6f 62 5f 6f 70 65 6e 20 64 62 20 6d 61  _blob_open db ma
3de0: 69 6e 20 62 32 20 62 20 36 20 31 20 42 0a 20 20  in b2 b 6 1 B.  
3df0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
3e00: 74 65 20 24 42 20 30 20 22 61 62 63 64 65 66 67  te $B 0 "abcdefg
3e10: 68 69 6a 22 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  hij".} {}.do_tes
3e20: 74 20 31 31 2e 36 2e 32 20 7b 0a 20 20 23 20 52  t 11.6.2 {.  # R
3e30: 65 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65  eplace a differe
3e40: 6e 74 20 72 6f 77 0a 20 20 65 78 65 63 73 71 6c  nt row.  execsql
3e50: 20 7b 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50   { INSERT OR REP
3e60: 4c 41 43 45 20 49 4e 54 4f 20 62 32 20 56 41 4c  LACE INTO b2 VAL
3e70: 55 45 53 28 31 30 2c 20 27 61 62 63 64 65 66 67  UES(10, 'abcdefg
3e80: 68 69 6a 27 2c 20 35 29 20 7d 0a 20 20 73 71 6c  hij', 5) }.  sql
3e90: 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20  ite3_blob_write 
3ea0: 24 42 20 30 20 22 41 42 43 44 45 46 47 48 49 4a  $B 0 "ABCDEFGHIJ
3eb0: 22 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 31  ".} {}.do_test 1
3ec0: 31 2e 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  1.6.3 {.  execsq
3ed0: 6c 20 7b 20 49 4e 53 45 52 54 20 4f 52 20 52 45  l { INSERT OR RE
3ee0: 50 4c 41 43 45 20 49 4e 54 4f 20 62 32 20 56 41  PLACE INTO b2 VA
3ef0: 4c 55 45 53 28 31 31 2c 20 27 61 62 63 64 65 66  LUES(11, 'abcdef
3f00: 67 68 69 6a 27 2c 20 36 29 20 7d 0a 20 20 6c 69  ghij', 6) }.  li
3f10: 73 74 20 5b 63 61 74 63 68 20 7b 20 73 71 6c 69  st [catch { sqli
3f20: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24  te3_blob_write $
3f30: 42 20 30 20 22 30 39 38 37 36 35 34 33 32 31 22  B 0 "0987654321"
3f40: 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b   } msg] $msg.} {
3f50: 31 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 7d 0a  1 SQLITE_ABORT}.
3f60: 64 6f 5f 74 65 73 74 20 31 31 2e 36 2e 34 20 7b  do_test 11.6.4 {
3f70: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  .  sqlite3_blob_
3f80: 63 6c 6f 73 65 20 24 42 0a 7d 20 7b 7d 0a 0a 23  close $B.} {}..#
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
3fe0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 35 34 30 38  ENCE-OF: R-45408
3ff0: 2d 34 30 36 39 34 20 43 68 61 6e 67 65 73 20 77  -40694 Changes w
4000: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 42 4c  ritten into a BL
4010: 4f 42 20 70 72 69 6f 72 20 74 6f 20 74 68 65 0a  OB prior to the.
4020: 23 20 42 4c 4f 42 20 65 78 70 69 72 69 6e 67 20  # BLOB expiring 
4030: 61 72 65 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62  are not rolled b
4040: 61 63 6b 20 62 79 20 74 68 65 20 65 78 70 69 72  ack by the expir
4050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 42 4c 4f  ation of the BLO
4060: 42 2e 20 53 75 63 68 0a 23 20 63 68 61 6e 67 65  B. Such.# change
4070: 73 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  s will eventuall
4080: 79 20 63 6f 6d 6d 69 74 20 69 66 20 74 68 65 20  y commit if the 
4090: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6e 74  transaction cont
40a0: 69 6e 75 65 73 20 74 6f 0a 23 20 63 6f 6d 70 6c  inues to.# compl
40b0: 65 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63  etion..#.do_exec
40c0: 73 71 6c 5f 74 65 73 74 20 31 32 2e 31 20 7b 0a  sql_test 12.1 {.
40d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 62    CREATE TABLE b
40e0: 33 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  3(x INTEGER PRIM
40f0: 41 52 59 20 4b 45 59 2c 20 79 20 54 45 58 54 2c  ARY KEY, y TEXT,
4100: 20 7a 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49   z INTEGER);.  I
4110: 4e 53 45 52 54 20 49 4e 54 4f 20 62 33 20 56 41  NSERT INTO b3 VA
4120: 4c 55 45 53 28 32 32 2c 20 27 2e 2e 2e 2e 2e 2e  LUES(22, '......
4130: 2e 2e 2e 2e 27 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a  ....', NULL);.}.
4140: 64 6f 5f 74 65 73 74 20 31 32 2e 32 20 7b 0a 20  do_test 12.2 {. 
4150: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
4160: 65 6e 20 64 62 20 6d 61 69 6e 20 62 33 20 79 20  en db main b3 y 
4170: 32 32 20 31 20 42 0a 20 20 73 71 6c 69 74 65 33  22 1 B.  sqlite3
4180: 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24 42 20 30  _blob_write $B 0
4190: 20 22 78 78 78 78 78 22 20 35 0a 7d 20 7b 7d 0a   "xxxxx" 5.} {}.
41a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
41b0: 31 32 2e 33 20 7b 0a 20 20 55 50 44 41 54 45 20  12.3 {.  UPDATE 
41c0: 62 33 20 53 45 54 20 7a 20 3d 20 27 6e 6f 74 20  b3 SET z = 'not 
41d0: 6e 75 6c 6c 27 3b 0a 7d 0a 64 6f 5f 74 65 73 74  null';.}.do_test
41e0: 20 31 32 2e 34 20 7b 0a 20 20 6c 69 73 74 20 5b   12.4 {.  list [
41f0: 63 61 74 63 68 20 7b 73 71 6c 69 74 65 33 5f 62  catch {sqlite3_b
4200: 6c 6f 62 5f 77 72 69 74 65 20 24 42 20 35 20 22  lob_write $B 5 "
4210: 78 78 78 78 78 22 20 35 7d 20 6d 73 67 5d 20 24  xxxxx" 5} msg] $
4220: 6d 73 67 0a 7d 20 7b 31 20 53 51 4c 49 54 45 5f  msg.} {1 SQLITE_
4230: 41 42 4f 52 54 7d 0a 64 6f 5f 65 78 65 63 73 71  ABORT}.do_execsq
4240: 6c 5f 74 65 73 74 20 31 32 2e 35 20 7b 0a 20 20  l_test 12.5 {.  
4250: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 62 33  SELECT * FROM b3
4260: 3b 0a 7d 20 7b 32 32 20 78 78 78 78 78 2e 2e 2e  ;.} {22 xxxxx...
4270: 2e 2e 20 7b 6e 6f 74 20 6e 75 6c 6c 7d 7d 0a 64  .. {not null}}.d
4280: 6f 5f 74 65 73 74 20 31 32 2e 35 20 7b 0a 20 20  o_test 12.5 {.  
4290: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
42a0: 73 65 20 24 42 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  se $B.} {}.do_ex
42b0: 65 63 73 71 6c 5f 74 65 73 74 20 31 32 2e 36 20  ecsql_test 12.6 
42c0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
42d0: 4d 20 62 33 3b 0a 7d 20 7b 32 32 20 78 78 78 78  M b3;.} {22 xxxx
42e0: 78 2e 2e 2e 2e 2e 20 7b 6e 6f 74 20 6e 75 6c 6c  x..... {not null
42f0: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4340: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4350: 35 38 38 31 33 2d 35 35 30 33 36 20 54 68 65 20  58813-55036 The 
4360: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
4370: 6f 62 6c 6f 62 28 29 20 61 6e 64 0a 23 20 73 71  oblob() and.# sq
4380: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 7a 65 72  lite3_result_zer
4390: 6f 62 6c 6f 62 28 29 20 69 6e 74 65 72 66 61 63  oblob() interfac
43a0: 65 73 20 61 6e 64 20 74 68 65 20 62 75 69 6c 74  es and the built
43b0: 2d 69 6e 20 7a 65 72 6f 62 6c 6f 62 20 53 51 4c  -in zeroblob SQL
43c0: 0a 23 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  .# function may 
43d0: 62 65 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  be used to creat
43e0: 65 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  e a zero-filled 
43f0: 62 6c 6f 62 20 74 6f 20 72 65 61 64 20 6f 72 20  blob to read or 
4400: 77 72 69 74 65 0a 23 20 75 73 69 6e 67 20 74 68  write.# using th
4410: 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 62 6c  e incremental-bl
4420: 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 0a 23 0a  ob interface..#.
4430: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4440: 31 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  13.1 {.  CREATE 
4450: 54 41 42 4c 45 20 63 32 28 69 20 49 4e 54 45 47  TABLE c2(i INTEG
4460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
4470: 6a 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  j);.  INSERT INT
4480: 4f 20 63 32 20 56 41 4c 55 45 53 28 31 30 2c 20  O c2 VALUES(10, 
4490: 7a 65 72 6f 62 6c 6f 62 28 32 34 29 29 3b 0a 7d  zeroblob(24));.}
44a0: 0a 0a 64 6f 5f 74 65 73 74 20 31 33 2e 32 20 7b  ..do_test 13.2 {
44b0: 0a 20 20 73 65 74 20 73 74 6d 74 20 5b 73 71 6c  .  set stmt [sql
44c0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
44d0: 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  db "INSERT INTO 
44e0: 63 32 20 56 41 4c 55 45 53 28 31 31 2c 20 3f 29  c2 VALUES(11, ?)
44f0: 22 20 2d 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f  " -1].  sqlite3_
4500: 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 24 73  bind_zeroblob $s
4510: 74 6d 74 20 31 20 34 35 0a 20 20 73 71 6c 69 74  tmt 1 45.  sqlit
4520: 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 20 20  e3_step $stmt.  
4530: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4540: 20 24 73 74 6d 74 0a 7d 20 7b 53 51 4c 49 54 45   $stmt.} {SQLITE
4550: 5f 4f 4b 7d 0a 0a 23 20 54 68 65 20 62 6c 6f 62  _OK}..# The blob
4560: 73 20 63 61 6e 20 62 65 20 72 65 61 64 3a 0a 23  s can be read:.#
4570: 0a 64 6f 5f 74 65 73 74 20 31 33 2e 33 2e 31 20  .do_test 13.3.1 
4580: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
4590: 5f 6f 70 65 6e 20 64 62 20 6d 61 69 6e 20 63 32  _open db main c2
45a0: 20 6a 20 31 30 20 31 20 42 0a 20 20 73 71 6c 69   j 10 1 B.  sqli
45b0: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 20 64 62  te3_blob_open db
45c0: 20 6d 61 69 6e 20 63 32 20 6a 20 31 31 20 31 20   main c2 j 11 1 
45d0: 42 32 0a 20 20 6c 69 73 74 20 5b 73 71 6c 69 74  B2.  list [sqlit
45e0: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 20 24 42  e3_blob_bytes $B
45f0: 5d 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ] [sqlite3_blob_
4600: 62 79 74 65 73 20 24 42 32 5d 0a 7d 20 7b 32 34  bytes $B2].} {24
4610: 20 34 35 7d 0a 64 6f 5f 74 65 73 74 20 31 33 2e   45}.do_test 13.
4620: 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  3.2 {.  sqlite3_
4630: 62 6c 6f 62 5f 72 65 61 64 20 24 42 20 30 20 32  blob_read $B 0 2
4640: 34 0a 7d 20 5b 73 74 72 69 6e 67 20 72 65 70 65  4.} [string repe
4650: 61 74 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61  at [binary forma
4660: 74 20 63 20 30 5d 20 32 34 5d 0a 64 6f 5f 74 65  t c 0] 24].do_te
4670: 73 74 20 31 33 2e 33 2e 33 20 7b 0a 20 20 73 71  st 13.3.3 {.  sq
4680: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20  lite3_blob_read 
4690: 24 42 32 20 30 20 34 35 0a 7d 20 5b 73 74 72 69  $B2 0 45.} [stri
46a0: 6e 67 20 72 65 70 65 61 74 20 5b 62 69 6e 61 72  ng repeat [binar
46b0: 79 20 66 6f 72 6d 61 74 20 63 20 30 5d 20 34 35  y format c 0] 45
46c0: 5d 0a 0a 23 20 41 6e 64 20 61 6c 73 6f 20 77 72  ]..# And also wr
46d0: 69 74 74 65 6e 3a 0a 23 0a 64 6f 5f 74 65 73 74  itten:.#.do_test
46e0: 20 31 33 2e 34 2e 31 20 7b 0a 20 20 73 71 6c 69   13.4.1 {.  sqli
46f0: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 24  te3_blob_write $
4700: 42 20 30 20 5b 73 74 72 69 6e 67 20 72 65 70 65  B 0 [string repe
4710: 61 74 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61  at [binary forma
4720: 74 20 63 20 31 5d 20 32 34 5d 0a 7d 20 7b 7d 0a  t c 1] 24].} {}.
4730: 64 6f 5f 74 65 73 74 20 31 33 2e 34 2e 32 20 7b  do_test 13.4.2 {
4740: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  .  sqlite3_blob_
4750: 77 72 69 74 65 20 24 42 32 20 30 20 5b 73 74 72  write $B2 0 [str
4760: 69 6e 67 20 72 65 70 65 61 74 20 5b 62 69 6e 61  ing repeat [bina
4770: 72 79 20 66 6f 72 6d 61 74 20 63 20 31 5d 20 34  ry format c 1] 4
4780: 35 5d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20  5].} {}.do_test 
4790: 31 33 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33  13.5 {.  sqlite3
47a0: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 24 42 0a 20  _blob_close $B. 
47b0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
47c0: 6f 73 65 20 24 42 32 0a 20 20 65 78 65 63 73 71  ose $B2.  execsq
47d0: 6c 20 7b 20 53 45 4c 45 43 54 20 6a 20 46 52 4f  l { SELECT j FRO
47e0: 4d 20 63 32 20 7d 0a 7d 20 5b 6c 69 73 74 20 5c  M c2 }.} [list \
47f0: 0a 20 20 20 20 5b 73 74 72 69 6e 67 20 72 65 70  .    [string rep
4800: 65 61 74 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  eat [binary form
4810: 61 74 20 63 20 31 5d 20 32 34 5d 20 5c 0a 20 20  at c 1] 24] \.  
4820: 20 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74    [string repeat
4830: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
4840: 63 20 31 5d 20 34 35 5d 20 5c 0a 5d 0a 0a 0a 66  c 1] 45] \.]...f
4850: 69 6e 69 73 68 5f 74 65 73 74 0a 0a              inish_test..