/ Hex Artifact Content
Login

Artifact 258a6010ba7a82b72b327fb24c55790655689256:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 4d 61 79 20 31  /*.** 2007 May 1
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73  contains code us
0190: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
01a0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 42 4c 4f 42  incremental BLOB
01b0: 20 49 2f 4f 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75   I/O..*/..#inclu
01c0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
01d0: 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49  .#include "vdbeI
01e0: 6e 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53  nt.h"..#ifndef S
01f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
0200: 4c 4f 42 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  LOB../*.** Valid
0210: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 2a 20 68   sqlite3_blob* h
0220: 61 6e 64 6c 65 73 20 70 6f 69 6e 74 20 74 6f 20  andles point to 
0230: 49 6e 63 72 62 6c 6f 62 20 73 74 72 75 63 74 75  Incrblob structu
0240: 72 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  res..*/.typedef 
0250: 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 20  struct Incrblob 
0260: 49 6e 63 72 62 6c 6f 62 3b 0a 73 74 72 75 63 74  Incrblob;.struct
0270: 20 49 6e 63 72 62 6c 6f 62 20 7b 0a 20 20 69 6e   Incrblob {.  in
0280: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
0290: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
02a0: 20 22 66 6c 61 67 73 22 20 70 61 73 73 65 64 20   "flags" passed 
02b0: 74 6f 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  to sqlite3_blob_
02c0: 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
02d0: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
02e0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
02f0: 70 65 6e 20 62 6c 6f 62 2c 20 69 6e 20 62 79 74  pen blob, in byt
0300: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  es */.  int iOff
0310: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
0320: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
0330: 66 20 62 6c 6f 62 20 69 6e 20 63 75 72 73 6f 72  f blob in cursor
0340: 20 64 61 74 61 20 2a 2f 0a 20 20 42 74 43 75 72   data */.  BtCur
0350: 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20  sor *pCsr;      
0360: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
0370: 6e 74 69 6e 67 20 61 74 20 62 6c 6f 62 20 72 6f  nting at blob ro
0380: 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  w */.  sqlite3_s
0390: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 2f  tmt *pStmt;    /
03a0: 2a 20 53 74 61 74 65 6d 65 6e 74 20 68 6f 6c 64  * Statement hold
03b0: 69 6e 67 20 63 75 72 73 6f 72 20 6f 70 65 6e 20  ing cursor open 
03c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
03d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
03e0: 54 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  The associated d
03f0: 61 74 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f  atabase */.};../
0400: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 62 6c 6f 62  *.** Open a blob
0410: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
0420: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
0430: 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
0440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0450: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
0460: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
0470: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
0480: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 61       /* The atta
0490: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 63 6f  ched database co
04a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 62 6c 6f  ntaining the blo
04b0: 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  b */.  const cha
04c0: 72 20 2a 7a 54 61 62 6c 65 2c 20 20 20 20 20 2f  r *zTable,     /
04d0: 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
04e0: 61 69 6e 69 6e 67 20 74 68 65 20 62 6c 6f 62 20  aining the blob 
04f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0500: 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20  *zColumn,    /* 
0510: 54 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  The column conta
0520: 69 6e 69 6e 67 20 74 68 65 20 62 6c 6f 62 20 2a  ining the blob *
0530: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
0540: 20 69 52 6f 77 2c 20 20 20 20 20 20 2f 2a 20 54   iRow,      /* T
0550: 68 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  he row containin
0560: 67 20 74 68 65 20 67 6c 6f 62 20 2a 2f 0a 20 20  g the glob */.  
0570: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
0580: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0590: 2d 3e 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  -> read/write ac
05a0: 63 65 73 73 2c 20 66 61 6c 73 65 20 2d 3e 20 72  cess, false -> r
05b0: 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71  ead-only */.  sq
05c0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42  lite3_blob **ppB
05d0: 6c 6f 62 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20  lob   /* Handle 
05e0: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68  for accessing th
05f0: 65 20 62 6c 6f 62 20 72 65 74 75 72 6e 65 64 20  e blob returned 
0600: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
0610: 20 6e 41 74 74 65 6d 70 74 20 3d 20 30 3b 0a 20   nAttempt = 0;. 
0620: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
0630: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
0640: 78 20 6f 66 20 7a 43 6f 6c 75 6d 6e 20 69 6e 20  x of zColumn in 
0650: 72 6f 77 2d 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  row-record */.. 
0660: 20 2f 2a 20 54 68 69 73 20 56 44 42 45 20 70 72   /* This VDBE pr
0670: 6f 67 72 61 6d 20 73 65 65 6b 73 20 61 20 62 74  ogram seeks a bt
0680: 72 65 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  ree cursor to th
0690: 65 20 69 64 65 6e 74 69 66 69 65 64 20 0a 20 20  e identified .  
06a0: 2a 2a 20 64 62 2f 74 61 62 6c 65 2f 72 6f 77 20  ** db/table/row 
06b0: 65 6e 74 72 79 2e 20 54 68 65 20 72 65 61 73 6f  entry. The reaso
06c0: 6e 20 66 6f 72 20 75 73 69 6e 67 20 61 20 76 64  n for using a vd
06d0: 62 65 20 70 72 6f 67 72 61 6d 20 69 6e 73 74 65  be program inste
06e0: 61 64 0a 20 20 2a 2a 20 6f 66 20 77 72 69 74 69  ad.  ** of writi
06f0: 6e 67 20 63 6f 64 65 20 74 6f 20 75 73 65 20 74  ng code to use t
0700: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20  he b-tree layer 
0710: 64 69 72 65 63 74 6c 79 20 69 73 20 74 68 61 74  directly is that
0720: 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70   the.  ** vdbe p
0730: 72 6f 67 72 61 6d 20 77 69 6c 6c 20 74 61 6b 65  rogram will take
0740: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
0750: 65 20 76 61 72 69 6f 75 73 20 74 72 61 6e 73 61  e various transa
0760: 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 6c 6f 63 6b  ction,.  ** lock
0770: 69 6e 67 20 61 6e 64 20 65 72 72 6f 72 20 68 61  ing and error ha
0780: 6e 64 6c 69 6e 67 20 69 6e 66 72 61 73 74 72 75  ndling infrastru
0790: 63 74 75 72 65 20 62 75 69 6c 74 20 69 6e 74 6f  cture built into
07a0: 20 74 68 65 20 76 64 62 65 2e 0a 20 20 2a 2a 0a   the vdbe..  **.
07b0: 20 20 2a 2a 20 41 66 74 65 72 20 73 65 65 6b 69    ** After seeki
07c0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  ng the cursor, t
07d0: 68 65 20 76 64 62 65 20 65 78 65 63 75 74 65 73  he vdbe executes
07e0: 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77   an OP_ResultRow
07f0: 2e 0a 20 20 2a 2a 20 43 6f 64 65 20 65 78 74 65  ..  ** Code exte
0800: 72 6e 61 6c 20 74 6f 20 74 68 65 20 56 64 62 65  rnal to the Vdbe
0810: 20 74 68 65 6e 20 22 62 6f 72 72 6f 77 73 22 20   then "borrows" 
0820: 74 68 65 20 62 2d 74 72 65 65 20 63 75 72 73 6f  the b-tree curso
0830: 72 20 61 6e 64 0a 20 20 2a 2a 20 75 73 65 73 20  r and.  ** uses 
0840: 69 74 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  it to implement 
0850: 74 68 65 20 62 6c 6f 62 5f 72 65 61 64 28 29 2c  the blob_read(),
0860: 20 62 6c 6f 62 5f 77 72 69 74 65 28 29 20 61 6e   blob_write() an
0870: 64 20 0a 20 20 2a 2a 20 62 6c 6f 62 5f 62 79 74  d .  ** blob_byt
0880: 65 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  es() functions..
0890: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 71    **.  ** The sq
08a0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
08b0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  () function fina
08c0: 6c 69 7a 65 73 20 74 68 65 20 76 64 62 65 20 70  lizes the vdbe p
08d0: 72 6f 67 72 61 6d 2c 0a 20 20 2a 2a 20 77 68 69  rogram,.  ** whi
08e0: 63 68 20 63 6c 6f 73 65 73 20 74 68 65 20 62 2d  ch closes the b-
08f0: 74 72 65 65 20 63 75 72 73 6f 72 20 61 6e 64 20  tree cursor and 
0900: 28 70 6f 73 73 69 62 6c 79 29 20 63 6f 6d 6d 69  (possibly) commi
0910: 74 73 20 74 68 65 20 0a 20 20 2a 2a 20 74 72 61  ts the .  ** tra
0920: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
0930: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
0940: 62 65 4f 70 4c 69 73 74 20 6f 70 65 6e 42 6c 6f  beOpList openBlo
0950: 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 5f  b[] = {.    {OP_
0960: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20  Transaction, 0, 
0970: 30 2c 20 30 7d 2c 20 20 20 20 20 2f 2a 20 30 3a  0, 0},     /* 0:
0980: 20 53 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   Start a transac
0990: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7b 4f 50 5f  tion */.    {OP_
09a0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 30 2c  VerifyCookie, 0,
09b0: 20 30 2c 20 30 7d 2c 20 20 20 20 2f 2a 20 31 3a   0, 0},    /* 1:
09c0: 20 43 68 65 63 6b 20 74 68 65 20 73 63 68 65 6d   Check the schem
09d0: 61 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20  a cookie */.    
09e0: 7b 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 30  {OP_TableLock, 0
09f0: 2c 20 30 2c 20 30 7d 2c 20 20 20 20 20 20 20 2f  , 0, 0},       /
0a00: 2a 20 32 3a 20 41 63 71 75 69 72 65 20 61 20 72  * 2: Acquire a r
0a10: 65 61 64 20 6f 72 20 77 72 69 74 65 20 6c 6f 63  ead or write loc
0a20: 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  k */..    /* One
0a30: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0a40: 67 20 74 77 6f 20 69 6e 73 74 72 75 63 74 69 6f  g two instructio
0a50: 6e 73 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ns is replaced b
0a60: 79 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 2a 2f  y an OP_Noop. */
0a70: 0a 20 20 20 20 7b 4f 50 5f 4f 70 65 6e 52 65 61  .    {OP_OpenRea
0a80: 64 2c 20 30 2c 20 30 2c 20 30 7d 2c 20 20 20 20  d, 0, 0, 0},    
0a90: 20 20 20 20 2f 2a 20 33 3a 20 4f 70 65 6e 20 63      /* 3: Open c
0aa0: 75 72 73 6f 72 20 30 20 66 6f 72 20 72 65 61 64  ursor 0 for read
0ab0: 69 6e 67 20 2a 2f 0a 20 20 20 20 7b 4f 50 5f 4f  ing */.    {OP_O
0ac0: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 30 2c 20  penWrite, 0, 0, 
0ad0: 30 7d 2c 20 20 20 20 20 20 20 2f 2a 20 34 3a 20  0},       /* 4: 
0ae0: 4f 70 65 6e 20 63 75 72 73 6f 72 20 30 20 66 6f  Open cursor 0 fo
0af0: 72 20 72 65 61 64 2f 77 72 69 74 65 20 2a 2f 0a  r read/write */.
0b00: 0a 20 20 20 20 7b 4f 50 5f 56 61 72 69 61 62 6c  .    {OP_Variabl
0b10: 65 2c 20 31 2c 20 31 2c 20 31 7d 2c 20 20 20 20  e, 1, 1, 1},    
0b20: 20 20 20 20 2f 2a 20 35 3a 20 50 75 73 68 20 74      /* 5: Push t
0b30: 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20  he rowid to the 
0b40: 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 7b 4f 50  stack */.    {OP
0b50: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 30 2c 20 39  _NotExists, 0, 9
0b60: 2c 20 31 7d 2c 20 20 20 20 20 20 20 2f 2a 20 36  , 1},       /* 6
0b70: 3a 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f  : Seek the curso
0b80: 72 20 2a 2f 0a 20 20 20 20 7b 4f 50 5f 43 6f 6c  r */.    {OP_Col
0b90: 75 6d 6e 2c 20 30 2c 20 30 2c 20 31 7d 2c 20 20  umn, 0, 0, 1},  
0ba0: 20 20 20 20 20 20 20 20 2f 2a 20 37 20 20 2a 2f          /* 7  */
0bb0: 0a 20 20 20 20 7b 4f 50 5f 52 65 73 75 6c 74 52  .    {OP_ResultR
0bc0: 6f 77 2c 20 31 2c 20 30 2c 20 30 7d 2c 20 20 20  ow, 1, 0, 0},   
0bd0: 20 20 20 20 2f 2a 20 38 20 20 2a 2f 0a 20 20 20      /* 8  */.   
0be0: 20 7b 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30   {OP_Close, 0, 0
0bf0: 2c 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20  , 0},           
0c00: 2f 2a 20 39 20 20 2a 2f 0a 20 20 20 20 7b 4f 50  /* 9  */.    {OP
0c10: 5f 48 61 6c 74 2c 20 30 2c 20 30 2c 20 30 7d 2c  _Halt, 0, 0, 0},
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
0c30: 30 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 56 64 62  0 */.  };..  Vdb
0c40: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
0c50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0c60: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
0c70: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
0c80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0c90: 3b 0a 0a 20 20 2a 70 70 42 6c 6f 62 20 3d 20 30  ;..  *ppBlob = 0
0ca0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
0cb0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
0cc0: 78 29 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 73  x);.  pParse = s
0cd0: 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
0ce0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
0cf0: 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66 28 20  pParse));.  if( 
0d00: 70 50 61 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  pParse==0 ){.   
0d10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
0d20: 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 6c 6f  EM;.    goto blo
0d30: 62 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a  b_open_out;.  }.
0d40: 20 20 64 6f 20 7b 0a 20 20 20 20 6d 65 6d 73 65    do {.    memse
0d50: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 73 69 7a  t(pParse, 0, siz
0d60: 65 6f 66 28 50 61 72 73 65 29 29 3b 0a 20 20 20  eof(Parse));.   
0d70: 20 70 50 61 72 73 65 2d 3e 64 62 20 3d 20 64 62   pParse->db = db
0d80: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ;..    sqlite3Bt
0d90: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
0da0: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
0db0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
0dc0: 50 61 72 73 65 2c 20 30 2c 20 7a 54 61 62 6c 65  Parse, 0, zTable
0dd0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
0de0: 70 54 61 62 20 26 26 20 49 73 56 69 72 74 75 61  pTab && IsVirtua
0df0: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
0e00: 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
0e10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
0e20: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
0e30: 20 6f 70 65 6e 20 76 69 72 74 75 61 6c 20 74 61   open virtual ta
0e40: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 61 62 6c 65  ble: %s", zTable
0e50: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
0e60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
0e70: 57 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26  W.    if( pTab &
0e80: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
0e90: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
0ea0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
0eb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0ec0: 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 76 69   "cannot open vi
0ed0: 65 77 3a 20 25 73 22 2c 20 7a 54 61 62 6c 65 29  ew: %s", zTable)
0ee0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
0ef0: 20 20 20 69 66 28 20 21 70 54 61 62 20 29 7b 0a     if( !pTab ){.
0f00: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
0f10: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
0f20: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
0f30: 65 65 28 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20  ee(db, zErr);.  
0f40: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 70 50 61        zErr = pPa
0f50: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20  rse->zErrMsg;.  
0f60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 45        pParse->zE
0f70: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
0f80: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
0f90: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
0fa0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
0fb0: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  aveAll(db);.    
0fc0: 20 20 67 6f 74 6f 20 62 6c 6f 62 5f 6f 70 65 6e    goto blob_open
0fd0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
0fe0: 20 2f 2a 20 4e 6f 77 20 73 65 61 72 63 68 20 70   /* Now search p
0ff0: 54 61 62 20 66 6f 72 20 74 68 65 20 65 78 61 63  Tab for the exac
1000: 74 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20  t column. */.   
1010: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
1020: 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  l < pTab->nCol; 
1030: 69 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20  iCol++) {.      
1040: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1050: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  mp(pTab->aCol[iC
1060: 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol].zName, zColu
1070: 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mn)==0 ){.      
1080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1090: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
10a0: 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col==pTab->nCol 
10b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10c0: 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 29  DbFree(db, zErr)
10d0: 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73  ;.      zErr = s
10e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
10f0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  , "no such colum
1100: 6e 3a 20 5c 22 25 73 5c 22 22 2c 20 7a 43 6f 6c  n: \"%s\"", zCol
1110: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  umn);.      rc =
1120: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1130: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1140: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
1150: 20 20 20 20 20 67 6f 74 6f 20 62 6c 6f 62 5f 6f       goto blob_o
1160: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  pen_out;.    }..
1170: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 76 61      /* If the va
1180: 6c 75 65 20 69 73 20 62 65 69 6e 67 20 6f 70 65  lue is being ope
1190: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ned for writing,
11a0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 0a   check that the.
11b0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
11c0: 20 6e 6f 74 20 69 6e 64 65 78 65 64 2c 20 61 6e   not indexed, an
11d0: 64 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  d that it is not
11e0: 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
11f0: 67 6e 20 6b 65 79 2e 20 0a 20 20 20 20 2a 2a 20  gn key. .    ** 
1200: 49 74 20 69 73 20 61 67 61 69 6e 73 74 20 74 68  It is against th
1210: 65 20 72 75 6c 65 73 20 74 6f 20 6f 70 65 6e 20  e rules to open 
1220: 61 20 63 6f 6c 75 6d 6e 20 74 6f 20 77 68 69 63  a column to whic
1230: 68 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  h either of thes
1240: 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
1250: 74 69 6f 6e 73 20 61 70 70 6c 69 65 73 20 66 6f  tions applies fo
1260: 72 20 77 72 69 74 69 6e 67 2e 20 20 2a 2f 0a 20  r writing.  */. 
1270: 20 20 20 69 66 28 20 66 6c 61 67 73 20 29 7b 0a     if( flags ){.
1280: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1290: 20 2a 7a 46 61 75 6c 74 20 3d 20 30 3b 0a 20 20   *zFault = 0;.  
12a0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
12b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12c0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
12d0: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66  .      if( db->f
12e0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 6f 72 65  lags&SQLITE_Fore
12f0: 69 67 6e 4b 65 79 73 20 29 7b 0a 20 20 20 20 20  ignKeys ){.     
1300: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
1310: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   the column is n
1320: 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 46 4b  ot part of an FK
1330: 20 63 68 69 6c 64 20 6b 65 79 20 64 65 66 69 6e   child key defin
1340: 69 74 69 6f 6e 2e 20 49 74 0a 20 20 20 20 20 20  ition. It.      
1350: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65    ** is not nece
1360: 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 69  ssary to check i
1370: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
1380: 61 20 70 61 72 65 6e 74 20 6b 65 79 2c 20 61 73  a parent key, as
1390: 20 70 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20   parent.        
13a0: 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 6d  ** key columns m
13b0: 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 20  ust be indexed. 
13c0: 54 68 65 20 63 68 65 63 6b 20 62 65 6c 6f 77 20  The check below 
13d0: 77 69 6c 6c 20 70 69 63 6b 20 75 70 20 74 68 69  will pick up thi
13e0: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  s .        ** ca
13f0: 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  se.  */.        
1400: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20  FKey *pFKey;.   
1410: 20 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70       for(pFKey=p
1420: 54 61 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  Tab->pFKey; pFKe
1430: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
1440: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
1450: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1460: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1470: 6a 3c 70 46 4b 65 79 2d 3e 6e 43 6f 6c 3b 20 6a  j<pFKey->nCol; j
1480: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1490: 20 69 66 28 20 70 46 4b 65 79 2d 3e 61 43 6f 6c   if( pFKey->aCol
14a0: 5b 6a 5d 2e 69 46 72 6f 6d 3d 3d 69 43 6f 6c 20  [j].iFrom==iCol 
14b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14c0: 20 7a 46 61 75 6c 74 20 3d 20 22 66 6f 72 65 69   zFault = "forei
14d0: 67 6e 20 6b 65 79 22 3b 0a 20 20 20 20 20 20 20  gn key";.       
14e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1500: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1510: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1520: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1530: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1540: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
1550: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
1560: 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
1570: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
1580: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
1590: 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 69 43 6f 6c 20 29  olumn[j]==iCol )
15a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  {.            zF
15b0: 61 75 6c 74 20 3d 20 22 69 6e 64 65 78 65 64 22  ault = "indexed"
15c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15e0: 20 20 20 20 20 20 69 66 28 20 7a 46 61 75 6c 74        if( zFault
15f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1600: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1610: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  rr);.        zEr
1620: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
1630: 74 66 28 64 62 2c 20 22 63 61 6e 6e 6f 74 20 6f  tf(db, "cannot o
1640: 70 65 6e 20 25 73 20 63 6f 6c 75 6d 6e 20 66 6f  pen %s column fo
1650: 72 20 77 72 69 74 69 6e 67 22 2c 20 7a 46 61 75  r writing", zFau
1660: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  lt);.        rc 
1670: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1690: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
16a0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62  ;.        goto b
16b0: 6c 6f 62 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  lob_open_out;.  
16c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
16d0: 20 76 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   v = sqlite3Vdbe
16e0: 43 72 65 61 74 65 28 64 62 29 3b 0a 20 20 20 20  Create(db);.    
16f0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 69  if( v ){.      i
1700: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
1710: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
1720: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
1730: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1740: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
1750: 73 69 7a 65 6f 66 28 6f 70 65 6e 42 6c 6f 62 29  sizeof(openBlob)
1760: 2f 73 69 7a 65 6f 66 28 56 64 62 65 4f 70 4c 69  /sizeof(VdbeOpLi
1770: 73 74 29 2c 20 6f 70 65 6e 42 6c 6f 62 29 3b 0a  st), openBlob);.
1780: 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 21 21        flags = !!
1790: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
17a0: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
17b0: 3d 20 28 66 6c 61 67 73 20 3f 20 31 20 3a 20 30  = (flags ? 1 : 0
17c0: 29 3b 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ); */..      /* 
17d0: 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 4f 50  Configure the OP
17e0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  _Transaction */.
17f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1800: 65 43 68 61 6e 67 65 50 31 28 76 2c 20 30 2c 20  eChangeP1(v, 0, 
1810: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1820: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
1830: 76 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 0a 20  v, 0, flags);.. 
1840: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1850: 65 20 74 68 65 20 4f 50 5f 56 65 72 69 66 79 43  e the OP_VerifyC
1860: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 20 20 73  ookie */.      s
1870: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1880: 50 31 28 76 2c 20 31 2c 20 69 44 62 29 3b 0a 20  P1(v, 1, iDb);. 
1890: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18a0: 43 68 61 6e 67 65 50 32 28 76 2c 20 31 2c 20 70  ChangeP2(v, 1, p
18b0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  Tab->pSchema->sc
18c0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20  hema_cookie);.. 
18d0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
18e0: 65 20 61 20 6d 75 74 65 78 20 69 73 20 68 65 6c  e a mutex is hel
18f0: 64 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  d on the table t
1900: 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f  o be accessed */
1910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1920: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1930: 44 62 29 3b 20 0a 0a 20 20 20 20 20 20 2f 2a 20  Db); ..      /* 
1940: 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 4f 50  Configure the OP
1950: 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72  _TableLock instr
1960: 75 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  uction */.#ifdef
1970: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1980: 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1990: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19a0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 32 2c 20 31 29  eToNoop(v, 2, 1)
19b0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 71  ;.#else.      sq
19c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19d0: 31 28 76 2c 20 32 2c 20 69 44 62 29 3b 0a 20 20  1(v, 2, iDb);.  
19e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19f0: 68 61 6e 67 65 50 32 28 76 2c 20 32 2c 20 70 54  hangeP2(v, 2, pT
1a00: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20  ab->tnum);.     
1a10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a20: 67 65 50 33 28 76 2c 20 32 2c 20 66 6c 61 67 73  geP3(v, 2, flags
1a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1a50: 32 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  2, pTab->zName, 
1a60: 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23  P4_TRANSIENT);.#
1a70: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1a80: 52 65 6d 6f 76 65 20 65 69 74 68 65 72 20 74 68  Remove either th
1a90: 65 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 6f  e OP_OpenWrite o
1aa0: 72 20 4f 70 65 6e 52 65 61 64 2e 20 53 65 74 20  r OpenRead. Set 
1ab0: 74 68 65 20 50 32 20 0a 20 20 20 20 20 20 2a 2a  the P2 .      **
1ac0: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
1ad0: 65 20 6f 74 68 65 72 20 74 6f 20 70 54 61 62 2d  e other to pTab-
1ae0: 3e 74 6e 75 6d 2e 20 20 2a 2f 0a 20 20 20 20 20  >tnum.  */.     
1af0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1b00: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 34 20 2d 20  geToNoop(v, 4 - 
1b10: 66 6c 61 67 73 2c 20 31 29 3b 0a 20 20 20 20 20  flags, 1);.     
1b20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1b30: 67 65 50 32 28 76 2c 20 33 20 2b 20 66 6c 61 67  geP2(v, 3 + flag
1b40: 73 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  s, pTab->tnum);.
1b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b60: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 33 20 2b  eChangeP3(v, 3 +
1b70: 20 66 6c 61 67 73 2c 20 69 44 62 29 3b 0a 0a 20   flags, iDb);.. 
1b80: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1b90: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1ba0: 63 6f 6c 75 6d 6e 73 2e 20 43 6f 6e 66 69 67 75  columns. Configu
1bb0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
1bc0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 6b 20  .      ** think 
1bd0: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
1be0: 61 73 20 6f 6e 65 20 6d 6f 72 65 20 63 6f 6c 75  as one more colu
1bf0: 6d 6e 20 74 68 61 6e 20 69 74 20 72 65 61 6c 6c  mn than it reall
1c00: 79 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 2e  y.      ** does.
1c10: 20 41 6e 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f   An OP_Column to
1c20: 20 72 65 74 72 69 65 76 65 20 74 68 69 73 20 69   retrieve this i
1c30: 6d 61 67 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20  maginary column 
1c40: 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c  will.      ** al
1c50: 77 61 79 73 20 72 65 74 75 72 6e 20 61 6e 20 53  ways return an S
1c60: 51 4c 20 4e 55 4c 4c 2e 20 54 68 69 73 20 69 73  QL NULL. This is
1c70: 20 75 73 65 66 75 6c 20 62 65 63 61 75 73 65 20   useful because 
1c80: 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 20 20 2a  it means.      *
1c90: 2a 20 77 65 20 63 61 6e 20 69 6e 76 6f 6b 65 20  * we can invoke 
1ca0: 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c  OP_Column to fil
1cb0: 6c 20 69 6e 20 74 68 65 20 76 64 62 65 20 63 75  l in the vdbe cu
1cc0: 72 73 6f 72 73 20 74 79 70 65 20 0a 20 20 20 20  rsors type .    
1cd0: 20 20 2a 2a 20 61 6e 64 20 6f 66 66 73 65 74 20    ** and offset 
1ce0: 63 61 63 68 65 20 77 69 74 68 6f 75 74 20 63 61  cache without ca
1cf0: 75 73 69 6e 67 20 61 6e 79 20 49 4f 2e 0a 20 20  using any IO..  
1d00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1d10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1d20: 28 76 2c 20 33 2b 66 6c 61 67 73 2c 20 53 51 4c  (v, 3+flags, SQL
1d30: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
1d40: 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 2c 50 34 5f  Tab->nCol+1),P4_
1d50: 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 73 71  INT32);.      sq
1d60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1d70: 32 28 76 2c 20 37 2c 20 70 54 61 62 2d 3e 6e 43  2(v, 7, pTab->nC
1d80: 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ol);.      if( !
1d90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1db0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
1dc0: 28 76 2c 20 31 2c 20 31 2c 20 31 2c 20 30 2c 20  (v, 1, 1, 1, 0, 
1dd0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
1de0: 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 73 71 6c     }.   .    sql
1df0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
1e00: 6c 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 64  l(db);.    if( d
1e10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e20: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 6c  ){.      goto bl
1e30: 6f 62 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ob_open_out;.   
1e40: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
1e50: 62 69 6e 64 5f 69 6e 74 36 34 28 28 73 71 6c 69  bind_int64((sqli
1e60: 74 65 33 5f 73 74 6d 74 20 2a 29 76 2c 20 31 2c  te3_stmt *)v, 1,
1e70: 20 69 52 6f 77 29 3b 0a 20 20 20 20 72 63 20 3d   iRow);.    rc =
1e80: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 28 73   sqlite3_step((s
1e90: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 29 76 29  qlite3_stmt *)v)
1ea0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1eb0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1ec0: 20 20 6e 41 74 74 65 6d 70 74 2b 2b 3b 0a 20 20    nAttempt++;.  
1ed0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ee0: 5f 66 69 6e 61 6c 69 7a 65 28 28 73 71 6c 69 74  _finalize((sqlit
1ef0: 65 33 5f 73 74 6d 74 20 2a 29 76 29 3b 0a 20 20  e3_stmt *)v);.  
1f00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f10: 65 28 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20 20  e(db, zErr);.   
1f20: 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65     zErr = sqlite
1f30: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 73 71 6c  3MPrintf(db, sql
1f40: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
1f50: 3b 0a 20 20 20 20 20 20 76 20 3d 20 30 3b 0a 20  ;.      v = 0;. 
1f60: 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
1f70: 6e 41 74 74 65 6d 70 74 3c 35 20 26 26 20 72 63  nAttempt<5 && rc
1f80: 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  ==SQLITE_SCHEMA 
1f90: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1fa0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1fb0: 2f 2a 20 54 68 65 20 72 6f 77 2d 72 65 63 6f 72  /* The row-recor
1fc0: 64 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  d has been opene
1fd0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
1fe0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 0a 20  Check that the. 
1ff0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20     ** column in 
2000: 71 75 65 73 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  question contain
2010: 73 20 74 65 78 74 20 6f 72 20 61 20 62 6c 6f 62  s text or a blob
2020: 2e 20 49 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  . If it contains
2030: 0a 20 20 20 20 2a 2a 20 74 65 78 74 2c 20 69 74  .    ** text, it
2040: 20 69 73 20 75 70 20 74 6f 20 74 68 65 20 63 61   is up to the ca
2050: 6c 6c 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  ller to get the 
2060: 65 6e 63 6f 64 69 6e 67 20 72 69 67 68 74 2e 0a  encoding right..
2070: 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 63 72 62      */.    Incrb
2080: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 20 20  lob *pBlob;.    
2090: 75 33 32 20 74 79 70 65 20 3d 20 76 2d 3e 61 70  u32 type = v->ap
20a0: 43 73 72 5b 30 5d 2d 3e 61 54 79 70 65 5b 69 43  Csr[0]->aType[iC
20b0: 6f 6c 5d 3b 0a 0a 20 20 20 20 69 66 28 20 74 79  ol];..    if( ty
20c0: 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 73  pe<12 ){.      s
20d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20e0: 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45   zErr);.      zE
20f0: 72 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  rr = sqlite3MPri
2100: 6e 74 66 28 64 62 2c 20 22 63 61 6e 6e 6f 74 20  ntf(db, "cannot 
2110: 6f 70 65 6e 20 76 61 6c 75 65 20 6f 66 20 74 79  open value of ty
2120: 70 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  pe %s",.        
2130: 20 20 74 79 70 65 3d 3d 30 3f 22 6e 75 6c 6c 22    type==0?"null"
2140: 3a 20 74 79 70 65 3d 3d 37 3f 22 72 65 61 6c 22  : type==7?"real"
2150: 3a 20 22 69 6e 74 65 67 65 72 22 0a 20 20 20 20  : "integer".    
2160: 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
2170: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2180: 20 20 20 20 67 6f 74 6f 20 62 6c 6f 62 5f 6f 70      goto blob_op
2190: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
21a0: 20 20 70 42 6c 6f 62 20 3d 20 28 49 6e 63 72 62    pBlob = (Incrb
21b0: 6c 6f 62 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  lob *)sqlite3DbM
21c0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
21d0: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 29 29 3b  zeof(Incrblob));
21e0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
21f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2200: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2210: 28 64 62 2c 20 70 42 6c 6f 62 29 3b 0a 20 20 20  (db, pBlob);.   
2220: 20 20 20 67 6f 74 6f 20 62 6c 6f 62 5f 6f 70 65     goto blob_ope
2230: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
2240: 20 70 42 6c 6f 62 2d 3e 66 6c 61 67 73 20 3d 20   pBlob->flags = 
2250: 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 6c 6f 62  flags;.    pBlob
2260: 2d 3e 70 43 73 72 20 3d 20 20 76 2d 3e 61 70 43  ->pCsr =  v->apC
2270: 73 72 5b 30 5d 2d 3e 70 43 75 72 73 6f 72 3b 0a  sr[0]->pCursor;.
2280: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2290: 45 6e 74 65 72 43 75 72 73 6f 72 28 70 42 6c 6f  EnterCursor(pBlo
22a0: 62 2d 3e 70 43 73 72 29 3b 0a 20 20 20 20 73 71  b->pCsr);.    sq
22b0: 6c 69 74 65 33 42 74 72 65 65 43 61 63 68 65 4f  lite3BtreeCacheO
22c0: 76 65 72 66 6c 6f 77 28 70 42 6c 6f 62 2d 3e 70  verflow(pBlob->p
22d0: 43 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Csr);.    sqlite
22e0: 33 42 74 72 65 65 4c 65 61 76 65 43 75 72 73 6f  3BtreeLeaveCurso
22f0: 72 28 70 42 6c 6f 62 2d 3e 70 43 73 72 29 3b 0a  r(pBlob->pCsr);.
2300: 20 20 20 20 70 42 6c 6f 62 2d 3e 70 53 74 6d 74      pBlob->pStmt
2310: 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74   = (sqlite3_stmt
2320: 20 2a 29 76 3b 0a 20 20 20 20 70 42 6c 6f 62 2d   *)v;.    pBlob-
2330: 3e 69 4f 66 66 73 65 74 20 3d 20 76 2d 3e 61 70  >iOffset = v->ap
2340: 43 73 72 5b 30 5d 2d 3e 61 4f 66 66 73 65 74 5b  Csr[0]->aOffset[
2350: 69 43 6f 6c 5d 3b 0a 20 20 20 20 70 42 6c 6f 62  iCol];.    pBlob
2360: 2d 3e 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  ->nByte = sqlite
2370: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
2380: 65 6e 28 74 79 70 65 29 3b 0a 20 20 20 20 70 42  en(type);.    pB
2390: 6c 6f 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  lob->db = db;.  
23a0: 20 20 2a 70 70 42 6c 6f 62 20 3d 20 28 73 71 6c    *ppBlob = (sql
23b0: 69 74 65 33 5f 62 6c 6f 62 20 2a 29 70 42 6c 6f  ite3_blob *)pBlo
23c0: 62 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  b;.    rc = SQLI
23d0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
23e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2400: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 29 3b  bFree(db, zErr);
2410: 0a 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  .    zErr = sqli
2420: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
2430: 6e 6f 20 73 75 63 68 20 72 6f 77 69 64 3a 20 25  no such rowid: %
2440: 6c 6c 64 22 2c 20 69 52 6f 77 29 3b 0a 20 20 20  lld", iRow);.   
2450: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2460: 4f 52 3b 0a 20 20 7d 0a 0a 62 6c 6f 62 5f 6f 70  OR;.  }..blob_op
2470: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 76 20  en_out:.  if( v 
2480: 26 26 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  && (rc!=SQLITE_O
2490: 4b 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  K || db->mallocF
24a0: 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 73 71  ailed) ){.    sq
24b0: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
24c0: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
24d0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
24e0: 20 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65   zErr);.  sqlite
24f0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
2500: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 61 63  );.  sqlite3Stac
2510: 6b 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  kFree(db, pParse
2520: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2530: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
2540: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2550: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
2560: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
2570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
2580: 61 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 74 68  a blob handle th
2590: 61 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  at was previousl
25a0: 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a  y created using.
25b0: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
25c0: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
25d0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
25e0: 65 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  e(sqlite3_blob *
25f0: 70 42 6c 6f 62 29 7b 0a 20 20 49 6e 63 72 62 6c  pBlob){.  Incrbl
2600: 6f 62 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f  ob *p = (Incrblo
2610: 62 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  b *)pBlob;.  int
2620: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
2630: 64 62 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a  db;..  if( p ){.
2640: 20 20 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a      db = p->db;.
2650: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2660: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
2670: 78 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  x);.    rc = sql
2680: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
2690: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  >pStmt);.    sql
26a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
26c0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
26d0: 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  utex);.  }else{.
26e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26f0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2700: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 65   rc;.}../*.** Pe
2710: 72 66 6f 72 6d 20 61 20 72 65 61 64 20 6f 72 20  rform a read or 
2720: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
2730: 6f 6e 20 61 20 62 6c 6f 62 0a 2a 2f 0a 73 74 61  on a blob.*/.sta
2740: 74 69 63 20 69 6e 74 20 62 6c 6f 62 52 65 61 64  tic int blobRead
2750: 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
2760: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 0a 20  _blob *pBlob, . 
2770: 20 76 6f 69 64 20 2a 7a 2c 20 0a 20 20 69 6e 74   void *z, .  int
2780: 20 6e 2c 20 0a 20 20 69 6e 74 20 69 4f 66 66 73   n, .  int iOffs
2790: 65 74 2c 20 0a 20 20 69 6e 74 20 28 2a 78 43 61  et, .  int (*xCa
27a0: 6c 6c 29 28 42 74 43 75 72 73 6f 72 2a 2c 20 75  ll)(BtCursor*, u
27b0: 33 32 2c 20 75 33 32 2c 20 76 6f 69 64 2a 29 0a  32, u32, void*).
27c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 49  ){.  int rc;.  I
27d0: 6e 63 72 62 6c 6f 62 20 2a 70 20 3d 20 28 49 6e  ncrblob *p = (In
27e0: 63 72 62 6c 6f 62 20 2a 29 70 42 6c 6f 62 3b 0a  crblob *)pBlob;.
27f0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
2800: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
2810: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
2820: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
2830: 54 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  T;.  db = p->db;
2840: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2850: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
2860: 29 3b 0a 20 20 76 20 3d 20 28 56 64 62 65 2a 29  );.  v = (Vdbe*)
2870: 70 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  p->pStmt;..  if(
2880: 20 6e 3c 30 20 7c 7c 20 69 4f 66 66 73 65 74 3c   n<0 || iOffset<
2890: 30 20 7c 7c 20 28 69 4f 66 66 73 65 74 2b 6e 29  0 || (iOffset+n)
28a0: 3e 70 2d 3e 6e 42 79 74 65 20 29 7b 0a 20 20 20  >p->nByte ){.   
28b0: 20 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20 6f   /* Request is o
28c0: 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 52 65 74  ut of range. Ret
28d0: 75 72 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20  urn a transient 
28e0: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 63  error. */.    rc
28f0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2900: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2910: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  r(db, SQLITE_ERR
2920: 4f 52 2c 20 30 29 3b 0a 20 20 7d 20 65 6c 73 65  OR, 0);.  } else
2930: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
2940: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2950: 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  no statement han
2960: 64 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 62 6c  dle, then the bl
2970: 6f 62 2d 68 61 6e 64 6c 65 20 68 61 73 0a 20 20  ob-handle has.  
2980: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
2990: 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 20 52  n invalidated. R
29a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
29b0: 52 54 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  RT in this case.
29c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
29d0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
29e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
29f0: 61 6c 6c 20 65 69 74 68 65 72 20 42 74 72 65 65  all either Btree
2a00: 44 61 74 61 28 29 20 6f 72 20 42 74 72 65 65 50  Data() or BtreeP
2a10: 75 74 44 61 74 61 28 29 2e 20 49 66 20 53 51 4c  utData(). If SQL
2a20: 49 54 45 5f 41 42 4f 52 54 20 69 73 0a 20 20 20  ITE_ABORT is.   
2a30: 20 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 63 6c   ** returned, cl
2a40: 65 61 6e 2d 75 70 20 74 68 65 20 73 74 61 74 65  ean-up the state
2a50: 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 20 20 20  ment handle..   
2a60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a70: 64 62 20 3d 3d 20 76 2d 3e 64 62 20 29 3b 0a 20  db == v->db );. 
2a80: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
2a90: 6e 74 65 72 43 75 72 73 6f 72 28 70 2d 3e 70 43  nterCursor(p->pC
2aa0: 73 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 78 43  sr);.    rc = xC
2ab0: 61 6c 6c 28 70 2d 3e 70 43 73 72 2c 20 69 4f 66  all(p->pCsr, iOf
2ac0: 66 73 65 74 2b 70 2d 3e 69 4f 66 66 73 65 74 2c  fset+p->iOffset,
2ad0: 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69   n, z);.    sqli
2ae0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 43 75 72  te3BtreeLeaveCur
2af0: 73 6f 72 28 70 2d 3e 70 43 73 72 29 3b 0a 20 20  sor(p->pCsr);.  
2b00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b10: 5f 41 42 4f 52 54 20 29 7b 0a 20 20 20 20 20 20  _ABORT ){.      
2b20: 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
2b30: 69 7a 65 28 76 29 3b 0a 20 20 20 20 20 20 70 2d  ize(v);.      p-
2b40: 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
2b50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
2b60: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
2b70: 20 20 20 20 20 76 2d 3e 72 63 20 3d 20 72 63 3b       v->rc = rc;
2b80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20  .    }.  }.  rc 
2b90: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
2ba0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
2bb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2bc0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
2bd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2be0: 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
2bf0: 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a   a blob handle..
2c00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
2c10: 6c 6f 62 5f 72 65 61 64 28 73 71 6c 69 74 65 33  lob_read(sqlite3
2c20: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 76 6f  _blob *pBlob, vo
2c30: 69 64 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e  id *z, int n, in
2c40: 74 20 69 4f 66 66 73 65 74 29 7b 0a 20 20 72 65  t iOffset){.  re
2c50: 74 75 72 6e 20 62 6c 6f 62 52 65 61 64 57 72 69  turn blobReadWri
2c60: 74 65 28 70 42 6c 6f 62 2c 20 7a 2c 20 6e 2c 20  te(pBlob, z, n, 
2c70: 69 4f 66 66 73 65 74 2c 20 73 71 6c 69 74 65 33  iOffset, sqlite3
2c80: 42 74 72 65 65 44 61 74 61 29 3b 0a 7d 0a 0a 2f  BtreeData);.}../
2c90: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
2ca0: 74 6f 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c 65  to a blob handle
2cb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cc0: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 73 71 6c 69  _blob_write(sqli
2cd0: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 2c  te3_blob *pBlob,
2ce0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 2c 20   const void *z, 
2cf0: 69 6e 74 20 6e 2c 20 69 6e 74 20 69 4f 66 66 73  int n, int iOffs
2d00: 65 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 62 6c  et){.  return bl
2d10: 6f 62 52 65 61 64 57 72 69 74 65 28 70 42 6c 6f  obReadWrite(pBlo
2d20: 62 2c 20 28 76 6f 69 64 20 2a 29 7a 2c 20 6e 2c  b, (void *)z, n,
2d30: 20 69 4f 66 66 73 65 74 2c 20 73 71 6c 69 74 65   iOffset, sqlite
2d40: 33 42 74 72 65 65 50 75 74 44 61 74 61 29 3b 0a  3BtreePutData);.
2d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 61  }../*.** Query a
2d60: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 66 6f 72   blob handle for
2d70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2d80: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   data..**.** The
2d90: 20 49 6e 63 72 62 6c 6f 62 2e 6e 42 79 74 65 20   Incrblob.nByte 
2da0: 66 69 65 6c 64 20 69 73 20 66 69 78 65 64 20 66  field is fixed f
2db0: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
2dc0: 6f 66 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 0a  of the Incrblob.
2dd0: 2a 2a 20 73 6f 20 6e 6f 20 6d 75 74 65 78 20 69  ** so no mutex i
2de0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
2df0: 63 63 65 73 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccess..*/.int sq
2e00: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
2e10: 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70  (sqlite3_blob *p
2e20: 42 6c 6f 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  Blob){.  Incrblo
2e30: 62 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  b *p = (Incrblob
2e40: 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 65 74 75   *)pBlob;.  retu
2e50: 72 6e 20 70 20 3f 20 70 2d 3e 6e 42 79 74 65 20  rn p ? p->nByte 
2e60: 3a 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  : 0;.}..#endif /
2e70: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
2e80: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
2e90: 2f 0a                                            /.