/ Hex Artifact Content
Login

Artifact 371a22e7485e57048be1e625eb0b82e3429b0f58:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou 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 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33  beCreate(sqlite3
0320: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
0330: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  ;.  p = sqlite3D
0340: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
0350: 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a  sizeof(Vdbe) );.
0360: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0370: 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d  urn 0;.  p->db =
0380: 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70   db;.  if( db->p
0390: 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  Vdbe ){.    db->
03a0: 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70  pVdbe->pPrev = p
03b0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74  ;.  }.  p->pNext
03c0: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
03d0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
03e0: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20  db->pVdbe = p;. 
03f0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
0400: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
0410: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
0420: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53  * Remember the S
0430: 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20  QL string for a 
0440: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0450: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
0460: 74 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64  te3VdbeSetSql(Vd
0470: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
0480: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  r *z, int n, int
0490: 20 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20   isPrepareV2){. 
04a0: 20 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61   assert( isPrepa
04b0: 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65  reV2==1 || isPre
04c0: 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69  pareV2==0 );.  i
04d0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
04e0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
04f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0500: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0510: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
0520: 47 29 0a 20 20 69 66 28 20 21 69 73 50 72 65 70  G).  if( !isPrep
0530: 61 72 65 56 32 20 29 20 72 65 74 75 72 6e 3b 0a  areV2 ) return;.
0540: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
0550: 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20   p->zSql==0 );. 
0560: 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74   p->zSql = sqlit
0570: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
0580: 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69  b, z, n);.  p->i
0590: 73 50 72 65 70 61 72 65 56 32 20 3d 20 28 75 38  sPrepareV2 = (u8
05a0: 29 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  )isPrepareV2;.}.
05b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
05c0: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
05d0: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
05e0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
05f0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0600: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0610: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 56 64  mt *pStmt){.  Vd
0620: 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29  be *p = (Vdbe *)
0630: 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  pStmt;.  return 
0640: 28 70 20 26 26 20 70 2d 3e 69 73 50 72 65 70 61  (p && p->isPrepa
0650: 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53 71 6c 20  reV2) ? p->zSql 
0660: 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  : 0;.}../*.** Sw
0670: 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  ap all content b
0680: 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20  etween two VDBE 
0690: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
06a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
06b0: 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64  wap(Vdbe *pA, Vd
06c0: 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20  be *pB){.  Vdbe 
06d0: 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68  tmp, *pTmp;.  ch
06e0: 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65  ar *zTmp;.  asse
06f0: 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e  rt( pA->db==pB->
0700: 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70  db );.  tmp = *p
0710: 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a  A;.  *pA = *pB;.
0720: 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70    *pB = tmp;.  p
0730: 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b  Tmp = pA->pNext;
0740: 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pA->pNext = p
0750: 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e  B->pNext;.  pB->
0760: 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20  pNext = pTmp;.  
0770: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76  pTmp = pA->pPrev
0780: 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20  ;.  pA->pPrev = 
0790: 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d  pB->pPrev;.  pB-
07a0: 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20  >pPrev = pTmp;. 
07b0: 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c   zTmp = pA->zSql
07c0: 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70  ;.  pA->zSql = p
07d0: 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a  B->zSql;.  pB->z
07e0: 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42  Sql = zTmp;.  pB
07f0: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0800: 70 41 2d 3e 69 73 50 72 65 70 61 72 65 56 32 3b  pA->isPrepareV2;
0810: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0820: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75  E_DEBUG./*.** Tu
0830: 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72  rn tracing on or
0840: 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   off.*/.void sql
0850: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64  ite3VdbeTrace(Vd
0860: 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61  be *p, FILE *tra
0870: 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20  ce){.  p->trace 
0880: 3d 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69  = trace;.}.#endi
0890: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  f../*.** Resize 
08a0: 74 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72  the Vdbe.aOp arr
08b0: 61 79 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  ay so that it is
08c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
08d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a   larger than .**
08e0: 20 69 74 20 77 61 73 2e 0a 2a 2a 0a 2a 2a 20 49   it was..**.** I
08f0: 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  f an out-of-memo
0900: 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ry error occurs 
0910: 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74  while resizing t
0920: 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  he array, return
0930: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
0940: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56  . In this case V
0950: 64 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65  dbe.aOp and Vdbe
0960: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
0970: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28   .** unchanged (
0980: 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  this is so that 
0990: 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65  any opcodes alre
09a0: 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  ady allocated ca
09b0: 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74  n be .** correct
09c0: 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61  ly deallocated a
09d0: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65  long with the re
09e0: 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e  st of the Vdbe).
09f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0a00: 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20  rowOpArray(Vdbe 
0a10: 2a 70 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70  *p){.  VdbeOp *p
0a20: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  New;.  int nNew 
0a30: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  = (p->nOpAlloc ?
0a40: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0a50: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65   (int)(1024/size
0a60: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77  of(Op)));.  pNew
0a70: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a80: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  loc(p->db, p->aO
0a90: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
0aa0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ab0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ac0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
0ad0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
0ae0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29  pNew)/sizeof(Op)
0af0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70  ;.    p->aOp = p
0b00: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
0b10: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45  n (pNew ? SQLITE
0b20: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
0b30: 45 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  EM);.}../*.** Ad
0b40: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b50: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b60: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b70: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b80: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b90: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0ba0: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0bb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0bc0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0be0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bf0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0c10: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c20: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c30: 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20  *    p1, p2, p3 
0c40: 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a       Operands.**
0c50: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
0c60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
0c70: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0c80: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0c90: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0ca0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0cb0: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0cc0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0cd0: 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72  f the P4.** oper
0ce0: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64  te3VdbeAddOp3(Vd
0d00: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0d10: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
0d20: 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p3){.  int i;
0d30: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
0d40: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  .  i = p->nOp;. 
0d50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0d60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0d70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
0d80: 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20  op>0 && op<0xff 
0d90: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41  );.  if( p->nOpA
0da0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69  lloc<=i ){.    i
0db0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
0dc0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0dd0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
0de0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
0df0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
0e00: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
0e10: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
0e20: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0e30: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0e40: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0e50: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0e60: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0e70: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0e80: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
0e90: 5f 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43  _DEBUG.  pOp->zC
0ea0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66  omment = 0;.  if
0eb0: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
0ec0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
0ed0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pTrace ){.    sq
0ee0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
0ef0: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
0f00: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ]);.  }.#endif.#
0f10: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
0f20: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
0f30: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
0f40: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
0f50: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
0f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
0f70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0f80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
0f90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
0fa0: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
0fb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0fc0: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
0fd0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
0fe0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
0ff0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1000: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1030: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1040: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1060: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1070: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1080: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1090: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
10a0: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
10b0: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
10c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10d0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
10e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
10f0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1100: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1120: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1130: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1150: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1160: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1170: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1180: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11a0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
11b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11c0: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
11d0: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
11e0: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
11f0: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
1200: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
1210: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1220: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1230: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1250: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
1260: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
1270: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1280: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50  *.** Add an OP_P
1290: 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64  arseSchema opcod
12a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
12b0: 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66   is broken out f
12c0: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
12d0: 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65  beAddOp4() since
12e0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73   it needs to als
12f0: 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20  o needs to mark 
1300: 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73  all btrees.** as
1310: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65   having been use
1320: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68  d..**.** The zWh
1330: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ere string must 
1340: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
1350: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1360: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69  malloc()..** Thi
1370: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74  s routine will t
1380: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ake ownership of
1390: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
13a0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  emory..*/.void s
13b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
13c0: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20  seSchemaOp(Vdbe 
13d0: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61  *p, int iDb, cha
13e0: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *zWhere){.  in
13f0: 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20  t j;.  int addr 
1400: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1410: 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(p, OP_ParseS
1420: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
1430: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1440: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1450: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
1460: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
1470: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
1480: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
1490: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
14a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
14b0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
14c0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
14d0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
14e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1500: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1510: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1520: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1530: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1550: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1560: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1570: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1580: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1590: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
15a0: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
15b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15d0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
15e0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
15f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1600: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
1610: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
1620: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1630: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1640: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1660: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1670: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1680: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1690: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
16a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
16b0: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
16c0: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
16d0: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
16e0: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
16f0: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1700: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
1710: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
1720: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
1730: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
1740: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
1750: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
1760: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1770: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1780: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1790: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
17a0: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
17b0: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
17c0: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
17d0: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
17e0: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
17f0: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1800: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
1810: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
1820: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
1830: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
1840: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1850: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
1860: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1870: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1880: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1890: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
18a0: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
18b0: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
18c0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
18d0: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
18e0: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
18f0: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1900: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
1910: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
1920: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1930: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
1940: 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61    int i = p->nLa
1950: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1960: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1970: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1980: 69 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d  if( (i & (i-1))=
1990: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  =0 ){.    p->aLa
19a0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52  bel = sqlite3DbR
19b0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e  eallocOrFree(p->
19c0: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a  db, p->aLabel, .
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73         (i*2+1)*s
1a00: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1a10: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1a20: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1a30: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
1a40: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1a50: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
1a60: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
1a70: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
1a80: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
1a90: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
1aa0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
1ab0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
1ac0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
1ad0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1ae0: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
1af0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
1b00: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
1b10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1b20: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1b30: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
1b40: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
1b50: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1b60: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d  ;.  assert( j<p-
1b80: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1b90: 20 6a 3e 3d 30 20 26 26 20 70 2d 3e 61 4c 61 62   j>=0 && p->aLab
1ba0: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1bb0: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
1bc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1bd0: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
1be0: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
1bf0: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
1c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c10: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
1c20: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
1c30: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
1c40: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1c50: 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74  E_DEBUG /* sqlit
1c60: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
1c70: 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a  () logic */../*.
1c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1c90: 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69   type and functi
1ca0: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  on are used to i
1cb0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
1cc0: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e  ll opcodes.** in
1cd0: 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f   a Vdbe main pro
1ce0: 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66  gram and each of
1cf0: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
1d00: 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20  s (triggers) it 
1d10: 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64  may .** invoke d
1d20: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
1d30: 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64  ectly. It should
1d40: 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c   be used as foll
1d50: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20  ows:.**.**   Op 
1d60: 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f  *pOp;.**   VdbeO
1d70: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a  pIter sIter;.**.
1d80: 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74  **   memset(&sIt
1d90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
1da0: 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65  ter));.**   sIte
1db0: 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20  r.v = v;        
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74      // v is of t
1de0: 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20  ype Vdbe* .**   
1df0: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
1e00: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
1e10: 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44  ) ){.**     // D
1e20: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68  o something with
1e30: 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20   pOp.**   }.**  
1e40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
1e50: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
1e60: 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64  b);.** .*/.typed
1e70: 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70  ef struct VdbeOp
1e80: 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b  Iter VdbeOpIter;
1e90: 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74  .struct VdbeOpIt
1ea0: 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  er {.  Vdbe *v; 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65    /* Vdbe to ite
1ed0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1ee0: 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20   opcodes of */. 
1ef0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
1f00: 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  Sub;        /* A
1f10: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
1f20: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  ams */.  int nSu
1f30: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75   entries in apSu
1f60: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72  b */.  int iAddr
1f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f80: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1f90: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1fa0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1fb0: 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20  int iSub;       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1fd0: 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  = main program, 
1fe0: 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72  1 = first sub-pr
1ff0: 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b  ogram etc. */.};
2000: 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74  .static Op *opIt
2010: 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65  erNext(VdbeOpIte
2020: 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76  r *p){.  Vdbe *v
2030: 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70   = p->v;.  Op *p
2040: 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61  Ret = 0;.  Op *a
2050: 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a  Op;.  int nOp;..
2060: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70    if( p->iSub<=p
2070: 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69  ->nSub ){..    i
2080: 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b  f( p->iSub==0 ){
2090: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e  .      aOp = v->
20a0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
20b0: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c   v->nOp;.    }el
20c0: 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  se{.      aOp = 
20d0: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
20e0: 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  -1]->aOp;.      
20f0: 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  nOp = p->apSub[p
2100: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a  ->iSub-1]->nOp;.
2110: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2120: 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29  ( p->iAddr<nOp )
2130: 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61  ;..    pRet = &a
2140: 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20  Op[p->iAddr];.  
2150: 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20    p->iAddr++;.  
2160: 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d    if( p->iAddr==
2170: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  nOp ){.      p->
2180: 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d  iSub++;.      p-
2190: 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  >iAddr = 0;.    
21a0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65  }.  .    if( pRe
21b0: 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  t->p4type==P4_SU
21c0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
21d0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
21e0: 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66  ->nSub+1)*sizeof
21f0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
2200: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2210: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
2220: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
2230: 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62      if( p->apSub
2240: 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50  [j]==pRet->p4.pP
2250: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
2260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2270: 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  ( j==p->nSub ){.
2280: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
2290: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
22a0: 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c  locOrFree(v->db,
22b0: 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65   p->apSub, nByte
22c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
22d0: 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20  p->apSub ){.    
22e0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
22f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2300: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75           p->apSu
2310: 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70  b[p->nSub++] = p
2320: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2330: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2340: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2350: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
2360: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
2370: 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72  the program stor
2380: 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73  ed in the VM ass
2390: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61  ociated with pPa
23a0: 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  rse may.** throw
23b0: 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
23c0: 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65  ion (causing the
23d0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
23e0: 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73  not entire trans
23f0: 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  action.** to be 
2400: 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68  rolled back). Th
2410: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
2420: 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  true if the main
2430: 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a   program or any.
2440: 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  ** sub-programs 
2450: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20  contains any of 
2460: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2470: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  *.**   *  OP_Hal
2480: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  t with P1=SQLITE
2490: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
24a0: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
24b0: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75    *  OP_HaltIfNu
24c0: 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  ll with P1=SQLIT
24d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
24e0: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
24f0: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79     *  OP_Destroy
2500: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64  .**   *  OP_VUpd
2510: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  ate.**   *  OP_V
2520: 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f  Rename.**   *  O
2530: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68  P_FkCounter with
2540: 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74   P2==0 (immediat
2550: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
2560: 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20  nstraint).**.** 
2570: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
2580: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
2590: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
25a0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
25b0: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
25c0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
25d0: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
25e0: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
25f0: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
2600: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
2610: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
2620: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
2630: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
2640: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
2650: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
2660: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
2670: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
2680: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
2690: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
26a0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
26b0: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
26c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
26d0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
26e0: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
26f0: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
2700: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  bort = 0;.  Op *
2710: 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65  pOp;.  VdbeOpIte
2720: 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65  r sIter;.  memse
2730: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2740: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73  eof(sIter));.  s
2750: 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77  Iter.v = v;..  w
2760: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
2770: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
2780: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  !=0 ){.    int o
2790: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
27a0: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  ode;.    if( opc
27b0: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
27c0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
27d0: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
27e0: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66  =OP_VRename .#if
27f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2800: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
2810: 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50    || (opcode==OP
2820: 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f  _FkCounter && pO
2830: 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d  p->p1==0 && pOp-
2840: 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a  >p2==1) .#endif.
2850: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
2860: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
2870: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
2880: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
2890: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
28a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
28b0: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
28c0: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
28d0: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
28e0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
28f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2900: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
2910: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
2920: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
2930: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
2940: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
2950: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2960: 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66  ccurred..  ** If
2970: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2980: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2990: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
29a0: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
29b0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
29c0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
29d0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
29e0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
29f0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2a00: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2a10: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
2a20: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
2a30: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
2a40: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
2a50: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
2a60: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2a70: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2a80: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2a90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2aa0: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2ab0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2ac0: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2ad0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2ae0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2af0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2b00: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2b10: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
2b20: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2b30: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
2b40: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
2b50: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
2b60: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
2b70: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2b80: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2b90: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2bb0: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2bc0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2bd0: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2be0: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2bf0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2c00: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2c10: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2c20: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2c30: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2c40: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2c50: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2c60: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2c70: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2c80: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2c90: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2ca0: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2cb0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2cc0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2cd0: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2cf0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2d00: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2d10: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2d20: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2d30: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2d40: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2d50: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2d60: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2d70: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2d80: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
2d90: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
2da0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
2db0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
2dc0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
2dd0: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
2de0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
2df0: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
2e00: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
2e10: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
2e20: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
2e30: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
2e40: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
2e50: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
2e60: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75        case OP_Fu
2e70: 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61  nction:.      ca
2e80: 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
2e90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
2ea0: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
2eb0: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
2ec0: 70 35 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p5;.        brea
2ed0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2ee0: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
2ef0: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
2f00: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
2f10: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2f20: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
2f30: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
2f40: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
2f50: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
2f60: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
2f70: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
2f80: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
2f90: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2fa0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
2fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2fc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
2fd0: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
2fe0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
2ff0: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
3000: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
3010: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
3020: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
3030: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
3040: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
3050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
3060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3070: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
3080: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
3090: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
30a0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
30b0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
30c0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
30d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30e0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
30f0: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
3100: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
3110: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3120: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
3130: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
3140: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
3150: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
3160: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
3170: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
3180: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3190: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
31a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
31b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
31c0: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
31d0: 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72    case OP_Sorter
31e0: 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  Next: {.        
31f0: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3200: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
3210: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ext;.        pOp
3220: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
3230: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
3240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3250: 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76      case OP_Prev
3260: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
3270: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
3280: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
3290: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
32a0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
32b0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
32c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32d0: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
32e0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
32f0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
3300: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
3310: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
3320: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
3330: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
3340: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
3350: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
3360: 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   );.      pOp->p
3370: 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f  2 = aLabel[-1-pO
3380: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20  p->p2];.    }.  
3390: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
33a0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
33b0: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
33c0: 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e   = 0;.  *pMaxFun
33d0: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
33e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ;.  assert( p->b
33f0: 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 70  IsReader!=0 || p
3400: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3420: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
3430: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
3440: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
3450: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
3460: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3470: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
3480: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3490: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
34a0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
34b0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  >nOp;.}../*.** T
34c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
34d0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
34e0: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
34f0: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
3500: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
3510: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
3520: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3530: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
3540: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
3550: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
3560: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
3570: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
3580: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
3590: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
35a0: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
35b0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
35c0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
35d0: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
35e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
35f0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
3600: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
3610: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
3620: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
3630: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
3640: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
3650: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
3660: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
3670: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
3680: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
3690: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
36a0: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
36b0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
36c0: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
36d0: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
36e0: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
36f0: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
3700: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
3710: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
3720: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3730: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
3740: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
3750: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
3760: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
3770: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
3780: 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61  sert( p->btreeMa
3790: 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f  sk==0 );..  reso
37a0: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
37b0: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
37c0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
37d0: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
37e0: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
37f0: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
3800: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
3810: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
3820: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
3830: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
3840: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
3850: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
3860: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
3870: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
3880: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
3890: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
38a0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
38b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
38c0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
38d0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
38e0: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f  Op + nOp > p->nO
38f0: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
3900: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
3910: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3920: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
3930: 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e   if( ALWAYS(nOp>
3940: 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0) ){.    int i;
3950: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
3960: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
3970: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3980: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
3990: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
39a0: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
39b0: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
39c0: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
39d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
39e0: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
39f0: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
3a00: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
3a10: 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 28     if( p2<0 && (
3a20: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
3a30: 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f  perty[pOut->opco
3a40: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  de] & OPFLG_JUMP
3a50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3a60: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
3a70: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
3a80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3a90: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
3aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3ab0: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
3ac0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
3ad0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3ae0: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
3af0: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
3b00: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
3b10: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b20: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
3b30: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  mment = 0;.     
3b40: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
3b50: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
3b60: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
3b70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3b80: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
3b90: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
3ba0: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
3bb0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
3bc0: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
3bd0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
3be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3bf0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3c00: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
3c10: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3c20: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
3c30: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
3c40: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
3c50: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
3c60: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
3c70: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
3c80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3c90: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
3ca0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
3cb0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
3cc0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
3cd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3ce0: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
3cf0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
3d00: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3d10: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28   p!=0 );.  if( (
3d20: 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64  (u32)p->nOp)>add
3d30: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3d40: 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a  addr].p1 = val;.
3d50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3d60: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3d70: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
3d80: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3d90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3da0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3db0: 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e  seful for settin
3dc0: 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  g a jump destina
3dd0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3de0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3df0: 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  2(Vdbe *p, u32 a
3e00: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3e10: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3e20: 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e  .  if( ((u32)p->
3e30: 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20  nOp)>addr ){.   
3e40: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
3e50: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
3e60: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3e70: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
3e80: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3e90: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3ea0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3eb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3ec0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
3ed0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
3ee0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3ef0: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
3f00: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
3f10: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d  ->aOp[addr].p3 =
3f20: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
3f30: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3f40: 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70  lue of the P5 op
3f50: 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f  erand for the mo
3f60: 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61  st recently.** a
3f70: 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  dded operation..
3f80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3f90: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
3fa0: 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20   *p, u8 val){.  
3fb0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3fc0: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
3fd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
3fe0: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61  Op>0 );.    p->a
3ff0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
4000: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
4010: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
4020: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
4030: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
4040: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
4050: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
4060: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
4070: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
4080: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
4090: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
40a0: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
40b0: 61 64 64 72 29 7b 0a 20 20 69 66 28 20 41 4c 57  addr){.  if( ALW
40c0: 41 59 53 28 61 64 64 72 3e 3d 30 29 20 29 20 73  AYS(addr>=0) ) s
40d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
40e0: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
40f0: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
4100: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
4110: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
4120: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
4130: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
4140: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
4150: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
4160: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
4170: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
4180: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4190: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
41a0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
41b0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44  .  if( ALWAYS(pD
41c0: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 75  ef) && (pDef->fu
41d0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
41e0: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
41f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
4200: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
4210: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
4220: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
4230: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70  ay(sqlite3 *, Op
4240: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
4250: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
4260: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
4270: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4280: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a  freeP4(sqlite3 *
4290: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20  db, int p4type, 
42a0: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28  void *p4){.  if(
42b0: 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72   p4 ){.    asser
42c0: 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69  t( db );.    swi
42d0: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
42e0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41       case P4_REA
42f0: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  L:.      case P4
4300: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61  _INT64:.      ca
4310: 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P4_DYNAMIC:. 
4320: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
4330: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
4340: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20   P4_INTARRAY:.  
4350: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
4360: 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20  NFO_HANDOFF: {. 
4370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4380: 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20  Free(db, p4);.  
4390: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
43a0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
43b0: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
43c0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
43d0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
43e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
43f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4410: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
4420: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
4430: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4440: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4450: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4470: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
4480: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4490: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
44a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
44b0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
44c0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
44d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
44e0: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
44f0: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
4500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4510: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
4520: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
4530: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4540: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
4550: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4570: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
4580: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4590: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
45a0: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
45b0: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
45c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
45d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
45e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
45f0: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
4600: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
4610: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
4620: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
4630: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
4640: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
4650: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
4660: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
4670: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
4680: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
4690: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
46a0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
46b0: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
46c0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
46d0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
46e0: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
46f0: 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e  =aOp; pOp<&aOp[n
4700: 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  Op]; pOp++){.   
4710: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
4720: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4730: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
4740: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
4750: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4760: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
4770: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
4780: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4790: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
47a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
47b0: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
47c0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
47d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
47e0: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
47f0: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
4800: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
4810: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
4820: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
4830: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
4840: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
4850: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
4860: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
4870: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
4880: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
4890: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
48a0: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
48b0: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
48c0: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
48d0: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
48e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
48f0: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
4900: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
4910: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4920: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
4930: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4940: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70  r){.  if( p->aOp
4950: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
4960: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
4970: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
4980: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
4990: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
49a0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
49b0: 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  4.p);.    memset
49c0: 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pOp, 0, sizeof(
49d0: 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f  pOp[0]));.    pO
49e0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
49f0: 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  oop;.  }.}../*.*
4a00: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4a10: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
4a20: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4a30: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4a40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4a50: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
4a60: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
4a70: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
4a80: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
4a90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
4aa0: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
4ab0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
4ac0: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
4ad0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
4ae0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
4af0: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
4b00: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
4b10: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
4b20: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
4b30: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
4b40: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4b50: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4b60: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
4b70: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
4b80: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
4b90: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
4ba0: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
4bb0: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
4bc0: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
4bd0: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
4be0: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49   of zP4..**.** I
4bf0: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  f n==P4_KEYINFO 
4c00: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
4c10: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
4c20: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
4c30: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
4c40: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
4c50: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4c60: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4c70: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
4c80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
4c90: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
4ca0: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
4cb0: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f  lized..** n==P4_
4cc0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
4cd0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
4ce0: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P4 points to a K
4cf0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4d00: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
4d10: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
4d20: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
4d30: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4d40: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
4d50: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
4d60: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
4d70: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
4d80: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4d90: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
4da0: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
4db0: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
4dc0: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
4dd0: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
4de0: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
4df0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
4e00: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
4e10: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
4e20: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
4e30: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
4e40: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
4e50: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
4e60: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
4e70: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
4e80: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
4e90: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
4ea0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
4eb0: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
4ec0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4ed0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4ee0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4ef0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
4f00: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP4, int n){.  O
4f10: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65  p *pOp;.  sqlite
4f20: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28  3 *db;.  assert(
4f30: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
4f40: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
4f50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
4f60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
4f70: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  if( p->aOp==0 ||
4f80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
4f90: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21  d ){.    if ( n!
4fa0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e  =P4_KEYINFO && n
4fb0: 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20  !=P4_VTAB ) {.  
4fc0: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e      freeP4(db, n
4fd0: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
4fe0: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP4);.    }. 
4ff0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5000: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5010: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
5020: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
5030: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
5040: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
5050: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
5060: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
5070: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5080: 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45  4type==P4_NOTUSE
5090: 44 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65  D || pOp->p4type
50a0: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
50b0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
50c0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
50d0: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p);.  pOp->p4.p 
50e0: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34  = 0;.  if( n==P4
50f0: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
5100: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
5110: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
5120: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
5130: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
5140: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
5150: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
5160: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
5170: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
5180: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
5190: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
51a0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
51b0: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
51c0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
51d0: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
51e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
51f0: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
5200: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
5210: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
5220: 6e 66 6f 20 2a 70 4f 72 69 67 2c 20 2a 70 4e 65  nfo *pOrig, *pNe
5230: 77 3b 0a 0a 20 20 20 20 70 4f 72 69 67 20 3d 20  w;..    pOrig = 
5240: 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 3b 0a 20  (KeyInfo*)zP4;. 
5250: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
5260: 6e 66 6f 20 3d 20 70 4e 65 77 20 3d 20 73 71 6c  nfo = pNew = sql
5270: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
5280: 28 64 62 2c 20 70 4f 72 69 67 2d 3e 6e 46 69 65  (db, pOrig->nFie
5290: 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ld);.    if( pNe
52a0: 77 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  w ){.      memcp
52b0: 79 28 70 4e 65 77 2d 3e 61 43 6f 6c 6c 2c 20 70  y(pNew->aColl, p
52c0: 4f 72 69 67 2d 3e 61 43 6f 6c 6c 2c 20 70 4f 72  Orig->aColl, pOr
52d0: 69 67 2d 3e 6e 46 69 65 6c 64 2a 73 69 7a 65 6f  ig->nField*sizeo
52e0: 66 28 70 4e 65 77 2d 3e 61 43 6f 6c 6c 5b 30 5d  f(pNew->aColl[0]
52f0: 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ));.      memcpy
5300: 28 70 4e 65 77 2d 3e 61 53 6f 72 74 4f 72 64 65  (pNew->aSortOrde
5310: 72 2c 20 70 4f 72 69 67 2d 3e 61 53 6f 72 74 4f  r, pOrig->aSortO
5320: 72 64 65 72 2c 20 70 4f 72 69 67 2d 3e 6e 46 69  rder, pOrig->nFi
5330: 65 6c 64 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  eld);.      pOp-
5340: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
5350: 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  INFO;.    }else{
5360: 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61  .      p->db->ma
5370: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
5380: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
5390: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
53a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
53b0: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  ( n==P4_KEYINFO_
53c0: 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70  HANDOFF ){.    p
53d0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
53e0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
53f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
5400: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
5410: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
5420: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5430: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5440: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5450: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
5460: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
5470: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
5480: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
5490: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
54a0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
54b0: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
54c0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
54d0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
54e0: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
54f0: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
5500: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
5510: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
5520: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
5530: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
5540: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
5550: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
5560: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
5570: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  AMIC;.  }.}..#if
5580: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
5590: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
55a0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  ment on the most
55b0: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
55c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
55d0: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
55e0: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
55f0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
5600: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
5610: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
5620: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
5630: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
5640: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
5650: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
5660: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
5670: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
5680: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
5690: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
56a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
56b0: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
56c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
56d0: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
56e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
56f0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
5700: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
5710: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
5720: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
5730: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
5740: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5750: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
5760: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
5770: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5780: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
5790: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
57a0: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
57b0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
57c0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
57d0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
57e0: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
57f0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
5800: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
5810: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
5820: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5830: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
5840: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
5850: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
5860: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
5870: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
5880: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
5890: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
58a0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
58b0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
58c0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
58d0: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
58e0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
58f0: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
5900: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5910: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
5920: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
5930: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
5940: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
5950: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
5960: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
5970: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
5980: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
5990: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
59a0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
59b0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
59c0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
59d0: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
59e0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
59f0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
5a00: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
5a10: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
5a20: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
5a30: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
5a40: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
5a50: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
5a60: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
5a70: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
5a80: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
5a90: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
5aa0: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
5ab0: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
5ac0: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
5ad0: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
5ae0: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
5af0: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
5b00: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f  ng.** after a OO
5b10: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
5b20: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
5b30: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
5b40: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
5b50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
5b60: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
5b70: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
5b80: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
5b90: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
5ba0: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
5bb0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
5bc0: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
5bd0: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
5be0: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
5bf0: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a  h Valgrind..**.*
5c00: 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66 64  * About the #ifd
5c10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
5c20: 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c  RACE:  Normally,
5c30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5c40: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a   never called.**
5c50: 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30   unless p->nOp>0
5c60: 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75  .  This is becau
5c70: 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73  se in the absens
5c80: 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
5c90: 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50  _TRACE,.** an OP
5ca0: 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74 69  _Trace instructi
5cb0: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73  on is always ins
5cc0: 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  erted by sqlite3
5cd0: 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f  VdbeGet() as soo
5ce0: 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44  n as.** a new VD
5cf0: 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  BE is created.  
5d00: 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20 74  So we are free t
5d10: 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d  o set addr to p-
5d20: 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a  >nOp-1 without.*
5d30: 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62  * having to doub
5d40: 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  le-check to make
5d50: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
5d60: 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67  esult is non-neg
5d70: 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66  ative. But.** if
5d80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5d90: 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  CE is defined, t
5da0: 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f  he OP_Trace is o
5db0: 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f  mitted and we do
5dc0: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63   need to.** chec
5dd0: 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  k the value of p
5de0: 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63  ->nOp-1 before c
5df0: 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64  ontinuing..*/.Vd
5e00: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
5e10: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
5e20: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
5e30: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
5e40: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
5e50: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
5e60: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
5e70: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
5e80: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
5e90: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
5ea0: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
5eb0: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
5ec0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
5ed0: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
5ee0: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
5ef0: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
5f00: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
5f10: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5f20: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5f30: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23   if( addr<0 ){.#
5f40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5f50: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
5f60: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75  p->nOp==0 ) retu
5f70: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
5f80: 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  my;.#endif.    a
5f90: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
5fa0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5fb0: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
5fc0: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
5fd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5fe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
5ff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
6000: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65      return (Vdbe
6010: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65  Op*)&dummy;.  }e
6020: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6030: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
6040: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
6050: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
6060: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
6070: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
6080: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
6090: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
60a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
60b0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
60c0: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
60d0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
60e0: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
60f0: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
6100: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
6110: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
6120: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
6130: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
6140: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
6150: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
6160: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
6170: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
6180: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
6190: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
61a0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
61b0: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
61c0: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
61d0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
61e0: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
61f0: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
6200: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6210: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
6220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6230: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6240: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
6250: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6260: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6270: 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65  keyinfo(%d", pKe
6280: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a  yInfo->nField);.
6290: 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65        i = sqlite
62a0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29  3Strlen30(zTemp)
62b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
62c0: 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   j<pKeyInfo->nFi
62d0: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
62e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
62f0: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
6300: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
6310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
6320: 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c  l = pColl ? pCol
6330: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22  l->zName : "nil"
6340: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
6350: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6360: 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  0(zColl);.      
6370: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
6380: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
6390: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
63a0: 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20  ",...",4);.     
63b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
63c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54      }.        zT
63d0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[i++] = ',';.
63e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
63f0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6400: 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
6410: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
6420: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
6430: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
6440: 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b  mp[i], zColl, n+
6450: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  1);.        i +=
6460: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
6470: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6480: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
6490: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
64a0: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
64b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
64c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
64d0: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
64e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
64f0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
6500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6510: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6520: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
6530: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
6540: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
6550: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6560: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
6570: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
6580: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
6590: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
65a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
65b0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
65c0: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
65d0: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
65e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
65f0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
6600: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
6610: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6620: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
6630: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
6640: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6650: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6660: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
6670: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6680: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6690: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
66a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
66b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
66c0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
66d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
66e0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
66f0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
6700: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
6710: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6720: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
6730: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
6740: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
6750: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
6760: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
6770: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
6780: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
6790: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
67a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
67b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
67c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
67d0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
67e0: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
67f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6800: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
6810: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
6820: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6830: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6840: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
6850: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6860: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6870: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
6880: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6890: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
68a0: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
68b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
68c0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
68d0: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
68e0: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
68f0: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
6900: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6910: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6920: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6930: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
6940: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
6950: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
6960: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
6970: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
6980: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6990: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
69a0: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
69b0: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
69c0: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
69d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
69e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
69f0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
6a00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6a10: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
6a20: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
6a30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6a40: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
6a50: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
6a60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6a70: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
6a80: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
6a90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6aa0: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
6ab0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
6ac0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
6ad0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6ae0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
6af0: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
6b00: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
6b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
6b20: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6b30: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6b40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6b50: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6b60: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6b70: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6b80: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6b90: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6ba0: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6bb0: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6bc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6bd0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6be0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
6bf0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
6c00: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
6c10: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6c20: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
6c30: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
6c40: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
6c50: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
6c60: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
6c70: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
6c80: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
6c90: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
6ca0: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
6cb0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
6cc0: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
6cd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6ce0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
6cf0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
6d00: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
6d10: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
6d20: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
6d30: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
6d40: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
6d50: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
6d60: 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74  sk)*8 );.  p->bt
6d70: 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62  reeMask |= ((yDb
6d80: 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66  Mask)1)<<i;.  if
6d90: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
6da0: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
6db0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
6dc0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b  ) ){.    p->lock
6dd0: 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
6de0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a  k)1)<<i;.  }.}..
6df0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6e00: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
6e10: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
6e20: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
6e30: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
6e40: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
6e50: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
6e60: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
6e70: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
6e80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
6e90: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
6ea0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
6eb0: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
6ec0: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
6ed0: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
6ee0: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
6ef0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
6f00: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61  In doing so it a
6f10: 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  lso.** sets the 
6f20: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
6f30: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
6f40: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
6f50: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
6f60: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
6f70: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
6f80: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
6f90: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
6fa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
6fb0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
6fc0: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
6fd0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
6fe0: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
6ff0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
7000: 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  r() is invoked t
7010: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
7020: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
7030: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
7040: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
7050: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
7060: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
7070: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
7080: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a  ed with the VM..
7090: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
70a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
70b0: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
70c0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
70d0: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
70e0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
70f0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
7100: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69   p->btreeMask fi
7110: 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b  eld is a bitmask
7120: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74   of all btrees t
7130: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
7140: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70   .** statement p
7150: 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20   will ever use. 
7160: 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75   Let N be the nu
7170: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
7180: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20  p->btreeMask.** 
7190: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
71a0: 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65   btrees that use
71b0: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
71c0: 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65  Then the runtime
71d0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   of.** this rout
71e0: 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74  ine is N*N.  But
71f0: 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20   as N is rarely 
7200: 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69  more than 1, thi
7210: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  s should not.** 
7220: 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
7230: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7240: 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  eEnter(Vdbe *p){
7250: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d  .  int i;.  yDbM
7260: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69  ask mask;.  sqli
7270: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
7280: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
7290: 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   if( p->lockMask
72a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
72b0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
72c0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
72d0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
72e0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
72f0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  nDb;.  for(i=0, 
7300: 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69  mask=1; i<nDb; i
7310: 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b  ++, mask += mask
7320: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
7330: 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f  && (mask & p->lo
7340: 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c  ckMask)!=0 && AL
7350: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
7360: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
7370: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
7380: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
7390: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
73a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
73b0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
73c0: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
73d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
73e0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
73f0: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
7400: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
7410: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
7420: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
7430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7440: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
7450: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44  ){.  int i;.  yD
7460: 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71  bMask mask;.  sq
7470: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
7480: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
7490: 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61  .  if( p->lockMa
74a0: 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  sk==0 ) return; 
74b0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
74c0: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d  ase */.  db = p-
74d0: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
74e0: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
74f0: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
7500: 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b  , mask=1; i<nDb;
7510: 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61   i++, mask += ma
7520: 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  sk){.    if( i!=
7530: 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e  1 && (mask & p->
7540: 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20  lockMask)!=0 && 
7550: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
7560: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
7570: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
7580: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
7590: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
75a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
75b0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
75c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
75d0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
75e0: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
75f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7600: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
7610: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
7620: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
7630: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
7640: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
7650: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
7660: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
7670: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
7680: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
7690: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
76a0: 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20 25  d %4d %4d %-4s %
76b0: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
76c0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
76d0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
76e0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
76f0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
7700: 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  tr));.  fprintf(
7710: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
7720: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
7730: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
7740: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
7750: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
7760: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
7770: 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p5,.#ifdef SQLIT
7780: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
7790: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f  p->zComment ? pO
77a0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22  p->zComment : ""
77b0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a  .#else.      "".
77c0: 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66  #endif.  );.  ff
77d0: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
77e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ndif../*.** Rele
77f0: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
7800: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
7810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7820: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
7830: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
7840: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
7850: 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20    Mem *pEnd;.   
7860: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7870: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
7880: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
7890: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
78a0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
78b0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
78c0: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b   for(pEnd=&p[N];
78d0: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
78e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
78f0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
7900: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  loc);.      }.  
7910: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7920: 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26  }.    for(pEnd=&
7930: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
7940: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
7950: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
7960: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
7970: 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  .db );..      /*
7980: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
7990: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
79a0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
79b0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
79c0: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
79d0: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
79e0: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
79f0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
7a00: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
7a10: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
7a20: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
7a30: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
7a40: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
7a50: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
7a60: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
7a70: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
7a80: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
7a90: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
7aa0: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
7ab0: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
7ac0: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
7ad0: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
7ae0: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
7af0: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
7b00: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
7b10: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
7b20: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
7b30: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
7b40: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
7b50: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
7b60: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
7b70: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
7b80: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
7b90: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
7ba0: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
7bb0: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
7bc0: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
7bd0: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
7be0: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
7bf0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
7c00: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
7c10: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
7c20: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
7c30: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
7c40: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
7c50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
7c60: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
7c70: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
7c80: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
7c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ca0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
7cb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7cc0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7ce0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
7cf0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  c);.        p->z
7d00: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
7d10: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
7d20: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69  ags = MEM_Invali
7d30: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  d;.    }.    db-
7d40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7d50: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
7d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
7d70: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
7d80: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
7d90: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
7da0: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
7db0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
7dc0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
7dd0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
7de0: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
7df0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
7e00: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
7e10: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
7e20: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
7e30: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
7e40: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
7e50: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
7e60: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
7e70: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
7e80: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
7e90: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
7ea0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7eb0: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
7ec0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
7ed0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
7ee0: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
7ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
7f00: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
7f10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7f20: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
7f30: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
7f40: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
7f50: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
7f60: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
7f70: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
7f80: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
7f90: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7fa0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
7fb0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
7fc0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
7fd0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
7fe0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
7ff0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
8000: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
8010: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
8020: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
8030: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
8040: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
8050: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
8060: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
8070: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
8080: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
8090: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
80a0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
80b0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
80c0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
80d0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
80e0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
80f0: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
8100: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
8110: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
8120: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
8130: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
8140: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
8150: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
8160: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
8170: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
8180: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
8190: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
81a0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
81b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
81c0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
81d0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
8200: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
8210: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
8220: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8240: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
8250: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
8260: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
8270: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
8280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
8290: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
82a0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
82b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
82c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
82d0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
82e0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
82f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8300: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
8310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8320: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
8330: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
8340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8370: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
8380: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
8390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
83a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
83b0: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
83c0: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
83d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
83e0: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
83f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
8400: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
8410: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
8420: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
8430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
8440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
8450: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
8460: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
8470: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
8480: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
8490: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
84a0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
84b0: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
84c0: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
84d0: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
84e0: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
84f0: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
8500: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
8510: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
8520: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
8530: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
8540: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
8550: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
8560: 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65  em, 8);.  p->pRe
8570: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20  sultSet = 0;..  
8580: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8590: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
85a0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
85b0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
85c0: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
85d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
85e0: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
85f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
8600: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
8610: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
8620: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
8630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8640: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
8650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
8660: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
8670: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
8680: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
8690: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
86a0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
86b0: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
86c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
86d0: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
86e0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
86f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
8700: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
8710: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
8720: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
8730: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
8740: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
8750: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
8760: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
8770: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
8780: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
8790: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
87a0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
87b0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
87c0: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
87d0: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
87e0: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
87f0: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
8800: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
8810: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
8820: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
8830: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
8840: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
8850: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
8860: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
8870: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
8880: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
8890: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
88a0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
88b0: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
88c0: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
88d0: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
88e0: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
88f0: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
8900: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
8910: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
8920: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
8930: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
8940: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
8950: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
8960: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
8970: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
8980: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
8990: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
89a0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
89b0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
89c0: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
89d0: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
89e0: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
89f0: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
8a00: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
8a10: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
8a20: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
8a30: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
8a40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8a50: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
8a60: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
8a70: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
8a80: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
8a90: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
8aa0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
8ab0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
8ac0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8ad0: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
8ae0: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
8af0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
8b00: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
8b10: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8b20: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
8b30: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
8b40: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
8b50: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
8b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8b70: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
8b80: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
8b90: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
8ba0: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
8bb0: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
8bc0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
8bd0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
8be0: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
8bf0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
8c00: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
8c10: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
8c20: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
8c30: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
8c40: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
8c50: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
8c60: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
8c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8c80: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
8c90: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
8ca0: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
8cb0: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
8cc0: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
8cd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8ce0: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
8cf0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
8d00: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
8d10: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
8d20: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
8d30: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
8d40: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
8d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
8d60: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
8d70: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
8d80: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
8d90: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
8da0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8db0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
8dc0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8dd0: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
8de0: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
8e10: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
8e20: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
8e30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
8e40: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
8e50: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
8e60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
8e70: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
8e80: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8e90: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
8ea0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
8eb0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8ec0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8ed0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8ee0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
8ef0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
8f00: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
8f10: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
8f20: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
8f30: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
8f40: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
8f50: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
8f60: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
8f70: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
8f80: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
8f90: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
8fa0: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
8fb0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
8fc0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
8fd0: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
8fe0: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
8ff0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
9000: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
9010: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
9020: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
9030: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
9040: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
9050: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
9060: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
9070: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
9080: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
9090: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
90a0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
90b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
90c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
90d0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
90e0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
90f0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
9100: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
9110: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
9120: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
9130: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
9140: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
9150: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
9160: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
9170: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
9180: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
9190: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53          apSub[nS
91a0: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ub++] = pOp->p4.
91b0: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
91c0: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
91d0: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
91e0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
91f0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
9200: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
9210: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9220: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
9230: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
9240: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
9250: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
9280: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
9290: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
92a0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
92b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
92c0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
92d0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
9300: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9310: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
9320: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9330: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9340: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
9350: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
9380: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
9390: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
93a0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
93b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
93c0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
93d0: 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20   32, 0) ){      
93e0: 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20        /* P4 */. 
93f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9400: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9410: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
9420: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9430: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66     }.    pMem->f
9440: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
9450: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
9460: 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79  .    z = display
9470: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
9480: 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21   32);.    if( z!
9490: 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  =pMem->z ){.    
94a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
94b0: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20  SetStr(pMem, z, 
94c0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
94d0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
94e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
94f0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
9500: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
9510: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
9520: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
9530: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
9540: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
9550: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9560: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
9570: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
9580: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
9590: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
95a0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
95b0: 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 4, 0) ){.     
95c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
95d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
95e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
95f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
9610: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
9620: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
9630: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
9640: 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  >n = 2;.      sq
9650: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
9660: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78  , pMem->z, "%.2x
9670: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
9680: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P5 */.      pM
9690: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
96a0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
96b0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
96c0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
96d0: 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53  m++;.  .#ifdef S
96e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
96f0: 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d    if( pOp->zComm
9700: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ent ){.        p
9710: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9720: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
9730: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d         pMem->z =
9740: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a   pOp->zComment;.
9750: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
9760: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9770: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
9780: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
9790: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
97a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
97b0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
97c0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
97d0: 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
97e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
97f0: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20  /* Comment */.  
9820: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
9830: 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a   = SQLITE_NULL;.
9840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9850: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
9860: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
9870: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
9880: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
9890: 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d  >aMem[1];.    p-
98a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
98b0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
98c0: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
98d0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
98e0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
98f0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
9900: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
9910: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
9920: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
9930: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
9940: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
9950: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9960: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
9970: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
9980: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
9990: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
99a0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
99b0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
99c0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
99d0: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
99e0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
99f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9a00: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
9a10: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
9a20: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
9a30: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
9a40: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
9a50: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
9a60: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9a70: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
9a80: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9a90: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
9aa0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
9ab0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
9ac0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
9ad0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9ae0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
9af0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9b00: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
9b10: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
9b20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
9b30: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
9b40: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
9b50: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
9b60: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
9b70: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
9b80: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
9b90: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
9ba0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
9bb0: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
9bc0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9bd0: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
9be0: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
9bf0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
9c00: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9c10: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
9c20: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
9c30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9c40: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9c50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
9c60: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
9c70: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
9c80: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
9c90: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9ca0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
9cb0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
9cc0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
9cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
9ce0: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
9cf0: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9d00: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9d10: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
9d20: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9d30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
9d40: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
9d50: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
9d60: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
9d70: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
9d80: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
9d90: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9da0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
9db0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
9dc0: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
9dd0: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
9de0: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
9df0: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
9e00: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
9e10: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
9e20: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
9e30: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
9e40: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
9e50: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
9e60: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
9e70: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
9e80: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
9e90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
9ea0: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
9eb0: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
9ec0: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
9ed0: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
9ee0: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
9ef0: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
9f00: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
9f10: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
9f20: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
9f30: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9f40: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
9f50: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
9f60: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f  ppFrom points to
9f70: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
9f80: 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73   and pEnd points
9f90: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9fa0: 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  he.** available 
9fb0: 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61  space.  When spa
9fc0: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ce is allocated,
9fd0: 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61   *ppFrom is adva
9fe0: 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65  nced past.** the
9ff0: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
a000: 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a  cated space..**.
a010: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
a020: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
a030: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
a040: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
a050: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
a060: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
a070: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
a080: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
a090: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
a0a0: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
a0b0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
a0c0: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
a0d0: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
a0e0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
a0f0: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
a100: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
a110: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
a120: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77  return pointer w
a130: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f  ill be stored */
a140: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
a150: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a160: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c  r of bytes to al
a170: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a  locate */.  u8 *
a180: 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  *ppFrom,        
a190: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f   /* IN/OUT: Allo
a1a0: 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f  cate from *ppFro
a1b0: 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c  m */.  u8 *pEnd,
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a1d0: 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65  ointer to 1 byte
a1e0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a1f0: 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20   *ppFrom buffer 
a200: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65  */.  int *pnByte
a210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
a220: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
a230: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
a240: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
a250: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
a260: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
a270: 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20  T(*ppFrom) );.  
a280: 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72  if( pBuf ) retur
a290: 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20  n pBuf;.  nByte 
a2a0: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
a2b0: 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d  .  if( &(*ppFrom
a2c0: 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64  )[nByte] <= pEnd
a2d0: 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28   ){.    pBuf = (
a2e0: 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  void*)*ppFrom;. 
a2f0: 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42     *ppFrom += nB
a300: 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  yte;.  }else{.  
a310: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
a320: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
a330: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
a340: 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20  Rewind the VDBE 
a350: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
a360: 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61  nning in prepara
a370: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e  tion for.** runn
a380: 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ing it..*/.void 
a390: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
a3a0: 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20  d(Vdbe *p){.#if 
a3b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
a3c0: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
a3d0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
a3e0: 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20   int i;.#endif. 
a3f0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
a400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
a410: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
a420: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
a430: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
a440: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
a450: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
a460: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
a470: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
a480: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
a490: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
a4a0: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
a4b0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a4c0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
a4d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a4e0: 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  UG.  for(i=1; i<
a4f0: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
a500: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
a510: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
a520: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
a530: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
a540: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
a550: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
a560: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
a570: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
a580: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
a590: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
a5a0: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
a5b0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
a5c0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
a5d0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
a5e0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
a5f0: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
a600: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
a610: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a620: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
a630: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
a640: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
a650: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
a660: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
a670: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
a680: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
a690: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
a6a0: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
a6b0: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
a6c0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a6d0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
a6e0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
a6f0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
a700: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
a710: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
a720: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
a730: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
a740: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
a750: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
a760: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
a770: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
a780: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
a790: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
a7a0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
a7b0: 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63  called exact onc
a7c0: 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74  e on a each virt
a7d0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
a7e0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
a7f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
a800: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
a810: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
a820: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
a830: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
a840: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
a850: 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a  uther calls to .
a860: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
a870: 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  dOp() functions 
a880: 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20  are prohibited. 
a890: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69   This routine di
a8a0: 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65  sconnects.** the
a8b0: 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50   Vdbe from the P
a8c0: 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74  arse object that
a8d0: 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65   helped generate
a8e0: 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a   it so that the.
a8f0: 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f  ** the Vdbe beco
a900: 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65  mes an independe
a910: 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68  nt entity and th
a920: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63  e Parse object c
a930: 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79  an be.** destroy
a940: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ed..**.** Use th
a950: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  e sqlite3VdbeRew
a960: 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20  ind() procedure 
a970: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72  to restore a vir
a980: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63  tual machine bac
a990: 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74  k.** to its init
a9a0: 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20  ial state after 
a9b0: 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e  it has been run.
a9c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a9d0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
a9e0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
aa10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20   Parse *pParse  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
aa40: 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  xt */.){.  sqlit
aa50: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
aa60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aa70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
aa80: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
aa90: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
aaa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
aab0: 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  er of parameters
aac0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aaf0: 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69  f VM memory regi
ab00: 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sters */.  int n
ab10: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ab30: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72  ber of cursors r
ab40: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
ab50: 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ab70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
ab80: 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d  ts in subprogram
ab90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65  s */.  int nOnce
aba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
abb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
abc0: 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  of OP_Once instr
abd0: 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  uctions */.  int
abe0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ac00: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
ac10: 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20   u8 *zCsr;      
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61  /* Memory availa
ac40: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  ble for allocati
ac50: 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64  on */.  u8 *zEnd
ac60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac70: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
ac80: 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61  byte past alloca
ac90: 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ted memory */.  
aca0: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
acc0: 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61  * How much extra
acd0: 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65   memory is neede
ace0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
acf0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
ad00: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
ad10: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
ad20: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ad30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
ad40: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 64 62  GIC_INIT );.  db
ad50: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
ad60: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
ad70: 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61  iled==0 );.  nVa
ad80: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  r = pParse->nVar
ad90: 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  nMem = pPars
ada0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73  e->nMem;.  nCurs
adb0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
adc0: 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72  b;.  nArg = pPar
add0: 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e  se->nMaxArg;.  n
ade0: 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Once = pParse->n
adf0: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63  Once;.  if( nOnc
ae00: 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31  e==0 ) nOnce = 1
ae10: 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c  ; /* Ensure at l
ae20: 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e  east one byte in
ae30: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20   p->aOnceFlag[] 
ae40: 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65  */.  .  /* For e
ae50: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
ae60: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
ae70: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
ae80: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
ae90: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
aea0: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
aeb0: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
aec0: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
aed0: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
aee0: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
aef0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
af00: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
af10: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
af20: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
af30: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
af40: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
af50: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
af60: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
af70: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
af80: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
af90: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
afa0: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
afb0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
afc0: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
afd0: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
afe0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
aff0: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
b000: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
b010: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
b020: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
b030: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
b040: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
b050: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
b060: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
b070: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
b080: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
b090: 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43  ts in..  */.  zC
b0a0: 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  sr = (u8*)&p->aO
b0b0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20  p[p->nOp];      
b0c0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69   /* Memory avali
b0d0: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
b0e0: 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20  ion */.  zEnd = 
b0f0: 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e  (u8*)&p->aOp[p->
b100: 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46  nOpAlloc];  /* F
b110: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65  irst byte past e
b120: 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a  nd of zCsr[] */.
b130: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
b140: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
b150: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
b160: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
b170: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
b180: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
b190: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
b1a0: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
b1b0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
b1c0: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65  m = 10;.  }.  me
b1d0: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
b1e0: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72  nd-zCsr);.  zCsr
b1f0: 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a   += (zCsr - (u8*
b200: 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28  )0)&7;.  assert(
b210: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
b220: 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20  NMENT(zCsr) );. 
b230: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
b240: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
b250: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
b260: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
b270: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
b280: 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70  ed in two.  ** p
b290: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
b2a0: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
b2b0: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
b2c0: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a  d space at the .
b2d0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
b2e0: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
b2f0: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
b300: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
b310: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
b320: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
b330: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
b340: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
b350: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
b360: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
b370: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
b380: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
b390: 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  on.  .  **.  ** 
b3a0: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
b3b0: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
b3c0: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
b3d0: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
b3e0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74  om.  ** the left
b3f0: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68  over space at th
b400: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
b410: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69  ode array can si
b420: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
b430: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
b440: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
b450: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
b460: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
b470: 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65    do {.    nByte
b480: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
b490: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
b4a0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
b4b0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
b4c0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b4d0: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
b4e0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72  locSpace(p->aVar
b4f0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
b500: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
b510: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
b520: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
b530: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
b540: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
b550: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b560: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  Byte);.    p->az
b570: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
b580: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
b590: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26  sizeof(char*), &
b5a0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
b5b0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  te);.    p->apCs
b5c0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
b5d0: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
b5e0: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
b5f0: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b620: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e  yte);.    p->aOn
b630: 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70  ceFlag = allocSp
b640: 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  ace(p->aOnceFlag
b650: 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20  , nOnce, &zCsr, 
b660: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b670: 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a     if( nByte ){.
b680: 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d        p->pFree =
b690: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b6a0: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
b6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20  .    }.    zCsr 
b6c0: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
b6d0: 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79  zEnd = &zCsr[nBy
b6e0: 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e  te];.  }while( n
b6f0: 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c  Byte && !db->mal
b700: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
b710: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
b720: 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65  rsor;.  p->nOnce
b730: 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20  Flag = nOnce;.  
b740: 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20  if( p->aVar ){. 
b750: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
b760: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f  Var)nVar;.    fo
b770: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
b780: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56  ++){.      p->aV
b790: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
b7a0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d  M_Null;.      p-
b7b0: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
b7c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
b7d0: 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20  ( p->azVar ){.  
b7e0: 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61    p->nzVar = pPa
b7f0: 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20  rse->nzVar;.    
b800: 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c  memcpy(p->azVar,
b810: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
b820: 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  p->nzVar*sizeof(
b830: 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  p->azVar[0]));. 
b840: 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65     memset(pParse
b850: 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72  ->azVar, 0, pPar
b860: 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66  se->nzVar*sizeof
b870: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30  (pParse->azVar[0
b880: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
b890: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d  ->aMem ){.    p-
b8a0: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8c0: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
b8d0: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
b8e0: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
b910: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
b920: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
b930: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
b940: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
b950: 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64  gs = MEM_Invalid
b960: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  ;.      p->aMem[
b970: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
b980: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61  }.  }.  p->expla
b990: 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
b9a0: 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  lain;.  sqlite3V
b9b0: 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a  dbeRewind(p);.}.
b9c0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
b9d0: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
b9e0: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
b9f0: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
ba00: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
ba10: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
ba20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
ba30: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
ba40: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
ba50: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
ba60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
ba70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
ba80: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
ba90: 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70  b, pCx);.  if( p
baa0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
bab0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
bac0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
bad0: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
bae0: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
baf0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
bb00: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
bb10: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c  y.    ** the cal
bb20: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65  l above. */.  }e
bb30: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75  lse if( pCx->pCu
bb40: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
bb50: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
bb60: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
bb70: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
bb80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
bb90: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
bba0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
bbb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
bbc0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
bbd0: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
bbe0: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
bbf0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
bc00: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
bc10: 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  Cx->pModule;.   
bc20: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
bc30: 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c   = 1;.    pModul
bc40: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
bc50: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69  ursor);.    p->i
bc60: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
bc70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
bc80: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
bc90: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
bca0: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
bcb0: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
bcc0: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
bcd0: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
bce0: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
bcf0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
bd00: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
bd10: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
bd20: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
bd30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bd40: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
bd50: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
bd60: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
bd70: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d   pFrame->v;.  v-
bd80: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >aOnceFlag = pFr
bd90: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a  ame->aOnceFlag;.
bda0: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    v->nOnceFlag =
bdb0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
bdc0: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ag;.  v->aOp = p
bdd0: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
bde0: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
bdf0: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
be00: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
be10: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
be20: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
be30: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
be40: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
be50: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
be60: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
be70: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
be80: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
be90: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
bea0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65  e->nChange;.  re
beb0: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
bec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
bed0: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
bee0: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
bef0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
bf00: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
bf10: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
bf20: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
bf30: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
bf40: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
bf50: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
bf60: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
bf70: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
bf80: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
bf90: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
bfa0: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
bfb0: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
bfc0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
bfd0: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
bfe0: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
bff0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
c000: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
c010: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
c020: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
c030: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
c040: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
c050: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
c060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c070: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
c080: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
c090: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
c0a0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
c0b0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
c0c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
c0d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
c0e0: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
c0f0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
c100: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
c110: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
c120: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c130: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
c140: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
c150: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
c160: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c170: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
c180: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
c190: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
c1a0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
c1b0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
c1c0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
c1d0: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
c1e0: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
c1f0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
c200: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
c210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
c220: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
c230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
c240: 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
c250: 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
c260: 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71  y the VM */.  sq
c270: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
c280: 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29  uxData(p, -1, 0)
c290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
c2a0: 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
c2b0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
c2c0: 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65  the VM after exe
c2d0: 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cution..**.** Th
c2e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c2f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
c300: 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c  ose any cursors,
c310: 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a   lists, and/or.*
c320: 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77  * sorters that w
c330: 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20  ere left open.  
c340: 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20  It also deletes 
c350: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a  the values of.**
c360: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
c370: 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a  e aVar[] array..
c380: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
c390: 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b  leanup(Vdbe *p){
c3a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c3b0: 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20   p->db;..#ifdef 
c3c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
c3d0: 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
c3e0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
c3f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
c400: 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
c410: 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
c420: 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
c430: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
c440: 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
c450: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
c460: 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20  pCsr ) for(i=0; 
c470: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
c480: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
c490: 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69  Csr[i]==0 );.  i
c4a0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
c4b0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
c4c0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
c4d0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  rt( p->aMem[i].f
c4e0: 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69  lags==MEM_Invali
c4f0: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
c500: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c510: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
c520: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
c530: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
c540: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
c550: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
c560: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
c570: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
c580: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c590: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
c5a0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
c5b0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
c5c0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
c5d0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
c5e0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
c5f0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
c600: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
c610: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
c620: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
c630: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
c640: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
c650: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
c660: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
c670: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
c680: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
c690: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
c6a0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
c6b0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
c6c0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
c6d0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
c6e0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c6f0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
c700: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
c710: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
c720: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
c730: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
c740: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
c750: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
c760: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
c770: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
c780: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
c790: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
c7a0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
c7b0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
c7c0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
c7d0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
c7e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
c7f0: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
c800: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
c810: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
c820: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
c830: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
c840: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
c850: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
c860: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
c870: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
c880: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
c890: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
c8a0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
c8b0: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
c8c0: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
c8d0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
c8e0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
c8f0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
c900: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
c910: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
c920: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
c930: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
c940: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
c950: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
c960: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
c970: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
c980: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
c990: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
c9a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
c9b0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
c9c0: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
c9d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c9e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
c9f0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
ca20: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
ca30: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
ca60: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
ca70: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
ca80: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
caa0: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
cab0: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
cac0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
cad0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
cae0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
caf0: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
cb00: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
cb10: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
cb20: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
cb30: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
cb40: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
cb50: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
cb60: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
cb70: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
cb80: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
cb90: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
cba0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
cbb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
cbc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
cbd0: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
cbe0: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
cbf0: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
cc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cc10: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
cc20: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
cc30: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
cc40: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
cc50: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
cc60: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
cc70: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
cc80: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
cc90: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
cca0: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
ccb0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
ccc0: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
ccd0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
cce0: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
ccf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cd00: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
cd10: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
cd20: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
cd30: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
cd40: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
cd50: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
cd60: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
cd70: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
cd80: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
cd90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
cda0: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
cdb0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
cdc0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
cdd0: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
cde0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cdf0: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
ce00: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
ce10: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
ce20: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
ce30: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
ce40: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
ce50: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
ce60: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
ce70: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
ce80: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ce90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
cea0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
ceb0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
cec0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
ced0: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
cee0: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
cef0: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
cf00: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
cf10: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
cf20: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
cf30: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
cf40: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
cf50: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
cf60: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
cf70: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
cf80: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
cf90: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
cfa0: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
cfb0: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
cfc0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
cfd0: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
cfe0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
cff0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
d000: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
d010: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
d020: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
d030: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
d040: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
d050: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
d060: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
d070: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
d080: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
d090: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
d0a0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
d0b0: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
d0c0: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
d0d0: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
d0e0: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
d0f0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
d100: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
d110: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
d120: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
d130: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
d140: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
d150: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
d160: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
d170: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
d180: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
d190: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
d1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
d1b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
d1c0: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
d1d0: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
d1e0: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
d1f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
d200: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d210: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
d220: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d230: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d240: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
d250: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
d260: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
d270: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
d280: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
d290: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71  rans++;.      sq
d2a0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
d2b0: 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
d2c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
d2d0: 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74  lusiveLock(sqlit
d2e0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
d2f0: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
d300: 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
d310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d320: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d330: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
d340: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d350: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
d360: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
d370: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
d380: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
d390: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
d3a0: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
d3b0: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
d3c0: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
d3d0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
d3e0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
d3f0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d400: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d410: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
d420: 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
d430: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
d440: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
d450: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
d460: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
d470: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
d480: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
d490: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
d4a0: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
d4b0: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
d4c0: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
d4d0: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
d4e0: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
d4f0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
d500: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
d510: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
d520: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
d530: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
d540: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
d550: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
d560: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
d570: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
d580: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
d590: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
d5a0: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
d5b0: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
d5c0: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
d5d0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
d5e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
d5f0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d600: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
d610: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
d620: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
d630: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d640: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d650: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d660: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d670: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d680: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d690: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d6a0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d6b0: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
d6c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d6d0: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
d6e0: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
d6f0: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
d700: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
d710: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
d720: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
d730: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d740: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
d750: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
d760: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
d770: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
d780: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
d790: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d7a0: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
d7b0: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
d7c0: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
d7d0: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
d7e0: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d7f0: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
d800: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
d810: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d820: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d830: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d840: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d850: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d860: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d870: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d880: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
d890: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d8b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
d8d0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
d8e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
d8f0: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
d900: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
d910: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
d920: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
d930: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
d940: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
d950: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
d960: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
d970: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
d980: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
d990: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
d9a0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
d9b0: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
d9c0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
d9d0: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
d9e0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
d9f0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
da00: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
da10: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
da20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
da30: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
da40: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
da50: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
da60: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
da70: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
da80: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
da90: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
daa0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
dab0: 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
dac0: 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
dad0: 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
dae0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
daf0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
db00: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
db10: 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
db20: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
db30: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
db40: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
db50: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
db60: 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
db70: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
db80: 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
db90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
dba0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
dbb0: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
dbc0: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
dbd0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
dbe0: 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
dbf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dc00: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
dc10: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
dc20: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
dc30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dc40: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
dc50: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
dc60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
dc70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
dc80: 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
dc90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
dca0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
dcb0: 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
dcc0: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
dcd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dce0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
dcf0: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
dd00: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
dd10: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
dd20: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
dd30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
dd40: 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
dd50: 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
dd60: 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
dd90: 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
dda0: 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
ddb0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
ddc0: 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
ddd0: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
dde0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
ddf0: 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
de00: 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
de10: 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
de20: 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
de30: 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
de40: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
de50: 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
de60: 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
de70: 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
de80: 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
de90: 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
dea0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
deb0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
dec0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
ded0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
dee0: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
def0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
df00: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
df10: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
df20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
df30: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
df40: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
df50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df60: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
df70: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
df80: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
df90: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
dfa0: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
dfb0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
dfc0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
dfd0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
dfe0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
dff0: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
e000: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
e010: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e020: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e030: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e040: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
e050: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
e060: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
e070: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
e080: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
e090: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
e0a0: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
e0b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e0c0: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
e0d0: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
e0e0: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
e0f0: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
e100: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e110: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
e120: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
e130: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
e140: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
e150: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
e160: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
e170: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
e180: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
e190: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
e1a0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
e1b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
e1c0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
e1d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
e1e0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e1f0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e200: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
e210: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
e220: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
e230: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
e240: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
e250: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
e260: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
e270: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e280: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
e290: 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
e2a0: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
e2b0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
e2c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
e2d0: 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
e2e0: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
e2f0: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
e300: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
e310: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
e320: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
e330: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e340: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e350: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
e360: 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
e370: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
e380: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
e390: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
e3a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
e3b0: 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
e3c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e3e0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
e3f0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
e400: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
e410: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
e420: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
e430: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e440: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
e460: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e470: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e480: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
e490: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
e4a0: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
e4b0: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
e4c0: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
e4d0: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
e4e0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
e4f0: 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
e500: 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
e510: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e520: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
e530: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
e540: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
e550: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
e560: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
e570: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
e580: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
e590: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
e5a0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
e5b0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
e5c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
e5d0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
e5e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e5f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
e600: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
e610: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
e620: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
e630: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
e640: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
e650: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
e660: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
e670: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
e680: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
e690: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
e6a0: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
e6b0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
e6c0: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
e6d0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
e6e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e6f0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
e700: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
e710: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
e720: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
e730: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
e740: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
e750: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
e760: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
e770: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
e780: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
e790: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
e7a0: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
e7b0: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
e7c0: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
e7d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
e7e0: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
e7f0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
e800: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
e810: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
e820: 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
e830: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
e840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e850: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
e860: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e870: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e880: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e890: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e8a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
e8b0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
e8c0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e8d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
e8e0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
e8f0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
e900: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e910: 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
e920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e940: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e950: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
e960: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
e970: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
e980: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e990: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
e9a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e9b0: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
e9c0: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
e9d0: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
e9e0: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
e9f0: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
ea00: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ea10: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
ea20: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
ea30: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ea40: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
ea50: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
ea60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
ea70: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
ea80: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
ea90: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
eaa0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
eab0: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
eac0: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
ead0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
eae0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
eaf0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
eb00: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
eb10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
eb20: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
eb30: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
eb40: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
eb50: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
eb60: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
eb70: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
eb80: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
eb90: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
eba0: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
ebb0: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
ebc0: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
ebd0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
ebe0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
ebf0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
ec00: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
ec10: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
ec20: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
ec30: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
ec40: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
ec50: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
ec60: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
ec70: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
ec80: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
ec90: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
eca0: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
ecb0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
ecc0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
ecd0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ece0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ecf0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ed00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
ed10: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ed20: 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
ed30: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
ed40: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
ed50: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
ed60: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
ed70: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
ed80: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
ed90: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
eda0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
edb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
edc0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
edd0: 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
ede0: 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
edf0: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
ee00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
ee10: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
ee20: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
ee30: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
ee40: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
ee50: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
ee60: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
ee70: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
ee80: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
ee90: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
eea0: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
eeb0: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
eec0: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
eed0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
eee0: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
eef0: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
ef00: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
ef10: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
ef20: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
ef30: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
ef40: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
ef50: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
ef60: 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
ef70: 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
ef80: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
ef90: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
efa0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
efb0: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
efc0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
efd0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
efe0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
eff0: 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
f000: 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
f010: 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
f020: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
f030: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
f040: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
f050: 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
f060: 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
f070: 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
f080: 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
f090: 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
f0a0: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
f0b0: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
f0c0: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
f0d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
f0e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
f0f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
f100: 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
f110: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
f120: 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
f130: 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
f140: 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
f150: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
f160: 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
f170: 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
f180: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f190: 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
f1a0: 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
f1b0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
f1c0: 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
f1d0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f1e0: 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
f1f0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f200: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
f210: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
f220: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
f230: 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
f240: 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
f250: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
f260: 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
f270: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
f280: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
f290: 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
f2a0: 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
f2b0: 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
f2c0: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
f2d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
f2e0: 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
f2f0: 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
f300: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
f310: 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
f320: 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
f330: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
f340: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
f350: 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
f360: 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
f370: 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
f380: 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
f390: 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67  ccurred, causing
f3a0: 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
f3b0: 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
f3c0: 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
f3d0: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
f3e0: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
f3f0: 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
f400: 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
f410: 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
f420: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
f430: 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
f440: 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
f450: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
f460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
f470: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
f480: 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
f490: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
f4a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
f4b0: 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
f4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
f4d0: 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
f4e0: 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
f4f0: 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
f500: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f510: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
f520: 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
f530: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
f540: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f550: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f560: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
f570: 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
f580: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f590: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
f5a0: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
f5b0: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
f5c0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f5d0: 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
f5e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5f0: 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
f600: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f610: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
f620: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
f630: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
f640: 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
f650: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
f660: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f670: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f680: 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
f690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f6a0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
f6b0: 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
f6c0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
f6d0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
f6e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f6f0: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
f700: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f710: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f720: 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
f730: 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
f740: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
f750: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f760: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
f770: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f780: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f790: 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
f7a0: 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
f7b0: 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
f7c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f7d0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
f7e0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f7f0: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
f800: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
f810: 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
f820: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
f830: 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
f840: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
f850: 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
f860: 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
f870: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
f880: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f890: 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
f8a0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f8b0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f8c0: 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
f8d0: 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
f8e0: 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20  mtDefCons;.     
f8f0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
f900: 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
f910: 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20  DefImmCons;.    
f920: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
f930: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
f940: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
f950: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
f960: 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
f970: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
f980: 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
f990: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
f9a0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
f9b0: 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
f9c0: 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
f9d0: 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
f9e0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
f9f0: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
fa00: 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
fa10: 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
fa20: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
fa30: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
fa40: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
fa50: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
fa60: 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
fa70: 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
fa80: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
fa90: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
faa0: 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
fab0: 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
fac0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
fad0: 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20  REIGNKEY.** and 
fae0: 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
faf0: 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68  essage to it. Th
fb00: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
fb10: 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64  _ERROR..*/.#ifnd
fb20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
fb30: 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73  OREIGN_KEY.int s
fb40: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
fb50: 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64  k(Vdbe *p, int d
fb60: 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69  eferred){.  sqli
fb70: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
fb80: 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64  .  if( (deferred
fb90: 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72   && (db->nDeferr
fba0: 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65  edCons+db->nDefe
fbb0: 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20  rredImmCons)>0) 
fbc0: 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65  .   || (!deferre
fbd0: 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
fbe0: 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20  raint>0) .  ){. 
fbf0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
fc00: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
fc10: 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e  EIGNKEY;.    p->
fc20: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
fc30: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
fc40: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
fc50: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66  >zErrMsg, db, "f
fc60: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
fc70: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
fc80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fc90: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
fca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fcb0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
fcc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fcd0: 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
fce0: 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
fcf0: 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
fd00: 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
fd10: 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
fd20: 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
fd30: 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
fd40: 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
fd50: 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
fd60: 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
fd70: 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
fd80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
fd90: 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
fda0: 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
fdb0: 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
fdc0: 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
fdd0: 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
fde0: 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
fdf0: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
fe00: 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
fe10: 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
fe20: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
fe30: 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
fe40: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
fe50: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
fe60: 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
fe70: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
fe80: 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
fe90: 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
fea0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
feb0: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
fec0: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
fed0: 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
fee0: 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
fef0: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
ff00: 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
ff10: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
ff20: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
ff30: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff50: 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
ff60: 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
ff70: 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
ff80: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
ff90: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
ffa0: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
ffb0: 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
ffc0: 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
ffd0: 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
ffe0: 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
fff0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
10000 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
10010 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
10020 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
10030 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
10040 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
10050 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
10060 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
10070 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
10080 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
10090 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
100a0 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
100b0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
100c0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
100d0 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
100e0 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
100f0 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
10100 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
10110 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
10120 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
10130 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
10140 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
10150 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
10160 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
10170 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
10180 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
10190 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
101a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
101b0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
101c0 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
101d0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
101e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
101f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
10200 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74  nceFlag ) memset
10210 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30  (p->aOnceFlag, 0
10220 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b  , p->nOnceFlag);
10230 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
10240 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
10250 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
10260 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
10270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10280 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
10290 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
102a0 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
102b0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
102c0 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
102d0 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
102e0 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
102f0 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
10300 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
10310 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
10320 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
10330 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
10340 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
10350 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
10360 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
10370 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
10380 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
10390 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
103a0 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
103b0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
103c0 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
103d0 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
103e0 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
103f0 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
10400 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
10410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
10420 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
10430 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
10440 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
10450 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
10460 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
10470 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
10480 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
10490 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54  BLOCKED );  /* T
104a0 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e  his error no lon
104b0 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ger exists */.  
104c0 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
104d0 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
104e0 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
104f0 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10510 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
10520 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
10530 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
10540 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
10550 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
10560 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
10570 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
10580 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
10590 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
105a0 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
105b0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
105c0 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
105d0 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
105e0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
105f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
10600 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
10610 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
10620 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
10630 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
10640 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
10650 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
10660 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
10670 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
10680 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
10690 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
106a0 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
106b0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
106c0 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
106d0 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
106e0 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
106f0 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
10700 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
10710 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
10720 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
10730 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
10740 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
10750 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
10760 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
10770 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
10780 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
10790 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
107a0 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
107b0 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
107c0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
107d0 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
107e0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
107f0 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
10800 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
10810 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
10820 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
10830 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
10840 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
10850 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
10860 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
10870 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
10880 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
10890 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
108a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
108b0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
108c0 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
108d0 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
108e0 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
108f0 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
10900 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
10910 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
10920 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
10930 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
10940 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
10950 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10960 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
10970 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
10980 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
10990 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
109a0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
109b0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
109c0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
109d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
109e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
109f0 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74  eck for immediat
10a00 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69  e foreign key vi
10a10 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  olations. */.   
10a20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
10a40 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
10a50 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  k(p, 0);.    }. 
10a60 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
10a70 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
10a80 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
10a90 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
10aa0 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20  ive writer .    
10ab0 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64  ** VM, then we d
10ac0 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
10ad0 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
10ae0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
10af0 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
10b00 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
10b10 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
10b20 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
10b30 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
10b40 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
10b50 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
10b60 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
10b70 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
10b80 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
10b90 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
10ba0 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
10bb0 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d  >nVdbeWrite==(p-
10bc0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
10bd0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
10be0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10bf0 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
10c00 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
10c10 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
10c20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
10c40 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  kFk(p, 1);.     
10c50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10c60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10c70 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
10c80 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
10c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ca0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
10cb0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10cc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
10cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ce0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10cf0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
10d00 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d  GNKEY;.        }
10d10 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
10d20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
10d30 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
10d40 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
10d50 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
10d60 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
10d70 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
10d80 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
10d90 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
10da0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
10db0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
10dc0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
10dd0 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
10de0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
10df0 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
10e00 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
10e10 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
10e20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
10e30 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
10e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10e50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
10e60 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
10e70 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
10e80 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
10e90 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
10ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
10eb0 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
10ec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10ee0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
10ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10f00 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
10f10 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
10f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10f30 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
10f40 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
10f50 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
10f60 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
10f70 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
10f80 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
10f90 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
10fa0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
10fb0 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
10fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10fe0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10ff0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
11000 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
11010 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
11020 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
11030 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
11040 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
11050 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11060 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
11070 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
11080 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
11090 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
110a0 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
110b0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
110c0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
110d0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
110e0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
110f0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
11100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11110 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11120 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
11130 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
11140 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
11150 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
11160 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
11170 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
11180 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
11190 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
111a0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
111b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
111c0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
111d0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
111e0 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
111f0 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
11200 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
11210 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
11220 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
11230 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
11240 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
11250 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
11260 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
11270 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
11280 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
11290 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
112a0 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
112b0 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
112c0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
112d0 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
112e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
112f0 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
11300 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11310 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
11320 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
11330 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
11340 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
11350 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11360 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
11370 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
11380 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
11390 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
113a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
113b0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
113c0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
113d0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
113e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
113f0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11400 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11410 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
11420 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11430 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
11440 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
11450 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
11460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11470 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
11480 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
11490 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
114a0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
114b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
114c0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
114d0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
114e0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
114f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
11500 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
11510 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
11520 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
11530 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
11540 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
11550 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
11560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
11570 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
11580 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
11590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
115a0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
115b0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
115c0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
115d0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
115e0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
115f0 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
11600 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11610 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
11620 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
11630 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
11640 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
11650 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
11660 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
11670 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
11680 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
11690 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
116a0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
116b0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
116c0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
116d0 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
116e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
116f0 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
11700 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
11710 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
11720 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
11730 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
11740 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
11750 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
11760 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
11770 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
11780 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
11790 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
117a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
117b0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
117c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
117d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
117e0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
117f0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
11800 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
11810 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
11820 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
11830 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
11840 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
11850 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
11860 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
11870 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
11880 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
11890 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
118a0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
118b0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
118c0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
118d0 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
118e0 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
118f0 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
11900 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
11910 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
11920 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
11930 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
11940 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
11950 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
11960 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
11970 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
11980 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
11990 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
119a0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
119b0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
119c0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
119d0 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
119e0 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
119f0 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
11a00 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
11a10 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
11a20 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
11a30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11a40 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
11a50 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
11a60 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
11a70 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
11a80 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
11a90 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
11aa0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
11ab0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
11ac0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
11ad0 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
11ae0 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
11af0 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
11b00 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
11b10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11b20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
11b30 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
11b40 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
11b50 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
11b60 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
11b70 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
11b80 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
11b90 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
11ba0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
11bb0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
11bc0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
11bd0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
11be0 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
11bf0 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
11c00 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
11c10 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11c20 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
11c30 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
11c40 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
11c50 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
11c60 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
11c70 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
11c80 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11c90 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d  alloc();.    db-
11ca0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
11cb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
11cc0 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
11cd0 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rc;.  }else{.   
11ce0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
11cf0 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  , rc, 0);.  }.  
11d00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
11d10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11d20 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20  LE_SQLLOG./*.** 
11d30 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  If an SQLITE_CON
11d40 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20  FIG_SQLLOG hook 
11d50 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e  is registered an
11d60 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
11d70 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b  n run, .** invok
11d80 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
11d90 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53  void vdbeInvokeS
11da0 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a  qllog(Vdbe *v){.
11db0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
11dc0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
11dd0 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49  g && v->rc==SQLI
11de0 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c  TE_OK && v->zSql
11df0 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && v->pc>=0 ){.
11e00 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e      char *zExpan
11e10 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ded = sqlite3Vdb
11e20 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d  eExpandSql(v, v-
11e30 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65  >zSql);.    asse
11e40 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e  rt( v->db->init.
11e50 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  busy==0 );.    i
11e60 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a  f( zExpanded ){.
11e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
11e80 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
11e90 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g(.          sql
11ea0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
11eb0 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e  .pSqllogArg, v->
11ec0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31  db, zExpanded, 1
11ed0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
11ee0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
11ef0 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b  >db, zExpanded);
11f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
11f10 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
11f20 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a  InvokeSqllog(x).
11f30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
11f40 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
11f50 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
11f60 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
11f70 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
11f80 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
11f90 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
11fa0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
11fb0 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
11fc0 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
11fd0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
11fe0 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
11ff0 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
12000 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
12010 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
12020 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
12030 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
12040 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
12050 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
12060 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
12070 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
12080 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
12090 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
120a0 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
120b0 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
120c0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
120d0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
120e0 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
120f0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
12100 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
12110 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
12120 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
12130 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
12140 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
12150 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
12160 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
12170 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
12180 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
12190 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
121a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
121b0 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
121c0 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
121d0 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
121e0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
121f0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
12200 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
12210 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
12220 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
12230 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
12240 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
12250 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
12260 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
12270 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
12280 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
12290 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
122a0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
122b0 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
122c0 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
122d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
122e0 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49  >=0 ){.    vdbeI
122f0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a  nvokeSqllog(p);.
12300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
12310 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b  ransferError(p);
12320 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
12330 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
12340 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
12350 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
12360 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29  p->runOnlyOnce )
12370 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
12380 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
12390 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
123a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
123b0 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
123c0 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
123d0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
123e0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
123f0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
12400 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
12410 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
12420 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
12430 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
12440 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
12450 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
12460 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
12470 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
12480 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
12490 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
124a0 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
124b0 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
124c0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
124d0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
124e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
124f0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
12500 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
12510 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
12520 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
12530 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
12540 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
12550 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
12560 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
12570 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
12580 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
12590 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
125a0 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
125b0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
125c0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
125d0 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
125e0 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
125f0 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
12600 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
12610 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
12620 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
12630 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
12640 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
12650 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
12660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
12670 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
12680 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
12690 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
126a0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
126b0 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
126c0 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
126d0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
126e0 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
126f0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
12700 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
12710 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
12720 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
12730 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
12740 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
12750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12760 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
12770 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
12780 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
12790 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
127a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69   }.#endif.  p->i
127b0 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b  CurrentTime = 0;
127c0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
127d0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
127e0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
127f0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
12800 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
12810 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
12820 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
12830 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
12840 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
12850 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
12860 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
12870 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
12880 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
12890 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
128a0 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
128b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
128c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
128d0 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
128e0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
128f0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
12900 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
12910 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
12920 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
12930 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
12940 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
12950 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
12960 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
12970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12980 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
12990 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
129a0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
129b0 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
129c0 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
129d0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
129e0 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
129f0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
12a00 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
12a10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
12a20 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
12a30 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
12a40 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
12a50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
12a60 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
12a70 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
12a80 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
12a90 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
12aa0 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
12ab0 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
12ac0 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
12ad0 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
12ae0 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
12af0 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
12b00 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
12b10 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
12b20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
12b30 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
12b40 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
12b50 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
12b60 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
12b70 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
12b80 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
12b90 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
12ba0 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
12bb0 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
12bc0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
12bd0 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
12be0 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 73 70  parameter corrsp
12bf0 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
12c00 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
12c10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
12c20 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
12c30 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
12c40 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
12c50 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
12c60 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
12c70 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
12c80 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
12c90 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
12ca0 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
12cb0 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
12cc0 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
12cd0 21 28 6d 61 73 6b 20 26 20 28 28 75 33 32 29 31  !(mask & ((u32)1
12ce0 3c 3c 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  <<pAux->iArg))))
12cf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
12d00 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
12d10 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
12d20 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
12d30 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
12d40 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
12d50 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
12d60 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65  ite3DbFree(pVdbe
12d70 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  ->db, pAux);.   
12d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
12d90 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
12da0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12db0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
12dc0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
12dd0 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
12de0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
12df0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
12e00 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
12e10 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
12e20 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
12e30 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
12e40 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
12e50 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
12e60 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
12e70 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
12e80 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
12e90 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
12ea0 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
12eb0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
12ec0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
12ed0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
12ee0 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
12ef0 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
12f00 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
12f10 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
12f20 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
12f30 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
12f40 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
12f50 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
12f60 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
12f70 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
12f80 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
12f90 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
12fa0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12fb0 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
12fc0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
12fd0 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
12fe0 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
12ff0 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
13000 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
13010 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
13020 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
13030 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
13040 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
13050 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
13060 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Sub);.  }.  for(
13070 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e  i=p->nzVar-1; i>
13080 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33  =0; i--) sqlite3
13090 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
130a0 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46  Var[i]);.  vdbeF
130b0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
130c0 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
130d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
130e0 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
130f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13100 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
13110 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
13120 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
13130 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13140 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23  db, p->pFree);.#
13150 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13160 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
13170 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33  PLAIN).  sqlite3
13180 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13190 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74  xplain);.  sqlit
131a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
131b0 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69  pExplain);.#endi
131c0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
131d0 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
131e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
131f0 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
13200 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
13210 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
13220 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
13230 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
13240 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13250 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
13260 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
13270 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
13280 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
13290 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
132a0 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
132b0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
132c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
132d0 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
132e0 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
132f0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
13300 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
13310 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
13320 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
13330 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
13340 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
13350 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
13360 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
13370 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
13380 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
13390 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
133a0 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
133b0 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
133c0 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
133d0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
133e0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
133f0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
13400 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
13410 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
13420 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
13430 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
13440 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
13450 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
13460 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
13470 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
13480 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
13490 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
134a0 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
134b0 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
134c0 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
134d0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
134e0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
134f0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
13500 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
13510 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
13520 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
13530 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
13540 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
13550 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
13560 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
13570 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
13580 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
13590 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
135a0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
135b0 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
135c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
135d0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
135e0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
135f0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
13600 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
13610 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
13620 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
13630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
13640 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  T.    extern int
13650 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
13660 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
13670 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
13680 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  able );.    rc =
13690 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
136a0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70  etoUnpacked(p->p
136b0 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
136c0 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
136d0 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  res);.    if( rc
136e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
136f0 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d    p->lastRowid =
13700 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
13710 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30  ;.    if( res!=0
13720 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13730 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13740 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
13750 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  id = 1;.#ifdef S
13760 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
13770 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
13780 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
13790 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
137a0 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
137b0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
137c0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c  CHE_STALE;.  }el
137d0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d  se if( ALWAYS(p-
137e0 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >pCursor) ){.   
137f0 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20   int hasMoved;. 
13800 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
13810 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
13820 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
13830 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20  r, &hasMoved);. 
13840 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13850 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68  rn rc;.    if( h
13860 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20  asMoved ){.     
13870 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
13880 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
13890 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20       p->nullRow 
138a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
138b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
138d0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
138e0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
138f0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13900 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
13910 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
13920 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13930 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
13940 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
13950 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
13960 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
13970 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
13980 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
13990 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
139a0 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
139b0 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
139c0 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
139d0 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
139e0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
139f0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
13a00 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
13a10 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
13a20 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
13a30 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
13a40 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
13a50 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
13a60 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
13a70 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
13a80 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
13a90 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
13aa0 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
13ab0 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
13ac0 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
13ad0 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
13ae0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
13af0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
13b00 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
13b10 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
13b20 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
13b30 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
13b40 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
13b50 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
13b60 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
13b70 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
13b80 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
13b90 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
13ba0 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
13bb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
13bc0 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
13bd0 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
13be0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
13bf0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
13c00 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
13c10 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
13c20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
13c50 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
13c60 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
13c80 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
13c90 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
13cc0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
13cd0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
13ce0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
13cf0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
13d00 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
13d30 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13d40 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
13d60 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13d70 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13d80 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
13d90 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
13da0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
13db0 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dd0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
13de0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
13df0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
13e00 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
13e10 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
13e20 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
13e50 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
13e60 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
13e80 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
13e90 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
13ea0 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
13ed0 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
13ee0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
13ef0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
13f00 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
13f10 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
13f20 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
13f30 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
13f40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
13f50 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
13f60 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
13f70 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
13f80 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
13f90 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
13fa0 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
13fb0 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
13fc0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
13fd0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
13fe0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
13ff0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
14000 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
14010 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
14020 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
14030 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
14040 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
14050 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
14060 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
14070 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
14080 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
14090 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
140a0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
140b0 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
140c0 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
140d0 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
140e0 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
140f0 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
14100 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
14110 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
14120 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
14130 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
14140 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f      if( i<(-MAX_
14150 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20  6BYTE) ) return 
14160 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76  6;.      /* Prev
14170 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e  ious test preven
14180 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33  ts:  u = -(-9223
14190 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29  372036854775808)
141a0 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69   */.      u = -i
141b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
141c0 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
141d0 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
141e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
141f0 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
14200 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b  _format>=4) ? 8+
14210 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20  (u32)u : 1;.    
14220 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
14230 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
14240 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
14250 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
14260 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
14270 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
14280 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
14290 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
142a0 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
142b0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
142c0 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
142d0 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
142e0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
142f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
14300 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
14310 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
14320 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
14330 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
14340 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
14350 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
14360 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30  }.  assert( n>=0
14370 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   );.  return ((n
14380 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
14390 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
143a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
143b0 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
143c0 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
143d0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
143e0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
143f0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
14400 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14410 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
14420 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
14430 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
14440 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
14450 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
14460 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
14470 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
14480 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
14490 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
144a0 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
144b0 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
144c0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
144d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
144e0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
144f0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
14500 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
14510 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
14520 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
14530 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
14540 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
14550 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
14560 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
14570 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
14580 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
14590 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
145a0 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
145b0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
145c0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
145d0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
145e0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
145f0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
14600 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
14610 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
14620 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
14630 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
14640 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
14650 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
14660 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
14670 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
14680 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
14690 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
146a0 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
146b0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
146c0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
146d0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
146e0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
146f0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
14700 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
14710 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
14720 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
14730 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
14740 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
14750 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
14760 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
14770 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
14780 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
14790 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
147a0 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
147b0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
147c0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
147d0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
147e0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
147f0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
14800 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
14810 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
14820 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
14830 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
14840 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
14850 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
14860 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
14870 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
14880 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
14890 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
148a0 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
148b0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
148c0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
148d0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
148e0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
148f0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
14900 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
14910 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
14920 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
14930 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
14940 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
14950 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
14960 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
14970 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
14980 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
14990 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
149a0 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
149b0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
149c0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
149d0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
149e0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
149f0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
14a00 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
14a10 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
14a20 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
14a30 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
14a40 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
14a50 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
14a60 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
14a70 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
14a80 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
14a90 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
14aa0 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
14ab0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
14ac0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
14ad0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
14ae0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
14af0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
14b00 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
14b10 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
14b20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
14b30 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
14b40 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
14b50 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
14b60 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
14b70 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
14b80 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
14b90 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
14ba0 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
14bb0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
14bc0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
14bd0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
14be0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
14bf0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
14c00 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
14c10 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
14c20 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
14c30 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
14c40 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
14c50 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
14c60 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
14c70 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
14c80 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
14c90 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
14ca0 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
14cb0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
14cc0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
14cd0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
14ce0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
14cf0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
14d00 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
14d10 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
14d20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14d30 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
14d40 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
14d50 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
14d60 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20  in buf[].  nBuf 
14d70 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a  must always be.*
14d80 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
14d90 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
14da0 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74  e field.  Except
14db0 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69  , if the field i
14dc0 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68  s.** a blob with
14dd0 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74   a zero-filled t
14de0 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20  ail, then buf[] 
14df0 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68  might be just th
14e00 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20  e right.** size 
14e10 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69  to hold everythi
14e20 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ng except for th
14e30 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
14e40 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a  il.  If buf[].**
14e50 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f   is only big eno
14e60 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
14e70 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c  non-zero prefix,
14e80 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
14e90 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20   that.** prefix 
14ea0 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74  into buf[].  But
14eb0 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72   if buf[] is lar
14ec0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
14ed0 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72  d both the.** pr
14ee0 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69  efix and the tai
14ef0 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  l then write the
14f00 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20   prefix and set 
14f10 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a  the tail to all.
14f20 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20  ** zeros..**.** 
14f30 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
14f40 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
14f50 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
14f60 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
14f70 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
14f80 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
14f90 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
14fa0 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
14fb0 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
14fc0 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
14fd0 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
14fe0 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
14ff0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
15000 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e  t(u8 *buf, int n
15010 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Buf, Mem *pMem, 
15020 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
15030 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  {.  u32 serial_t
15040 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
15050 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d  eSerialType(pMem
15060 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a  , file_format);.
15070 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
15080 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
15090 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
150a0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
150b0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
150c0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
150d0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
150e0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
150f0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
15100 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
15110 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20  em->r) );.      
15120 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
15130 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  ->r, sizeof(v));
15140 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
15150 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
15160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15170 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
15180 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
15190 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  i = sqlite3VdbeS
151a0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
151b0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61  ial_type);.    a
151c0 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32  ssert( len<=(u32
151d0 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  )nBuf );.    whi
151e0 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
151f0 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
15200 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
15210 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
15220 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
15230 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
15240 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
15250 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
15260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
15270 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
15280 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
15290 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
152a0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
152b0 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
152c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
152d0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
152e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
152f0 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
15300 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
15310 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
15320 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
15330 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
15340 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
15350 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
15360 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
15370 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
15380 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
15390 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66   len > (u32)nBuf
153a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
153b0 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20  = (u32)nBuf;.   
153c0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
153d0 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
153e0 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
153f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
15400 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
15410 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
15420 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
15430 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15440 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
15450 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
15460 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
15470 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
15480 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
15490 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
154a0 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
154b0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
154c0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
154d0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
154e0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
154f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15500 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
15510 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
15520 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
15530 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
15540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15550 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
15560 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
15570 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15590 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
155a0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
155b0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
155c0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
155d0 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
155e0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
155f0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
15600 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
15610 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
15620 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
15630 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
15640 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
15650 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
15660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15670 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
15680 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
15690 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
156a0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
156b0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
156c0 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
156d0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
156e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
156f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15700 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
15710 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
15720 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
15730 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
15740 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
15750 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
15760 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15770 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15780 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
15790 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
157a0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
157b0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
157c0 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
157d0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
157e0 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
157f0 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
15800 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15810 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
15820 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
15830 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
15840 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
15850 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
15860 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
15870 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
15880 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
15890 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
158a0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
158b0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
158c0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
158d0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
158e0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
158f0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15900 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
15910 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
15920 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
15930 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
15940 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
15950 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
15960 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
15970 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
15980 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
15990 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
159a0 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
159b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
159c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
159d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
159e0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
159f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
15a00 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
15a10 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
15a20 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
15a30 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
15a40 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
15a50 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
15a60 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15a70 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
15a80 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
15a90 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
15aa0 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
15ab0 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
15ac0 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
15ad0 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
15ae0 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
15af0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
15b00 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
15b10 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
15b20 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
15b30 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
15b40 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
15b50 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
15b60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
15b70 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
15b80 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
15b90 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
15ba0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
15bb0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
15bc0 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
15bd0 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
15be0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
15bf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15c00 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
15c10 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
15c20 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
15c30 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
15c40 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
15c50 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
15c60 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
15c70 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
15c80 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
15c90 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
15ca0 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
15cb0 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
15cc0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
15cd0 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
15ce0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
15cf0 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
15d00 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
15d10 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
15d20 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15d30 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
15d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15d50 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
15d60 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
15d70 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
15d80 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
15d90 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
15da0 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
15db0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
15dc0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
15dd0 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
15de0 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45  aN(pMem->r) ? ME
15df0 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
15e00 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
15e10 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d   return 8;.    }
15e20 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
15e30 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
15e40 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
15e50 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
15e60 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
15e70 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
15e80 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15e90 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15ea0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15eb0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
15ec0 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20  {.      u32 len 
15ed0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
15ee0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
15ef0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
15f00 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
15f10 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d   = len;.      pM
15f20 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
15f30 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
15f40 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20  ype&0x01 ){.    
15f50 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15f60 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f  = MEM_Str | MEM_
15f70 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  Ephem;.      }el
15f80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
15f90 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
15fa0 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  ob | MEM_Ephem;.
15fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
15fc0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  turn len;.    }.
15fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
15fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15ff0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
16000 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
16010 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
16020 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
16030 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
16040 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
16050 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
16060 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
16070 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
16080 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
16090 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
160a0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
160b0 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
160c0 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
160d0 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
160e0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
160f0 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
16100 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
16110 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
16120 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
16130 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
16140 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
16150 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
16160 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
16170 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
16180 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
16190 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
161a0 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
161b0 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
161c0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
161d0 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
161e0 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
161f0 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
16200 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
16210 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
16220 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
16230 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
16240 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
16250 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
16260 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
16270 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
16280 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
16290 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
162a0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
162b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
162c0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
162d0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
162e0 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
162f0 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
16320 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a  pace available *
16330 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c  /.  int szSpace,
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
16360 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
16370 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46   */.  char **ppF
16380 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
16390 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61        /* OUT: Ca
163a0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65  ller should free
163b0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f   this pointer */
163c0 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
163d0 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
163e0 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
163f0 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
16400 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66  rn */.  int nOff
16410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16420 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
16430 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e  ment pSpace by n
16440 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20  Off to align it 
16450 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16480 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
16490 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a   for *p */..  /*
164a0 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
164b0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
164c0 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
164d0 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
164e0 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
164f0 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
16500 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
16510 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
16520 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
16530 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
16540 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
16550 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
16560 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
16570 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
16580 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
16590 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
165a0 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
165b0 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
165c0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
165d0 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
165e0 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
165f0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
16600 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
16610 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70  ce+nOff ){.    p
16620 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
16630 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  rd *)sqlite3DbMa
16640 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
16650 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
16660 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61    *ppFree = (cha
16670 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21  r *)p;.    if( !
16680 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
16690 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28  }else{.    p = (
166a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29  UnpackedRecord*)
166b0 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20  &pSpace[nOff];. 
166c0 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a     *ppFree = 0;.
166d0 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d    }..  p->aMem =
166e0 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
166f0 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
16700 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
16710 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
16720 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
16730 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
16740 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
16750 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
16760 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
16770 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
16780 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
16790 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
167a0 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
167b0 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
167c0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
167d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
167e0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
167f0 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
16800 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
16810 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
16820 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
16830 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
16840 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
16850 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
16860 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
16870 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
16880 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
16890 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
168a0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
168b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
168c0 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
168d0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
168e0 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
168f0 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
16900 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
16910 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
16920 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
16930 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
16940 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
16950 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
16960 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
16970 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
16980 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
16990 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
169a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
169b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
169c0 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
169d0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
169e0 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a00 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
16a10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
16a20 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
16a30 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
16a40 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a    p->flags = 0;.
16a50 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
16a60 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
16a70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
16a80 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
16a90 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
16aa0 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
16ab0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
16ac0 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c  dr && u<p->nFiel
16ad0 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a  d && d<=nKey ){.
16ae0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
16af0 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d  ype;..    idx +=
16b00 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
16b10 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f  ey[idx], serial_
16b20 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  type);.    pMem-
16b30 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  >enc = pKeyInfo-
16b40 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  >enc;.    pMem->
16b50 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
16b60 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e  b;.    /* pMem->
16b70 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71  flags = 0; // sq
16b80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
16b90 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68  et() will set th
16ba0 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  is for us */.   
16bb0 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pMem->zMalloc =
16bc0 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   0;.    pMem->z 
16bd0 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
16be0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
16bf0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
16c00 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
16c10 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
16c20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65   u++;.  }.  asse
16c30 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
16c40 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
16c50 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
16c60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16c70 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
16c80 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
16c90 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
16ca0 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
16cb0 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
16cc0 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
16cd0 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
16ce0 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
16cf0 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
16d00 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
16d10 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
16d20 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
16d30 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
16d40 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
16d50 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
16d60 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
16d70 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   th OP_MakeRecor
16d80 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
16d90 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
16da0 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
16db0 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
16dc0 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
16dd0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
16de0 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
16df0 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
16e00 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
16e10 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
16e20 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
16e30 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20  lds..** The key 
16e40 77 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64  with fewer field
16e50 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d  s is usually com
16e60 70 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20  pares less than 
16e70 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b  the .** longer k
16e80 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20  ey.  However if 
16e90 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  the UNPACKED_INC
16ea0 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50  RKEY flags in pP
16eb0 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61  Key2 is set.** a
16ec0 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
16ed0 65 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c  efixes are equal
16ee0 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c  , then key1 is l
16ef0 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a  ess than key2..*
16f00 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41  * Or if the UNPA
16f10 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49  CKED_MATCH_PREFI
16f20 58 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  X flag is set an
16f30 64 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61  d the prefixes a
16f40 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65  re.** equal, the
16f50 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63  n the keys are c
16f60 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
16f70 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65  equal and.** the
16f80 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68   parts beyond th
16f90 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20  e common prefix 
16fa0 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  are ignored..*/.
16fb0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
16fc0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
16fd0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
16fe0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
16ff0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
17000 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
17010 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
17020 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
17030 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
17040 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
17050 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
17060 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
17070 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
17080 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17090 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
170a0 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
170b0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
170c0 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
170d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
170e0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
170f0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
17100 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
17110 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
17120 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
17130 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
17140 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
17150 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
17160 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
17170 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
17180 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
17190 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
171a0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
171b0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
171c0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
171d0 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
171e0 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
171f0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17200 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
17210 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
17220 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
17230 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
17240 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
17250 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
17260 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
17270 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
17280 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
17290 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
172a0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
172b0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
172c0 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
172d0 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
172e0 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
172f0 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
17300 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
17310 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
17320 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
17330 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
17340 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
17350 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
17360 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
17370 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
17380 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
17390 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
173a0 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
173b0 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
173c0 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
173d0 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
173e0 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
173f0 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
17400 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
17410 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
17420 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
17430 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
17440 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
17450 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
17460 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
17470 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
17480 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
17490 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
174a0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
174b0 2b 31 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  +1>=pPKey2->nFie
174c0 6c 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ld );.  assert( 
174d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
174e0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 77 68 69  rder!=0 );.  whi
174f0 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
17500 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
17510 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73  eld ){.    u32 s
17520 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
17530 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
17540 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
17550 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
17560 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
17570 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
17580 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
17590 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
175a0 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
175b0 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
175c0 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
175d0 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
175e0 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
175f0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
17600 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
17610 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
17620 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
17630 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
17640 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
17650 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
17660 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
17670 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
17680 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
17690 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
176a0 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
176b0 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
176c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
176d0 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
176e0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
176f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
17700 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
17710 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
17720 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
17730 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
17740 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
17750 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
17760 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17770 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
17780 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
17790 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
177a0 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
177b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
177c0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
177d0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
177e0 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
177f0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
17800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
17810 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
17820 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
17830 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
17840 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
17850 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
17860 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17870 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
17880 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
17890 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20  nt below */..   
178a0 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65     /* Invert the
178b0 20 72 65 73 75 6c 74 20 69 66 20 77 65 20 61 72   result if we ar
178c0 65 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72  e using DESC sor
178d0 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
178e0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
178f0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
17900 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
17910 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a  c;.      }.    .
17920 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17930 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c  PREFIX_SEARCH fl
17940 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c  ag is set and al
17950 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74 20  l fields except 
17960 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20  the final.      
17970 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77  ** rowid field w
17980 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  ere equal, then 
17990 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49 58  clear the PREFIX
179a0 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64  _SEARCH flag and
179b0 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70   set .      ** p
179c0 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20  PKey2->rowid to 
179d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
179e0 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20   rowid field in 
179f0 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a  (pKey1, nKey1)..
17a00 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
17a10 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f   used by the OP_
17a20 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e  IsUnique opcode.
17a30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17a40 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61  if( (pPKey2->fla
17a50 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
17a60 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26 20  EFIX_SEARCH) && 
17a70 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65  i==(pPKey2->nFie
17a80 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ld-1) ){.       
17a90 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73   assert( idx1==s
17aa0 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20  zHdr1 && rc );. 
17ab0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
17ac0 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em1.flags & MEM_
17ad0 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  Int );.        p
17ae0 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20  PKey2->flags &= 
17af0 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58  ~UNPACKED_PREFIX
17b00 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20  _SEARCH;.       
17b10 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d   pPKey2->rowid =
17b20 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20   mem1.u.i;.     
17b30 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65   }.    .      re
17b40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17b50 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
17b60 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
17b70 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
17b80 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
17b90 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
17ba0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
17bb0 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
17bc0 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
17bd0 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
17be0 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
17bf0 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
17c00 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
17c10 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
17c20 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
17c30 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
17c40 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
17c50 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
17c60 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
17c70 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
17c80 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
17c90 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
17ca0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
17cb0 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
17cc0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
17cd0 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73  Y.  ** flag is s
17ce0 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74  et, then break t
17cf0 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74 69  he tie by treati
17d00 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65  ng key2 as large
17d10 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55  r..  ** If the U
17d20 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
17d30 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c  TCH flag is set,
17d40 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20   then keys with 
17d50 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a  common prefixes.
17d60 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65    ** are conside
17d70 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e  red to be equal.
17d80 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
17d90 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74   longer key is t
17da0 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e  he .  ** larger.
17db0 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c    As it happens,
17dc0 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c   the pPKey2 will
17dd0 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c   always be the l
17de0 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68  onger.  ** if th
17df0 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65  ere is a differe
17e00 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nce..  */.  asse
17e10 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69  rt( rc==0 );.  i
17e20 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
17e30 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52   & UNPACKED_INCR
17e40 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  KEY ){.    rc = 
17e50 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  -1;.  }else if( 
17e60 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
17e70 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
17e80 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20  MATCH ){.    /* 
17e90 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20  Leave rc==0 */. 
17ea0 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c   }else if( idx1<
17eb0 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63  szHdr1 ){.    rc
17ec0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
17ed0 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a  rn rc;.}. ../*.*
17ee0 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
17ef0 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
17f00 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
17f10 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
17f20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
17f30 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
17f40 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
17f50 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
17f60 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
17f70 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
17f80 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
17f90 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
17fa0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
17fb0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
17fc0 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
17fd0 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
17fe0 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
17ff0 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
18000 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
18010 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
18020 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
18030 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
18040 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
18050 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
18060 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
18070 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
18080 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
18090 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
180a0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
180b0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
180c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
180d0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
180e0 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
180f0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
18100 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
18110 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
18120 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18130 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
18140 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53  em m, v;..  UNUS
18150 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
18160 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
18170 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
18180 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
18190 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
181a0 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
181b0 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
181c0 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
181d0 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
181e0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
181f0 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
18200 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
18210 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
18220 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
18230 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
18240 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
18250 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
18260 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
18270 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
18280 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
18290 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
182a0 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
182b0 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
182c0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
182d0 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
182e0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
182f0 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a  ITE_OK );     /*
18300 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
18310 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
18320 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
18330 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
18340 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
18350 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
18360 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
18370 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
18380 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
18390 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
183a0 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
183b0 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
183c0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
183d0 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
183e0 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b  , 0, (int)nCellK
183f0 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
18400 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
18410 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
18420 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   The index entry
18430 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68   must begin with
18440 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a   a header size *
18450 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
18460 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
18470 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61  szHdr);.  testca
18480 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a  se( szHdr==3 );.
18490 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
184a0 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20  r==m.n );.  if( 
184b0 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33  unlikely(szHdr<3
184c0 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d   || (int)szHdr>m
184d0 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
184e0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
184f0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
18500 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
18510 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
18520 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
18530 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
18540 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
18550 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
18560 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
18570 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
18580 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
18590 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
185a0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
185b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
185c0 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
185d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
185e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
185f0 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
18600 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
18610 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
18620 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
18630 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
18640 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
18650 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
18660 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
18670 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
18680 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
18690 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
186a0 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
186b0 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
186c0 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
186d0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
186e0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
186f0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
18700 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
18710 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  n(typeRowid);.  
18720 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
18730 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
18740 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
18750 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
18760 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
18770 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
18780 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
18790 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
187a0 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
187b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
187c0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
187d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
187e0 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
187f0 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
18800 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
18810 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
18820 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
18830 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
18840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18850 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
18860 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
18870 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
18880 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
18890 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
188a0 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
188b0 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
188c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
188d0 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
188e0 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
188f0 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c  estcase( m.zMall
18900 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  oc!=0 );.  sqlit
18910 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
18920 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
18930 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18940 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  PT;.}../*.** Com
18950 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
18960 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
18970 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
18980 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67  s pointing to ag
18990 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
189a0 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61   string in pUnpa
189b0 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74  cked.  Write int
189c0 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
189d0 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
189e0 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
189f0 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
18a00 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
18a10 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
18a20 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b  ter than pUnpack
18a30 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ed.  Return SQLI
18a40 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18a50 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65  ..**.** pUnpacke
18a60 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  d is either crea
18a70 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
18a80 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
18a90 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
18aa0 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
18ab0 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
18ac0 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
18ad0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
18ae0 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
18af0 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48  ored as well.  H
18b00 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ence, this routi
18b10 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73  ne only compares
18b20 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a   the prefixes .*
18b30 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72  * of the keys pr
18b40 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
18b50 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20   rowid, not the 
18b60 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69  entire key..*/.i
18b70 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
18b80 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56  xKeyCompare(.  V
18b90 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  dbeCursor *pC,  
18ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18bb0 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
18bc0 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
18bd0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
18be0 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20  *pUnpacked,  /* 
18bf0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
18c00 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61   of key to compa
18c10 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
18c20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
18c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
18c40 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
18c50 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
18c60 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
18c70 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
18c80 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
18c90 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  pCur = pC->pCurs
18ca0 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  or;.  Mem m;..  
18cb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
18cc0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
18cd0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
18ce0 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
18cf0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
18d00 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
18d10 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
18d20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
18d30 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
18d40 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
18d50 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
18d60 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  /.  /* nCellKey 
18d70 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
18d80 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
18d90 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
18da0 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20  of the say.  ** 
18db0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
18dc0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
18dd0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
18de0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
18df0 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
18e00 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
18e10 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
18e20 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
18e30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18e40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18e50 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20   }.  memset(&m, 
18e60 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
18e70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
18e80 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
18e90 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69  ->pCursor, 0, (i
18ea0 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
18eb0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
18ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
18ed0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55    }.  assert( pU
18ee0 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26  npacked->flags &
18ef0 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
18f00 5f 4d 41 54 43 48 20 29 3b 0a 20 20 2a 72 65 73  _MATCH );.  *res
18f10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
18f20 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
18f30 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
18f40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
18f50 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
18f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
18f80 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
18f90 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
18fa0 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
18fb0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
18fc0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
18fd0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
18fe0 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
18ff0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19000 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
19010 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
19020 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
19030 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19040 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
19050 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
19060 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
19070 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
19080 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
19090 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
190a0 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
190b0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
190c0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
190d0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
190e0 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
190f0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
19100 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
19110 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
19120 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
19130 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
19140 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
19150 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
19160 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
19170 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
19180 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
19190 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
191a0 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
191b0 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
191c0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
191d0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
191e0 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
191f0 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
19200 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
19210 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
19220 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
19230 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
19240 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
19250 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
19260 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
19270 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
19280 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
19290 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
192a0 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
192b0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
192c0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
192d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
192e0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
192f0 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
19300 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
19310 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
19320 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
19330 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
19340 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
19350 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19360 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
19370 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
19380 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
19390 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
193a0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
193b0 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
193c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
193d0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
193e0 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
193f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
19400 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
19410 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
19420 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
19430 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
19440 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
19450 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
19460 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
19470 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
19480 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
19490 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
194a0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
194b0 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
194c0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
194d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
194e0 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
194f0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
19500 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
19510 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
19520 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
19530 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
19540 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
19550 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
19560 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
19570 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
19580 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
19590 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
195a0 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
195b0 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
195c0 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
195d0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
195e0 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
195f0 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
19600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
19610 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19620 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
19630 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
19640 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19650 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
19660 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
19670 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
19680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19690 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d  eMemStoreType((M
196a0 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  em *)pRet);.    
196b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
196c0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
196d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
196e0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
196f0 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
19700 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
19710 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
19720 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
19730 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
19740 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
19750 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
19760 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
19770 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
19780 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
19790 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
197a0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
197b0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
197c0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
197d0 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
197e0 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
197f0 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
19800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
19810 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
19820 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
19830 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
19840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19850 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
19860 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
19870 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
19880 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
19890 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
198a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
198b0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
198c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
198d0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
198e0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
198f0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
19900 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
19910 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
19920 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
19930 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
19940 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
19950 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
19960 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
19970 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
19980 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
19990 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
199a0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
199b0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
199c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
199d0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
199e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
199f0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
19a00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19a10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19a20 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
19a30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
19a40 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a  EUPDATE_HOOK../*
19a50 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
19a60 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
19a70 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20  t NULL, release 
19a80 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  any allocations 
19a90 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
19aa0 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ith the memory c
19ab0 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61  ells in the p->a
19ac0 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73  Mem[] array. Als
19ad0 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63  o free the Unpac
19ae0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
19af0 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75  ucture itself, u
19b00 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
19b10 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ee()..**.** This
19b20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
19b30 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b  d to free Unpack
19b40 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
19b50 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  res allocated by
19b60 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61  .** the vdbeUnpa
19b70 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
19b80 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62  ion found in vdb
19b90 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69  eapi.c..*/.stati
19ba0 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55  c void vdbeFreeU
19bb0 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20  npacked(sqlite3 
19bc0 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63  *db, UnpackedRec
19bd0 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
19be0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
19bf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
19c00 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
19c10 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
19c20 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
19c30 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
19c40 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
19c50 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
19c60 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  em);.    }.    s
19c70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19c80 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
19c90 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65  * Invoke the pre
19ca0 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66  -update hook. If
19cb0 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
19cc0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65  TE or DELETE pre
19cd0 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a  -update call,.**
19ce0 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73   then cursor pas
19cf0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
19d00 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  d argument shoul
19d10 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  d point to the r
19d20 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62  ow about.** to b
19d30 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  e update or dele
19d40 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c  ted. If the appl
19d50 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  ication calls sq
19d60 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
19d70 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65  old(),.** the re
19d80 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c  quired value wil
19d90 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
19da0 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
19db0 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  r points to..*/.
19dc0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
19dd0 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20  PreUpdateHook(. 
19de0 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64   /* Vdbe pre-upd
19e10 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f  ate hook is invo
19e20 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65  ked by */.  Vdbe
19e30 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
19e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
19e50 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c  ursor to grab ol
19e60 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  d.* values from 
19e70 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
19ea0 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
19eb0 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e   DELETE */.  con
19ec0 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ee0 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f  Database name */
19ef0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74     /* Modified t
19f20 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b  able */.  i64 iK
19f30 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey1,            
19f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
19f50 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a  tial key value *
19f60 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
19f90 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64  for new.* record
19fa0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
19fb0 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20   *db = v->db;.  
19fc0 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65  i64 iKey2;.  Pre
19fd0 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65  Update preupdate
19fe0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19ff0 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTbl = pTab->zNa
1a000 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  me;.  static con
1a010 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72  st u8 fakeSortOr
1a020 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  der = 0;..  asse
1a030 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61  rt( db->pPreUpda
1a040 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  te==0 );.  memse
1a050 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c  t(&preupdate, 0,
1a060 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74   sizeof(PreUpdat
1a070 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53  e));.  if( op==S
1a080 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
1a090 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
1a0a0 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
1a0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79   }else{.    iKey
1a0c0 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a  2 = iKey1;.  }..
1a0d0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
1a0e0 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
1a0f0 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ol .       || (p
1a100 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
1a110 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d  b->nCol+1 && op=
1a120 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26  =SQLITE_DELETE &
1a130 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b  & iReg==-1).  );
1a140 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20  ..  preupdate.v 
1a150 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65  = v;.  preupdate
1a160 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20  .pCsr = pCsr;.  
1a170 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f  preupdate.op = o
1a180 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  p;.  preupdate.i
1a190 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  NewReg = iReg;. 
1a1a0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
1a1b0 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72  fo.db = db;.  pr
1a1c0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
1a1d0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
1a1e0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
1a1f0 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62  fo.nField = pTab
1a200 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64  ->nCol;.  preupd
1a210 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72  ate.keyinfo.aSor
1a220 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66  tOrder = (u8*)&f
1a230 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  akeSortOrder;.  
1a240 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20  preupdate.iKey1 
1a250 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70  = iKey1;.  preup
1a260 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65  date.iKey2 = iKe
1a270 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  y2;.  preupdate.
1a280 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69 50  iPKey = pTab->iP
1a290 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Key;..  db->pPre
1a2a0 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
1a2b0 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
1a2c0 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
1a2d0 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
1a2e0 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
1a2f0 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
1a300 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
1a310 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
1a320 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
1a330 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
1a340 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
1a350 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
1a360 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  e.pUnpacked);.  
1a370 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
1a380 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70  (db, preupdate.p
1a390 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
1a3a0 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
1a3b0 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
1a3c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a3d0 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
1a3e0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1a3f0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1a400 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
1a410 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
1a420 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a430 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
1a440 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
1a450 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1a460 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
1a470 2f 0a                                            /.