/ Hex Artifact Content
Login

Artifact b2551a9b5573232db5f66f292307c37067937239:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4f 63 74 6f 62  /*.** 2014 Octob
0010: 65 72 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 30.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c  ****.**.*/.#incl
0180: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0190: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
01a0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
01b0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
01c0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
01d0: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
01e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
01f0: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 2f 2a 20  IT_INCRBLOB../* 
0200: 54 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  These functions 
0210: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
0220: 69 6e 20 6d 61 69 6e 2e 63 2e 20 2a 2f 0a 65 78  in main.c. */.ex
0230: 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61 72 20  tern const char 
0240: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
0250: 69 6e 74 29 3b 0a 0a 2f 2a 20 46 72 6f 6d 20 74  int);../* From t
0260: 65 73 74 31 2e 63 3a 20 2a 2f 0a 65 78 74 65 72  est1.c: */.exter
0270: 6e 20 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74  n int getDbPoint
0280: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  er(Tcl_Interp *i
0290: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61  nterp, const cha
02a0: 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a  r *zA, sqlite3 *
02b0: 2a 70 70 44 62 29 3b 0a 65 78 74 65 72 6e 20 76  *ppDb);.extern v
02c0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74  oid *sqlite3Test
02d0: 54 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20  TextToPtr(const 
02e0: 63 68 61 72 20 2a 7a 29 3b 0a 0a 2f 2a 0a 2a 2a  char *z);../*.**
02f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0300: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
0310: 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20  ntaining a text 
0320: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
0330: 66 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  f the.** pointer
0340: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
0350: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  nly argument. Th
0360: 65 20 6f 72 69 67 69 6e 61 6c 20 70 6f 69 6e 74  e original point
0370: 65 72 20 6d 61 79 20 62 65 20 65 78 74 72 61 63  er may be extrac
0380: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
0390: 74 65 78 74 20 75 73 69 6e 67 20 73 71 6c 69 74  text using sqlit
03a0: 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
03b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
03c0: 72 20 2a 70 74 72 54 6f 54 65 78 74 28 76 6f 69  r *ptrToText(voi
03d0: 64 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  d *p){.  static 
03e0: 63 68 61 72 20 62 75 66 5b 31 30 30 5d 3b 0a 20  char buf[100];. 
03f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
0400: 66 28 73 69 7a 65 6f 66 28 62 75 66 29 2d 31 2c  f(sizeof(buf)-1,
0410: 20 62 75 66 2c 20 22 25 70 22 2c 20 70 29 3b 0a   buf, "%p", p);.
0420: 20 20 72 65 74 75 72 6e 20 62 75 66 3b 0a 7d 0a    return buf;.}.
0430: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
0440: 6f 20 65 78 74 72 61 63 74 20 61 20 62 6c 6f 62  o extract a blob
0450: 20 68 61 6e 64 6c 65 20 28 74 79 70 65 20 73 71   handle (type sq
0460: 6c 69 74 65 33 5f 62 6c 6f 62 2a 29 20 66 72 6f  lite3_blob*) fro
0470: 6d 20 74 68 65 20 54 63 6c 0a 2a 2a 20 6f 62 6a  m the Tcl.** obj
0480: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
0490: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
04a0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
04b0: 2c 20 73 65 74 20 2a 70 70 42 6c 6f 62 20 74 6f  , set *ppBlob to
04c0: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
04d0: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 61 6e 64   blob handle and
04e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 2e 20   return TCL_OK. 
04f0: 4f 74 68 65 72 77 69 73 65 2c 20 73 74 6f 72 65  Otherwise, store
0500: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73   an error.** mes
0510: 73 61 67 65 20 69 6e 20 74 68 65 20 74 63 6c 20  sage in the tcl 
0520: 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20  interpreter and 
0530: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0540: 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  . The final valu
0550: 65 0a 2a 2a 20 6f 66 20 2a 70 70 42 6c 6f 62 20  e.** of *ppBlob 
0560: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
0570: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
0580: 20 49 66 20 74 68 65 20 6f 62 6a 65 63 74 20 63   If the object c
0590: 6f 6e 74 61 69 6e 73 20 61 20 73 74 72 69 6e 67  ontains a string
05a0: 20 74 68 61 74 20 62 65 67 69 6e 73 20 77 69 74   that begins wit
05b0: 68 20 22 69 6e 63 72 62 6c 6f 62 5f 22 2c 20 74  h "incrblob_", t
05c0: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 61 73 73  hen it.** is ass
05d0: 75 6d 65 64 20 74 6f 20 62 65 20 74 68 65 20 6e  umed to be the n
05e0: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 63 68 61  ame of a Tcl cha
05f0: 6e 6e 65 6c 20 6f 70 65 6e 65 64 20 75 73 69 6e  nnel opened usin
0600: 67 20 74 68 65 20 5b 64 62 20 69 6e 63 72 62 6c  g the [db incrbl
0610: 6f 62 5d 20 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20  ob] .** command 
0620: 28 73 65 65 20 74 63 6c 73 71 6c 69 74 65 2e 63  (see tclsqlite.c
0630: 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ). Otherwise, it
0640: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62   is assumed to b
0650: 65 20 61 20 70 6f 69 6e 74 65 72 20 0a 2a 2a 20  e a pointer .** 
0660: 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 74 68  encoded using th
0670: 65 20 70 74 72 54 6f 54 65 78 74 28 29 20 72 6f  e ptrToText() ro
0680: 75 74 69 6e 65 20 6f 72 20 73 69 6d 69 6c 61 72  utine or similar
0690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
06a0: 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62  blobHandleFromOb
06b0: 6a 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  j(.  Tcl_Interp 
06c0: 2a 69 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f  *interp, .  Tcl_
06d0: 4f 62 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c  Obj *pObj,.  sql
06e0: 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c  ite3_blob **ppBl
06f0: 6f 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  ob.){.  char *z;
0700: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d  .  int n;..  z =
0710: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
0720: 6f 6d 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b  omObj(pObj, &n);
0730: 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
0740: 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a     *ppBlob = 0;.
0750: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 39 20    }else if( n>9 
0760: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 6e  && 0==memcmp("in
0770: 63 72 62 6c 6f 62 5f 22 2c 20 7a 2c 20 39 29 20  crblob_", z, 9) 
0780: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  ){.    int notUs
0790: 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ed;.    Tcl_Chan
07a0: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20  nel channel;.   
07b0: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
07c0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20  anceData;.    . 
07d0: 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c     channel = Tcl
07e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
07f0: 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29  rp, z, &notUsed)
0800: 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e  ;.    if( !chann
0810: 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  el ) return TCL_
0820: 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f  ERROR;..    Tcl_
0830: 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a  Flush(channel);.
0840: 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61      Tcl_Seek(cha
0850: 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45  nnel, 0, SEEK_SE
0860: 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63  T);..    instanc
0870: 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43  eData = Tcl_GetC
0880: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
0890: 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20  ta(channel);.   
08a0: 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71   *ppBlob = *((sq
08b0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e  lite3_blob **)in
08c0: 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d  stanceData);.  }
08d0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 42 6c 6f  else{.    *ppBlo
08e0: 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 62 6c 6f  b = (sqlite3_blo
08f0: 62 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  b*)sqlite3TestTe
0900: 78 74 54 6f 50 74 72 28 7a 29 3b 0a 20 20 7d 0a  xtToPtr(z);.  }.
0910: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
0920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
0930: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 29 2c  Tcl_GetString(),
0940: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20   except that if 
0950: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 30 20  the string is 0 
0960: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
0970: 0a 2a 2a 20 4e 55 4c 4c 20 50 6f 69 6e 74 65 72  .** NULL Pointer
0980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
0990: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 62 6c  .static char *bl
09a0: 6f 62 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  obStringFromObj(
09b0: 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 29 7b 0a  Tcl_Obj *pObj){.
09c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
09d0: 2a 7a 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65  *z;.  z = Tcl_Ge
09e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
09f0: 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 72 65 74 75  Obj, &n);.  retu
0a00: 72 6e 20 28 6e 20 3f 20 7a 20 3a 20 30 29 3b 0a  rn (n ? z : 0);.
0a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
0a20: 5f 62 6c 6f 62 5f 6f 70 65 6e 20 44 42 20 44 41  _blob_open DB DA
0a30: 54 41 42 41 53 45 20 54 41 42 4c 45 20 43 4f 4c  TABASE TABLE COL
0a40: 55 4d 4e 20 52 4f 57 49 44 20 46 4c 41 47 53 20  UMN ROWID FLAGS 
0a50: 56 41 52 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 63  VARNAME.**.** Tc
0a60: 6c 20 74 65 73 74 20 68 61 72 6e 65 73 73 20 66  l test harness f
0a70: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  or the sqlite3_b
0a80: 6c 6f 62 5f 6f 70 65 6e 28 29 20 66 75 6e 63 74  lob_open() funct
0a90: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
0aa0: 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 6f 70 65  nt test_blob_ope
0ab0: 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  n(.  ClientData 
0ac0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
0ad0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
0ae0: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
0af0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20   *interp,       
0b00: 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 69 6e 67        /* Calling
0b10: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
0b20: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0b50: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
0b60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
0b70: 20 6f 62 6a 76 5b 5d 20 20 20 20 20 20 20 20 20   objv[]         
0b80: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
0b90: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
0ba0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
0bb0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
0bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
0bd0: 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
0be0: 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 54 63  r *zColumn;.  Tc
0bf0: 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77 69 64  l_WideInt iRowid
0c00: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20  ;.  int flags;. 
0c10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
0c20: 72 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 56 61  rname;.  int nVa
0c30: 72 6e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65  rname;..  sqlite
0c40: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20  3_blob *pBlob = 
0c50: 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 2a 29 30  (sqlite3_blob*)0
0c60: 78 46 46 46 46 46 46 46 46 3b 0a 20 20 69 6e 74  xFFFFFFFF;.  int
0c70: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
0c80: 21 3d 38 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=8 ){.    const
0c90: 20 63 68 61 72 20 2a 7a 55 73 61 67 65 20 3d 20   char *zUsage = 
0ca0: 22 44 42 20 44 41 54 41 42 41 53 45 20 54 41 42  "DB DATABASE TAB
0cb0: 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 20  LE COLUMN ROWID 
0cc0: 46 4c 41 47 53 20 56 41 52 4e 41 4d 45 22 3b 0a  FLAGS VARNAME";.
0cd0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
0ce0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
0cf0: 6f 62 6a 76 2c 20 7a 55 73 61 67 65 29 3b 0a 20  objv, zUsage);. 
0d00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0d10: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
0d20: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
0d30: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
0d40: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
0d50: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
0d60: 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c  ROR;.  zDb = Tcl
0d70: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
0d80: 32 5d 29 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20  2]);.  zTable = 
0d90: 62 6c 6f 62 53 74 72 69 6e 67 46 72 6f 6d 4f 62  blobStringFromOb
0da0: 6a 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43  j(objv[3]);.  zC
0db0: 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53  olumn = Tcl_GetS
0dc0: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
0dd0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
0de0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
0df0: 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 69 52  rp, objv[5], &iR
0e00: 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54  owid) ) return T
0e10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
0e20: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
0e30: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 36  j(interp, objv[6
0e40: 5d 2c 20 26 66 6c 61 67 73 29 20 29 20 72 65 74  ], &flags) ) ret
0e50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0e60: 20 7a 56 61 72 6e 61 6d 65 20 3d 20 54 63 6c 5f   zVarname = Tcl_
0e70: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
0e80: 28 6f 62 6a 76 5b 37 5d 2c 20 26 6e 56 61 72 6e  (objv[7], &nVarn
0e90: 61 6d 65 29 3b 0a 0a 20 20 69 66 28 20 6e 56 61  ame);..  if( nVa
0ea0: 72 6e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 72  rname>0 ){.    r
0eb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
0ec0: 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a  _open(db, zDb, z
0ed0: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
0ee0: 69 52 6f 77 69 64 2c 20 66 6c 61 67 73 2c 20 26  iRowid, flags, &
0ef0: 70 42 6c 6f 62 29 3b 0a 20 20 20 20 54 63 6c 5f  pBlob);.    Tcl_
0f00: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 7a  SetVar(interp, z
0f10: 56 61 72 6e 61 6d 65 2c 20 70 74 72 54 6f 54 65  Varname, ptrToTe
0f20: 78 74 28 70 42 6c 6f 62 29 2c 20 30 29 3b 0a 20  xt(pBlob), 0);. 
0f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
0f40: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
0f50: 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62  en(db, zDb, zTab
0f60: 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f  le, zColumn, iRo
0f70: 77 69 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  wid, flags, 0);.
0f80: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
0f90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0fa0: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
0fb0: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 65 6c 73 65  interp);.  }else
0fc0: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
0fd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
0fe0: 72 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  r*)sqlite3ErrNam
0ff0: 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  e(rc), TCL_VOLAT
1000: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
1010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1020: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1030: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  .}.../*.** sqlit
1040: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 20 48  e3_blob_close  H
1050: 41 4e 44 4c 45 0a 2a 2f 0a 73 74 61 74 69 63 20  ANDLE.*/.static 
1060: 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c  int test_blob_cl
1070: 6f 73 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ose(.  ClientDat
1080: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
1090: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
10a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
10c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
10d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
10e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
10f0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
1100: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1110: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
1120: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1130: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
1140: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
1150: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
1160: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
1170: 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
1180: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1190: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11a0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 48 41 4e  p, 1, objv, "HAN
11b0: 44 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  DLE");.    retur
11c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11d0: 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64  ..  if( blobHand
11e0: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
11f0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f  , objv[1], &pBlo
1200: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1210: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1220: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
1230: 28 70 42 6c 6f 62 29 3b 0a 0a 20 20 69 66 28 20  (pBlob);..  if( 
1240: 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  rc ){.    Tcl_Se
1250: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1260: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 45 72  (char*)sqlite3Er
1270: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
1280: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 65 6c 73  OLATILE);.  }els
1290: 65 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  e{.    Tcl_Reset
12a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
12b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
12c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  _OK;.}../*.** sq
12d0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
12e0: 20 20 48 41 4e 44 4c 45 0a 2a 2f 0a 73 74 61 74    HANDLE.*/.stat
12f0: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
1300: 5f 62 79 74 65 73 28 0a 20 20 43 6c 69 65 6e 74  _bytes(.  Client
1310: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
1320: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
1330: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1340: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1350: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1360: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1370: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1380: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
1390: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13a0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
13b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13c0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
13d0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
13e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  .){.  sqlite3_bl
13f0: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
1400: 20 6e 42 79 74 65 3b 0a 20 20 0a 20 20 69 66 28   nByte;.  .  if(
1410: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1420: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1430: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1440: 2c 20 22 48 41 4e 44 4c 45 22 29 3b 0a 20 20 20  , "HANDLE");.   
1450: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1460: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
1470: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
1480: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
1490: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
14a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 6e  n TCL_ERROR;.  n
14b0: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
14c0: 6c 6f 62 5f 62 79 74 65 73 28 70 42 6c 6f 62 29  lob_bytes(pBlob)
14d0: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
14e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
14f0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65  _NewIntObj(nByte
1500: 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  ));..  return TC
1510: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73  L_OK;.}../*.** s
1520: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
1530: 20 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54    CHANNEL OFFSET
1540: 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20   N.**.**   This 
1550: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
1560: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
1570: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 20  te3_blob_read() 
1580: 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a 20  in ways that.** 
1590: 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e 65    the Tcl channe
15a0: 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73  l interface does
15b0: 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74 20   not. The first 
15c0: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a  argument should.
15d0: 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d 65  **   be the name
15e0: 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61 6e   of a valid chan
15f0: 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20 74  nel created by t
1600: 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65  he [incrblob] me
1610: 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64  thod.**   of a d
1620: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
1630: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
1640: 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  lls sqlite3_blob
1650: 5f 72 65 61 64 28 29 0a 2a 2a 20 20 20 74 6f 20  _read().**   to 
1660: 72 65 61 64 20 4e 20 62 79 74 65 73 20 66 72 6f  read N bytes fro
1670: 6d 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54 20  m offset OFFSET 
1680: 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  from the underly
1690: 69 6e 67 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20  ing SQLite.**   
16a0: 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a  blob handle..**.
16b0: 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73 2c  **   On success,
16c0: 20 61 20 62 79 74 65 2d 61 72 72 61 79 20 6f 62   a byte-array ob
16d0: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ject containing 
16e0: 74 68 65 20 72 65 61 64 20 64 61 74 61 20 69 73  the read data is
16f0: 20 0a 2a 2a 20 20 20 72 65 74 75 72 6e 65 64 2e   .**   returned.
1700: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
1710: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73   interpreter res
1720: 75 6c 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  ult is set to th
1730: 65 0a 2a 2a 20 20 20 74 65 78 74 20 72 65 70 72  e.**   text repr
1740: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1750: 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  e returned error
1760: 20 63 6f 64 65 20 28 69 2e 65 2e 20 22 53 51 4c   code (i.e. "SQL
1770: 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20  ITE_NOMEM").**  
1780: 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70   and a Tcl excep
1790: 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a  tion is thrown..
17a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17b0: 73 74 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20  st_blob_read(.  
17c0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
17d0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
17e0: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
17f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1800: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1810: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1820: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1830: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1850: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1860: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
1870: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
1880: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
1890: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
18a0: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b  te3_blob *pBlob;
18b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
18c0: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 75  int iOffset;.  u
18d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42  nsigned char *zB
18e0: 75 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  uf = 0;.  int rc
18f0: 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
1900: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
1910: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1920: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41  p, 1, objv, "CHA
1930: 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b  NNEL OFFSET N");
1940: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1950: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1960: 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d  ( blobHandleFrom
1970: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1980: 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72  [1], &pBlob) ) r
1990: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19a0: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
19b0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
19c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
19d0: 2c 20 26 69 4f 66 66 73 65 74 29 0a 20 20 20 7c  , &iOffset).   |
19e0: 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  | TCL_OK!=Tcl_Ge
19f0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1a00: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42  rp, objv[3], &nB
1a10: 79 74 65 29 0a 20 20 29 7b 20 0a 20 20 20 20 72  yte).  ){ .    r
1a20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 42 79 74  .  }..  if( nByt
1a40: 65 3e 30 20 29 7b 0a 20 20 20 20 7a 42 75 66 20  e>0 ){.    zBuf 
1a50: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
1a60: 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79   *)Tcl_Alloc(nBy
1a70: 74 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  te);.  }.  rc = 
1a80: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
1a90: 64 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e  d(pBlob, zBuf, n
1aa0: 42 79 74 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a  Byte, iOffset);.
1ab0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ac0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
1ad0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1ae0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
1af0: 72 72 61 79 4f 62 6a 28 7a 42 75 66 2c 20 6e 42  rrayObj(zBuf, nB
1b00: 79 74 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yte));.  }else{.
1b10: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1b20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1b30: 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  *)sqlite3ErrName
1b40: 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (rc), TCL_VOLATI
1b50: 4c 45 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  LE);.  }.  Tcl_F
1b60: 72 65 65 28 28 63 68 61 72 20 2a 29 7a 42 75 66  ree((char *)zBuf
1b70: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  );..  return (rc
1b80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43  ==SQLITE_OK ? TC
1b90: 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
1ba0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  );.}../*.** sqli
1bb0: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 20 48  te3_blob_write H
1bc0: 41 4e 44 4c 45 20 4f 46 46 53 45 54 20 44 41 54  ANDLE OFFSET DAT
1bd0: 41 20 3f 4e 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20  A ?NDATA?.**.** 
1be0: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69    This command i
1bf0: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
1c00: 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
1c10: 77 72 69 74 65 28 29 20 69 6e 20 77 61 79 73 20  write() in ways 
1c20: 74 68 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63  that.**   the Tc
1c30: 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66  l channel interf
1c40: 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68  ace does not. Th
1c50: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1c60: 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20   should.**   be 
1c70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
1c80: 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61  lid channel crea
1c90: 74 65 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72  ted by the [incr
1ca0: 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20  blob] method.** 
1cb0: 20 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20    of a database 
1cc0: 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e  handle. This fun
1cd0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ction calls sqli
1ce0: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29  te3_blob_write()
1cf0: 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20 74  .**   to write t
1d00: 68 65 20 44 41 54 41 20 62 79 74 65 2d 61 72 72  he DATA byte-arr
1d10: 61 79 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ay to the underl
1d20: 79 69 6e 67 20 53 51 4c 69 74 65 20 62 6c 6f 62  ying SQLite blob
1d30: 20 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74   handle..**   at
1d40: 20 6f 66 66 73 65 74 20 4f 46 46 53 45 54 2e 0a   offset OFFSET..
1d50: 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65  **.**   On succe
1d60: 73 73 2c 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ss, an empty str
1d70: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ing is returned.
1d80: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
1d90: 20 69 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20   interpreter.** 
1da0: 20 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 20    result is set 
1db0: 74 6f 20 74 68 65 20 74 65 78 74 20 72 65 70 72  to the text repr
1dc0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1dd0: 65 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  e returned error
1de0: 20 63 6f 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65   code .**   (i.e
1df0: 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  . "SQLITE_NOMEM"
1e00: 29 20 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65  ) and a Tcl exce
1e10: 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e  ption is thrown.
1e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1e30: 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a  est_blob_write(.
1e40: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
1e50: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
1e60: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
1e70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1e80: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1e90: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1ea0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1eb0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1ee0: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
1ef0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
1f00: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
1f10: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
1f20: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
1f30: 62 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  b;.  int iOffset
1f40: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75  ;.  int rc;..  u
1f50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42  nsigned char *zB
1f60: 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a  uf;.  int nBuf;.
1f70: 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34    .  if( objc!=4
1f80: 20 26 26 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20   && objc!=5 ){. 
1f90: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1fa0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1fb0: 62 6a 76 2c 20 22 48 41 4e 44 4c 45 20 4f 46 46  bjv, "HANDLE OFF
1fc0: 53 45 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f  SET DATA ?NDATA?
1fd0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1fe0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1ff0: 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46   if( blobHandleF
2000: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2010: 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20  bjv[1], &pBlob) 
2020: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2030: 4f 52 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  OR;.  if( TCL_OK
2040: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
2050: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2060: 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74 29 20 29  [2], &iOffset) )
2070: 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  { .    return TC
2080: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2090: 7a 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79  zBuf = Tcl_GetBy
20a0: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
20b0: 62 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a  bjv[3], &nBuf);.
20c0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26    if( objc==5 &&
20d0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
20e0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
20f0: 34 5d 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20  4], &nBuf) ){.  
2100: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2110: 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
2120: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
2130: 65 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e  e(pBlob, zBuf, n
2140: 42 75 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Buf, iOffset);. 
2150: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2160: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
2170: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2180: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
2190: 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  rrName(rc), TCL_
21a0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a  VOLATILE);.  }..
21b0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
21c0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b  LITE_OK ? TCL_OK
21d0: 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d   : TCL_ERROR);.}
21e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
21f0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20  E_OMIT_INCRBLOB 
2200: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
2210: 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
2220: 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
2230: 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
2240: 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e 69  itetest_blob_Ini
2250: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
2260: 74 65 72 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  terp){.#ifndef S
2270: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
2280: 4c 4f 42 0a 20 20 73 74 61 74 69 63 20 73 74 72  LOB.  static str
2290: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
22a0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
22b0: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
22c0: 6f 63 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b  oc;.  } aObjCmd[
22d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71  ] = {.     { "sq
22e0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 22  lite3_blob_open"
22f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
2300: 74 5f 62 6c 6f 62 5f 6f 70 65 6e 20 20 20 20 20  t_blob_open     
2310: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2320: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
2330: 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2340: 74 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 20 20 20  t_blob_close    
2350: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2360: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
2370: 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2380: 74 5f 62 6c 6f 62 5f 62 79 74 65 73 20 20 20 20  t_blob_bytes    
2390: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
23a0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22  lite3_blob_read"
23b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
23c0: 74 5f 62 6c 6f 62 5f 72 65 61 64 20 20 20 20 20  t_blob_read     
23d0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
23e0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
23f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2400: 74 5f 62 6c 6f 62 5f 77 72 69 74 65 20 20 20 20  t_blob_write    
2410: 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
2420: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
2430: 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29  <sizeof(aObjCmd)
2440: 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b  /sizeof(aObjCmd[
2450: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
2460: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
2470: 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a  and(interp, aObj
2480: 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4f  Cmd[i].zName, aO
2490: 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
24a0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
24b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
24c0: 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 20 20 72  _INCRBLOB */.  r
24d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.