/ Hex Artifact Content
Login

Artifact 70d850ccb339024987b9e6fc348a5792df37c9b4:


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 74 6d 70 20  ar *zTmp;.  tmp 
06f0: 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a  = *pA;.  *pA = *
0700: 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b  pB;.  *pB = tmp;
0710: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e  .  pTmp = pA->pN
0720: 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74  ext;.  pA->pNext
0730: 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pB->pNext;.  
0740: 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70  pB->pNext = pTmp
0750: 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70  ;.  pTmp = pA->p
0760: 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65  Prev;.  pA->pPre
0770: 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20  v = pB->pPrev;. 
0780: 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d   pB->pPrev = pTm
0790: 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e  p;.  zTmp = pA->
07a0: 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c  zSql;.  pA->zSql
07b0: 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pB->zSql;.  p
07c0: 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a  B->zSql = zTmp;.
07d0: 20 20 70 42 2d 3e 69 73 50 72 65 70 61 72 65 56    pB->isPrepareV
07e0: 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 70 61 72  2 = pA->isPrepar
07f0: 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  eV2;.}..#ifdef S
0800: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0810: 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67 20 6f  * Turn tracing o
0820: 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64  n or off.*/.void
0830: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
0840: 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c 45 20  e(Vdbe *p, FILE 
0850: 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72  *trace){.  p->tr
0860: 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 23  ace = trace;.}.#
0870: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  endif../*.** Res
0880: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70  ize the Vdbe.aOp
0890: 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 69   array so that i
08a0: 74 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  t is at least on
08b0: 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68 61 6e  e op larger than
08c0: 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a 2a 0a   .** it was..**.
08d0: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
08e0: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
08f0: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0900: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0910: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
0920: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
0930: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
0940: 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65  Vdbe.nOpAlloc re
0950: 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  main .** unchang
0960: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
0970: 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20  hat any opcodes 
0980: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0990: 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72  d can be .** cor
09a0: 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74  rectly deallocat
09b0: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
09c0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56 64  e rest of the Vd
09d0: 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  be)..*/.static i
09e0: 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56  nt growOpArray(V
09f0: 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 62 65 4f  dbe *p){.  VdbeO
0a00: 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  p *pNew;.  int n
0a10: 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c  New = (p->nOpAll
0a20: 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  oc ? p->nOpAlloc
0a30: 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f  *2 : (int)(1024/
0a40: 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20  sizeof(Op)));.  
0a50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
0a60: 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70  Realloc(p->db, p
0a70: 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a 65  ->aOp, nNew*size
0a80: 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20 70  of(Op));.  if( p
0a90: 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f  New ){.    p->nO
0aa0: 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  pAlloc = sqlite3
0ab0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
0ac0: 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65 6f 66  db, pNew)/sizeof
0ad0: 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  (Op);.    p->aOp
0ae0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
0af0: 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53 51  eturn (pNew ? SQ
0b00: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
0b10: 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NOMEM);.}../*.*
0b20: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0b30: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0b40: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0b50: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0b60: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0b70: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0b80: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0b90: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0ba0: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
0bb0: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
0bc0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
0bd0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
0be0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
0bf0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
0c00: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0c10: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
0c20: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
0c30: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
0c40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
0c50: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
0c60: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
0c70: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
0c80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
0c90: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
0ca0: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
0cb0: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
0cc0: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  operand..*/.int 
0cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0ce0: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
0cf0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0d00: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e  2, int p3){.  in
0d10: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
0d20: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
0d30: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
0d40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0d50: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
0d60: 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30  rt( op>0 && op<0
0d70: 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  xff );.  if( p->
0d80: 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20  nOpAlloc<=i ){. 
0d90: 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72     if( growOpArr
0da0: 61 79 28 70 29 20 29 7b 0a 20 20 20 20 20 20 72  ay(p) ){.      r
0db0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
0dc0: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20   }.  p->nOp++;. 
0dd0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
0de0: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ];.  pOp->opcode
0df0: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70   = (u8)op;.  pOp
0e00: 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  ->p5 = 0;.  pOp-
0e10: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0e20: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0e30: 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d  >p3 = p3;.  pOp-
0e40: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.p = 0;.  pOp
0e50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
0e60: 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51  TUSED;.#ifdef SQ
0e70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f 70  LITE_DEBUG.  pOp
0e80: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
0e90: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
0ea0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
0eb0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
0ec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
0ed0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0ee0: 4f 70 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64  Op[i]);.  }.#end
0ef0: 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  if.#ifdef VDBE_P
0f00: 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79  ROFILE.  pOp->cy
0f10: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  cles = 0;.  pOp-
0f20: 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  >cnt = 0;.#endif
0f30: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
0f40: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0f50: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
0f60: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
0f70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0f80: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
0f90: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
0fa0: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
0fb0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0fc0: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
0fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0fe0: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
0ff0: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1000: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
1010: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1020: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
1030: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1040: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1050: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  , p2, 0);.}.../*
1060: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1070: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1080: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1090: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
10a0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
10b0: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
10c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10d0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
10e0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
10f0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1100: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1110: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1130: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1140: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1150: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1160: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1170: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1180: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1190: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
11a0: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
11b0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
11c0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
11d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
11e0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
11f0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
1200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1210: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1220: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
1230: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
1240: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
1250: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1260: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1270: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f  OP_ParseSchema o
1280: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
1290: 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f  tine is broken o
12a0: 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ut from.** sqlit
12b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73  e3VdbeAddOp4() s
12c0: 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f  ince it needs to
12d0: 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d   also needs to m
12e0: 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a  ark all btrees.*
12f0: 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e  * as having been
1300: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
1310: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
1320: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1330: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1340: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
1350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1360: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1370: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1380: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1390: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
13a0: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
13b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
13c0: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
13d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
13e0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
13f0: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
1400: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
1410: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
1420: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1430: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
1440: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
1450: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1460: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1470: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1480: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1490: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
14a0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
14b0: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
14c0: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
14d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
14e0: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1500: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1510: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1520: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1530: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1540: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1560: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1570: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1580: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1590: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
15a0: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
15b0: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
15c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
15d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15e0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
15f0: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
1600: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
1610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1620: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1630: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
1640: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
1650: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1660: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1670: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1680: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1690: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
16a0: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
16b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
16c0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
16d0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
16e0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
16f0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
1700: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
1710: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
1720: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
1730: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
1740: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
1750: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1760: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1770: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1780: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1790: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
17a0: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
17b0: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
17c0: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
17d0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
17e0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
17f0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
1800: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
1810: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
1820: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
1830: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
1840: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
1850: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
1860: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
1870: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
1880: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
1890: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
18a0: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
18b0: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
18c0: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
18d0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
18e0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
18f0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
1900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1910: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
1920: 70 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d  p){.  int i = p-
1930: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
1940: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1950: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1960: 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d  ;.  if( (i & (i-
1970: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  1))==0 ){.    p-
1980: 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  >aLabel = sqlite
1990: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
19a0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
19b0: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b             (i*2+
19e0: 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61  1)*sizeof(p->aLa
19f0: 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  bel[0]));.  }.  
1a00: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1a10: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1a20: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1a30: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1a40: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1a50: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1a60: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1a70: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1a80: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
1a90: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
1aa0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
1ab0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
1ac0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
1ad0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1ae0: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1af0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1b00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1b10: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1b20: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1b30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1b40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1b50: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1b60: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1b70: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1b80: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1b90: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ba0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1bb0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1bc0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1bd0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1be0: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1bf0: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1c00: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1c10: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1c20: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1c30: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1c40: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1c50: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1c60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1c70: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1c80: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1c90: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1ca0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1cb0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1cc0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1cd0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1ce0: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1cf0: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1d00: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1d10: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1d20: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1d30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1d40: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1d50: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1d60: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1d70: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1d80: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1d90: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1dc0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1dd0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1de0: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1df0: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1e00: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1e10: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1e20: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1e30: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1e40: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1e50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1e60: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1e70: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1e80: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1e90: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1ea0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1eb0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1ec0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1ed0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1ee0: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1ef0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1f00: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1f10: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f30: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1f40: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1f50: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1f60: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1f70: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1f80: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1f90: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1fc0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1fd0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1fe0: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1ff0: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
2000: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
2010: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
2020: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
2030: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
2040: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
2050: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
2060: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
2070: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
2080: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
2090: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
20a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
20b0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
20c0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
20d0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
20e0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
20f0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2100: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2110: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2120: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2130: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2140: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2150: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2160: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2170: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
2180: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
2190: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
21a0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
21b0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
21c0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
21d0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
21e0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
21f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2200: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2210: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2220: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2230: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2240: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2250: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2260: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2270: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
2280: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
2290: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
22a0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
22b0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
22c0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
22d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
22e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
22f0: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2300: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2310: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2330: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2350: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2360: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2370: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2380: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
2390: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
23a0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
23b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
23c0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
23d0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
23e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
23f0: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2400: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2410: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2420: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2430: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2440: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2450: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2460: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2470: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2480: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2490: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
24a0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
24b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
24c0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
24d0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
24e0: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
24f0: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2500: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2510: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2520: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2530: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2540: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2550: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2560: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2570: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
2580: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
2590: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
25a0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
25b0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
25c0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
25d0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
25e0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
25f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2600: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2610: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2620: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2630: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2640: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2650: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2660: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2670: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
2680: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
2690: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
26a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
26b0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
26c0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
26d0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
26e0: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
26f0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2700: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2710: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2720: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2730: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2740: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2750: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2760: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2770: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
2780: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
2790: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
27a0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
27b0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
27c0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
27d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27e0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
27f0: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2800: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2810: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2820: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2830: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2840: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2850: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2860: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2870: 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66  & ((pOp->p1&0xff
2880: 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
2890: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
28a0: 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20  =OE_Abort)).    
28b0: 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72  ){.      hasAbor
28c0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
28d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
28e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
28f0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
2900: 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
2910: 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72 74  true if hasAbort
2920: 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69  ==mayAbort. Or i
2930: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
2940: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a  re occurred..  *
2950: 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  * If malloc fail
2960: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69  ed, then the whi
2970: 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20  le() loop above 
2980: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65  may not have ite
2990: 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75  rated.  ** throu
29a0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61  gh all opcodes a
29b0: 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20  nd hasAbort may 
29c0: 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74  be set incorrect
29d0: 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20  ly. Return.  ** 
29e0: 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63 61  true for this ca
29f0: 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  se to prevent th
2a00: 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74 68  e assert() in th
2a10: 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a  e callers frame.
2a20: 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e    ** from failin
2a30: 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  g.  */.  return 
2a40: 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( v->db->mallocF
2a50: 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72  ailed || hasAbor
2a60: 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d  t==mayAbort );.}
2a70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2a80: 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71  E_DEBUG - the sq
2a90: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
2aa0: 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a  ort() function *
2ab0: 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68  /../*.** Loop th
2ac0: 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61  rough the progra
2ad0: 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32  m looking for P2
2ae0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
2af0: 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20   negative.** on 
2b00: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
2b10: 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 76 61  s.  Each such va
2b20: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20  lue is a label. 
2b30: 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20   Resolve the.** 
2b40: 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67  label by setting
2b50: 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f   the P2 value to
2b60: 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e   its correct non
2b70: 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  -zero value..**.
2b80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b90: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61  is called once a
2ba0: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
2bb0: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
2bc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61  ted..**.** Varia
2bd0: 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ble *pMaxFuncArg
2be0: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
2bf0: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  maximum value of
2c00: 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74   any P2 argument
2c10: 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75   .** to an OP_Fu
2c20: 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74  nction, OP_AggSt
2c30: 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  ep or OP_VFilter
2c40: 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73   opcode. This is
2c50: 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c   used by .** sql
2c60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
2c70: 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20  y() to size the 
2c80: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
2c90: 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70  ay..**.** The Op
2ca0: 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69  .opflags field i
2cb0: 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63  s set on all opc
2cc0: 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  odes..*/.static 
2cd0: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
2ce0: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
2cf0: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
2d00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
2d10: 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61   nMaxArgs = *pMa
2d20: 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20  xFuncArgs;.  Op 
2d30: 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  *pOp;.  int *aLa
2d40: 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b  bel = p->aLabel;
2d50: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
2d60: 20 31 3b 0a 20 20 70 2d 3e 6e 6f 49 4f 20 3d 20   1;.  p->noIO = 
2d70: 31 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  1;.  for(pOp=p->
2d80: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
2d90: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
2da0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64  +){.    u8 opcod
2db0: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
2dc0: 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61  ..    pOp->opfla
2dd0: 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  gs = sqlite3Opco
2de0: 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64  deProperty[opcod
2df0: 65 5d 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  e];.    if( opco
2e00: 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  de==OP_Function 
2e10: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67  || opcode==OP_Ag
2e20: 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 69  gStep ){.      i
2e30: 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41  f( pOp->p5>nMaxA
2e40: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2e50: 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65   pOp->p5;.    }e
2e60: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
2e70: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  OP_Transaction )
2e80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2e90: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
2ea0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
2eb0: 70 2d 3e 6e 6f 49 4f 20 3d 20 30 3b 0a 20 20 20  p->noIO = 0;.   
2ec0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
2ed0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 0a 20 20 20  e==OP_Vacuum.   
2ee0: 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64          || opcod
2ef0: 65 3d 3d 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  e==OP_JournalMod
2f00: 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
2f10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2f20: 4c 45 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  LE.           ||
2f30: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 68 65 63   opcode==OP_Chec
2f40: 6b 70 6f 69 6e 74 0a 23 65 6e 64 69 66 0a 20 20  kpoint.#endif.  
2f50: 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65    ){.      p->re
2f60: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
2f70: 20 20 70 2d 3e 6e 6f 49 4f 20 3d 20 30 3b 0a 23    p->noIO = 0;.#
2f80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2fa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
2fb0: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
2fc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
2fd0: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
2fe0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
2ff0: 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >p2;.    }else i
3000: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46  f( opcode==OP_VF
3010: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69  ilter ){.      i
3020: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  nt n;.      asse
3030: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
3040: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  = 3 );.      ass
3050: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
3060: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
3070: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70  );.      n = pOp
3080: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-1].p1;.      i
3090: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
30a0: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65  nMaxArgs = n;.#e
30b0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
30c0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65  f( opcode==OP_Ne
30d0: 78 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  xt || opcode==OP
30e0: 5f 53 6f 72 74 65 72 4e 65 78 74 20 29 7b 0a 20  _SorterNext ){. 
30f0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64       pOp->p4.xAd
3100: 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42  vance = sqlite3B
3110: 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20  treeNext;.      
3120: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3130: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 7d 65  _ADVANCE;.    }e
3140: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
3150: 4f 50 5f 50 72 65 76 20 29 7b 0a 20 20 20 20 20  OP_Prev ){.     
3160: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
3170: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
3180: 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20  Previous;.      
3190: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
31a0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 7d 0a  _ADVANCE;.    }.
31b0: 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  .    if( (pOp->o
31c0: 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a  pflags & OPFLG_J
31d0: 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e  UMP)!=0 && pOp->
31e0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  p2<0 ){.      as
31f0: 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32  sert( -1-pOp->p2
3200: 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  <p->nLabel );.  
3210: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c      pOp->p2 = aL
3220: 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d  abel[-1-pOp->p2]
3230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
3240: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
3250: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  b, p->aLabel);. 
3260: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a   p->aLabel = 0;.
3270: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
3280: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f  = nMaxArgs;.}../
3290: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
32a0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
32b0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
32c0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
32d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
32e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
32f0: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
3300: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
3310: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3320: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3340: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
3350: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3360: 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73  array of opcodes
3370: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3380: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73  .** the Vdbe pas
3390: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
33a0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73   argument. It is
33b0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
33c0: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74  ponsibility.** t
33d0: 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68  o arrange for th
33e0: 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79  e returned array
33f0: 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c   to be eventuall
3400: 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68  y freed using th
3410: 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70  e .** vdbeFreeOp
3420: 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e  Array() function
3430: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
3440: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20  eturning, *pnOp 
3450: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
3460: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
3470: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  in the returned.
3480: 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20  ** array. Also, 
3490: 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74  *pnMaxArg is set
34a0: 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f   to the larger o
34b0: 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  f its current va
34c0: 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  lue and .** the 
34d0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
34e0: 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70  s in the Vdbe.ap
34f0: 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75  Arg[] array requ
3500: 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  ired to execute 
3510: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
3520: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62   program..*/.Vdb
3530: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
3540: 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65  TakeOpArray(Vdbe
3550: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20   *p, int *pnOp, 
3560: 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a  int *pnMaxArg){.
3570: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20    VdbeOp *aOp = 
3580: 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->aOp;.  assert
3590: 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d  ( aOp && !p->db-
35a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
35b0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
35c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  t sqlite3VdbeUse
35d0: 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74  sBtree() was not
35e0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
35f0: 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  VM */.  assert( 
3600: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20  p->btreeMask==0 
3610: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
3620: 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72  alues(p, pnMaxAr
3630: 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d  g);.  *pnOp = p-
3640: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  >nOp;.  p->aOp =
3650: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70   0;.  return aOp
3660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
3670: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
3680: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
3690: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
36a0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
36b0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
36c0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
36d0: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
36e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
36f0: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
3700: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
3710: 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69  const *aOp){.  i
3720: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
3730: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
3740: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
3750: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
3760: 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  Op > p->nOpAlloc
3770: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
3780: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
3790: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
37a0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41   p->nOp;.  if( A
37b0: 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a  LWAYS(nOp>0) ){.
37c0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
37d0: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
37e0: 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20  *pIn = aOp;.    
37f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
3800: 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20  i++, pIn++){.   
3810: 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d     int p2 = pIn-
3820: 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  >p2;.      VdbeO
3830: 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f  p *pOut = &p->aO
3840: 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20  p[i+addr];.     
3850: 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20   pOut->opcode = 
3860: 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pIn->opcode;.   
3870: 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49     pOut->p1 = pI
3880: 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28  n->p1;.      if(
3890: 20 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74 65   p2<0 && (sqlite
38a0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
38b0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20  pOut->opcode] & 
38c0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29  OPFLG_JUMP)!=0 )
38d0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
38e0: 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52  p2 = addr + ADDR
38f0: 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (p2);.      }els
3900: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  e{.        pOut-
3910: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20  >p2 = p2;.      
3920: 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  }.      pOut->p3
3930: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20   = pIn->p3;.    
3940: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
3950: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
3960: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
3970: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  0;.      pOut->p
3980: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
3990: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
39a0: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
39b0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
39c0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
39d0: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
39e0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
39f0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
3a00: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
3a10: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
3a20: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
3a30: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
3a40: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
3a50: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
3a60: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3a70: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
3a80: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
3a90: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
3aa0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
3ab0: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
3ac0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
3ad0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
3ae0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
3af0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
3b00: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
3b10: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
3b20: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
3b30: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
3b40: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
3b50: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3b60: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP1(Vdbe *p, u32
3b70: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3b80: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3b90: 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70  );.  if( ((u32)p
3ba0: 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20  ->nOp)>addr ){. 
3bb0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3bc0: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
3bd0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3be0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3bf0: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
3c00: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
3c10: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
3c20: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
3c30: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
3c40: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
3c50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3c60: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
3c70: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
3c80: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
3c90: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( p!=0 );.  if(
3ca0: 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61   ((u32)p->nOp)>a
3cb0: 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  ddr ){.    p->aO
3cc0: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
3cd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
3ce0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
3cf0: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
3d00: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
3d10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
3d20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3d30: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
3d40: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
3d50: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3d60: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28   p!=0 );.  if( (
3d70: 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64  (u32)p->nOp)>add
3d80: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3d90: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
3da0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3db0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3dc0: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
3dd0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
3de0: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
3df0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
3e00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3e10: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
3e20: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
3e30: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
3e40: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->aOp ){.    as
3e50: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
3e60: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
3e70: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b  nOp-1].p5 = val;
3e80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3e90: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
3ea0: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
3eb0: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
3ec0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
3ed0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3ee0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3ef0: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
3f00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3f10: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
3f20: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
3f30: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
3f40: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
3f50: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
3f60: 66 28 20 61 64 64 72 3e 3d 30 20 29 20 73 71 6c  f( addr>=0 ) sql
3f70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3f80: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
3f90: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
3fa0: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
3fb0: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
3fc0: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
3fd0: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
3fe0: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
3ff0: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
4000: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
4010: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4020: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
4030: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  n(sqlite3 *db, F
4040: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
4050: 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66   if( ALWAYS(pDef
4060: 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  ) && (pDef->flag
4070: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4080: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
4090: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
40a0: 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a  b, pDef);.  }.}.
40b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
40c0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
40d0: 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e  ite3 *, Op *, in
40e0: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  t);../*.** Delet
40f0: 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20  e a P4 value if 
4100: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74  necessary..*/.st
4110: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34  atic void freeP4
4120: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4130: 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a  t p4type, void *
4140: 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b  p4){.  if( p4 ){
4150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20  .    assert( db 
4160: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  );.    switch( p
4170: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  4type ){.      c
4180: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
4190: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
41a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
41b0: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63  DYNAMIC:.      c
41c0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a  ase P4_KEYINFO:.
41d0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
41e0: 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61  TARRAY:.      ca
41f0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  se P4_KEYINFO_HA
4200: 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20  NDOFF: {.       
4210: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4220: 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20  b, p4);.        
4230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4240: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52       case P4_MPR
4250: 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  INTF: {.        
4260: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
4270: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
4280: 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20  3_free(p4);.    
4290: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
42a0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
42b0: 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20  _VDBEFUNC: {.   
42c0: 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70       VdbeFunc *p
42d0: 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65  VdbeFunc = (Vdbe
42e0: 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20  Func *)p4;.     
42f0: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
4300: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64  Function(db, pVd
4310: 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a  beFunc->pFunc);.
4320: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
4330: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
4340: 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
4350: 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65  eteAuxData(pVdbe
4360: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  Func, 0);.      
4370: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4380: 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a  db, pVdbeFunc);.
4390: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
43a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
43b0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
43c0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
43d0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
43e0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
43f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4410: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
4420: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4430: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4440: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4450: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
4460: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
4470: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4480: 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20           Mem *p 
4490: 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20  = (Mem*)p4;.    
44a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
44b0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
44c0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
44d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
44e0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
44f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4500: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4510: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
4520: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4530: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4540: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
4550: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
4560: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4570: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
4590: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
45a0: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
45b0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
45c0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
45d0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
45e0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
45f0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
4600: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
4610: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
4620: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
4630: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
4640: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
4650: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
4660: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
4670: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
4680: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
4690: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
46a0: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
46b0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
46c0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
46d0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
46e0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73  TE_DEBUG.      s
46f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4700: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
4710: 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20  .#endif     .   
4720: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4730: 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b  DbFree(db, aOp);
4740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74  .}../*.** Link t
4750: 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62  he SubProgram ob
4760: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
4770: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4780: 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  nt into the link
4790: 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64  ed.** list at Vd
47a0: 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20  be.pSubProgram. 
47b0: 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65  This list is use
47c0: 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  d to delete all 
47d0: 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f  sub-program.** o
47e0: 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20  bjects when the 
47f0: 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  VM is no longer 
4800: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69  required..*/.voi
4810: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e  d sqlite3VdbeLin
4820: 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65  kSubProgram(Vdbe
4830: 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67   *pVdbe, SubProg
4840: 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e  ram *p){.  p->pN
4850: 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72  ext = pVdbe->pPr
4860: 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e  ogram;.  pVdbe->
4870: 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a  pProgram = p;.}.
4880: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4890: 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72  e opcode at addr
48a0: 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f   into OP_Noop.*/
48b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
48c0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
48d0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
48e0: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29  {.  if( p->aOp )
48f0: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
4900: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
4910: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
4920: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
4930: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
4940: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
4950: 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  p);.    memset(p
4960: 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  Op, 0, sizeof(pO
4970: 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d  p[0]));.    pOp-
4980: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
4990: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
49a0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
49b0: 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61   of the P4 opera
49c0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
49d0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
49e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
49f0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
4a00: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
4a10: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
4a20: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
4a30: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
4a40: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
4a50: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
4a60: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
4a70: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
4a80: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
4a90: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f  =0 then the P4 o
4aa0: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
4ab0: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
4ac0: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
4ad0: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
4ae0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4af0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4b00: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  3_malloc()..** A
4b10: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
4b20: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
4b30: 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64  of zP4 up to and
4b40: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
4b50: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
4b60: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
4b70: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
4b80: 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP4..**.** If 
4b90: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74  n==P4_KEYINFO it
4ba0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20   means that zP4 
4bb0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4bc0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
4bd0: 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69  ure..** A copy i
4be0: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65  s made of the Ke
4bf0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
4c00: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4c10: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
4c20: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20  ite3_malloc, to 
4c30: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
4c40: 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69  e Vdbe is finali
4c50: 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45  zed..** n==P4_KE
4c60: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e  YINFO_HANDOFF in
4c70: 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 34  dicates that zP4
4c80: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
4c90: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
4ca0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  * stored in memo
4cb0: 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ry that the call
4cc0: 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  er has obtained 
4cd0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
4ce0: 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c  loc. The .** cal
4cf0: 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66  ler should not f
4d00: 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ree the allocati
4d10: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66  on, it will be f
4d20: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
4d30: 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a  be is.** finaliz
4d40: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  ed..** .** Other
4d50: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
4d60: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
4d70: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
4d80: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
4d90: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
4da0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
4db0: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
4dc0: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
4dd0: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
4de0: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
4df0: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
4e00: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
4e10: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
4e20: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
4e30: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
4e40: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
4e50: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
4e60: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4e70: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
4e80: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4e90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
4ea0: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
4eb0: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
4ec0: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
4ed0: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
4ee0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4ef0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4f00: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
4f10: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64  ( p->aOp==0 || d
4f20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4f30: 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50  ){.    if ( n!=P
4f40: 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d  4_KEYINFO && n!=
4f50: 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20  P4_VTAB ) {.    
4f60: 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20    freeP4(db, n, 
4f70: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
4f80: 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &zP4);.    }.   
4f90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
4fa0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
4fc0: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
4fd0: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
4fe0: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
4ff0: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
5000: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5010: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
5020: 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20  ype==P4_NOTUSED 
5030: 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  || pOp->p4type==
5040: 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 66 72  P4_INT32 );.  fr
5050: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5060: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5070: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
5080: 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49  0;.  if( n==P4_I
5090: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
50a0: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
50b0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
50c0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
50d0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
50e0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
50f0: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
5100: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
5110: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
5120: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
5130: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5140: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
5150: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
5160: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  4==0 ){.    pOp-
5170: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5180: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5190: 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65  NOTUSED;.  }else
51a0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
51b0: 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  FO ){.    KeyInf
51c0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
51d0: 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79   int nField, nBy
51e0: 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20  te;..    nField 
51f0: 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34  = ((KeyInfo*)zP4
5200: 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e  )->nField;.    n
5210: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
5220: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65  KeyInfo) + (nFie
5230: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65  ld-1)*sizeof(pKe
5240: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29  yInfo->aColl[0])
5250: 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70   + nField;.    p
5260: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
5270: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
5280: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d  nByte);.    pOp-
5290: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  >p4.pKeyInfo = p
52a0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28  KeyInfo;.    if(
52b0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
52c0: 20 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65     u8 *aSortOrde
52d0: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
52e0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
52f0: 20 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46   zP4, nByte - nF
5300: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f  ield);.      aSo
5310: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
5320: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a  fo->aSortOrder;.
5330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 53        assert( aS
5340: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
5350: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
5360: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73  SortOrder = (uns
5370: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65  igned char*)&pKe
5380: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69  yInfo->aColl[nFi
5390: 65 6c 64 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  eld];.      memc
53a0: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
53b0: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
53c0: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
53d0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
53e0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
53f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
5400: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5410: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ed = 1;.      pO
5420: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
5430: 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  OTUSED;.    }.  
5440: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5450: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5460: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5470: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5480: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5490: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
54a0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
54b0: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    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 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
54f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
5500: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
5510: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
5520: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
5530: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
5540: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
5550: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5560: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5570: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
5580: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
5590: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
55a0: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
55b0: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
55c0: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
55d0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
55e0: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
55f0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5600: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
5610: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
5620: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
5630: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
5640: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5650: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
5660: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
5670: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
5680: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
5690: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
56a0: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
56b0: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
56c0: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
56d0: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
56e0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
56f0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
5700: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
5710: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5720: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
5730: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5740: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
5750: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
5760: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
5770: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
5780: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
5790: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
57a0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
57b0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
57c0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
57d0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
57e0: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
57f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5800: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
5810: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5820: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
5830: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5840: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
5850: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
5860: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
5870: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5880: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
5890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
58a0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
58b0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
58c0: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
58d0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
58e0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
58f0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
5900: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
5910: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
5920: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
5930: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
5940: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
5950: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
5960: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
5970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5980: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
5990: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
59a0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
59b0: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
59c0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
59d0: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
59e0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
59f0: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
5a00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
5a10: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
5a20: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
5a30: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
5a40: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
5a50: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5a60: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
5a70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
5a80: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
5a90: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
5aa0: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
5ab0: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
5ac0: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
5ad0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
5ae0: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
5af0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
5b00: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
5b10: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
5b20: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
5b30: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
5b40: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
5b50: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
5b60: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
5b70: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
5b80: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
5b90: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
5ba0: 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20  ter a OOM fault 
5bb0: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
5bc0: 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  o check to see i
5bd0: 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  f the return fro
5be0: 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  m .** this routi
5bf0: 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f  ne is a valid po
5c00: 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61  inter.  But beca
5c10: 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70  use the dummy.op
5c20: 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75  code is 0,.** du
5c30: 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  mmy will never b
5c40: 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54  e written to.  T
5c50: 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20  his is verified 
5c60: 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69  by code inspecti
5c70: 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e  on and.** by run
5c80: 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69  ning with Valgri
5c90: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20  nd..**.** About 
5ca0: 74 68 65 20 23 69 66 64 65 66 20 53 51 4c 49 54  the #ifdef SQLIT
5cb0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e  E_OMIT_TRACE:  N
5cc0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f  ormally, this ro
5cd0: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
5ce0: 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20  alled.** unless 
5cf0: 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20  p->nOp>0.  This 
5d00: 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
5d10: 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 51 4c  e absense of SQL
5d20: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a  ITE_OMIT_TRACE,.
5d30: 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 20 69  ** an OP_Trace i
5d40: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c  nstruction is al
5d50: 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 62 79  ways inserted by
5d60: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 28   sqlite3VdbeGet(
5d70: 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20  ) as soon as.** 
5d80: 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 63 72  a new VDBE is cr
5d90: 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 61 72  eated.  So we ar
5da0: 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 61 64  e free to set ad
5db0: 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77  dr to p->nOp-1 w
5dc0: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
5dd0: 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   to double-check
5de0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5df0: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  at the result is
5e00: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42   non-negative. B
5e10: 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ut.** if SQLITE_
5e20: 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 64 65  OMIT_TRACE is de
5e30: 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54 72  fined, the OP_Tr
5e40: 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 20 61  ace is omitted a
5e50: 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f  nd we do need to
5e60: 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 76 61  .** check the va
5e70: 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20  lue of p->nOp-1 
5e80: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
5e90: 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  g..*/.VdbeOp *sq
5ea0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
5eb0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5ec0: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
5ed0: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
5ee0: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
5ef0: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
5f00: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
5f10: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
5f20: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
5f30: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
5f40: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
5f50: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
5f60: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
5f70: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
5f80: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
5f90: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
5fa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5fb0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5fc0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
5fd0: 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  r<0 ){.#ifdef SQ
5fe0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5ff0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d      if( p->nOp==
6000: 30 20 29 20 72 65 74 75 72 6e 20 28 56 64 62 65  0 ) return (Vdbe
6010: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64  Op*)&dummy;.#end
6020: 69 66 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  if.    addr = p-
6030: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6040: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6050: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6060: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6070: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6080: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6090: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
60a0: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
60b0: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
60c0: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
60d0: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
60e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
60f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
6100: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
6110: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
6120: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
6130: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
6140: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
6150: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6160: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
6170: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
6180: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
6190: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
61a0: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
61b0: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
61c0: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
61d0: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
61e0: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
61f0: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
6200: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
6210: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
6220: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
6230: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
6240: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
6250: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
6260: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
6270: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
6280: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6290: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
62a0: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
62b0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  KeyInfo;.      a
62c0: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
62d0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
62e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
62f0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6300: 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28  zTemp, "keyinfo(
6310: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
6320: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
6330: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6340: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
6350: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
6360: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
6370: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
6380: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
6390: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
63a0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
63b0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
63c0: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
63d0: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
63e0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
63f0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
6400: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 2b  ;.        if( i+
6410: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
6420: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
6430: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
6440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
6450: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6460: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6470: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
6480: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
6490: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
64a0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
64b0: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
64c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
64d0: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a  cpy(&zTemp[i], z
64e0: 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  Coll, n+1);.    
64f0: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
6500: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
6510: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
6520: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
6530: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
6540: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
6550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6560: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
6570: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
6580: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
6590: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
65a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
65b0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63  nTemp, zTemp, "c
65c0: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
65d0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
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 46 55  }.    case P4_FU
6600: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
6610: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
6620: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
6630: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6640: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6650: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
6660: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
6670: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
6680: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6690: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
66a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
66b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
66c0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
66d0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
66e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
66f0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
6700: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6710: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6720: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
6730: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
6740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6750: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
6760: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6770: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6780: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
6790: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
67a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
67b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
67c0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
67d0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
67e0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
67f0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6800: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
6810: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6830: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6840: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
6850: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6860: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6870: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
6880: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
6890: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
68a0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
68b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
68c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
68d0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
68e0: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d  Mem->r);.      }
68f0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6900: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
6910: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6920: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6930: 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22  p, zTemp, "NULL"
6940: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6950: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6960: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6970: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
6980: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
6990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
69b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
69c0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
69d0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
69e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
69f0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
6a00: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
6a10: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
6a20: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6a30: 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25  , zTemp, "vtab:%
6a40: 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56  p:%p", pVtab, pV
6a50: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20  tab->pModule);. 
6a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a70: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
6a80: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
6a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6aa0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6ab0: 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22  Temp, "intarray"
6ac0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6ad0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6ae0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
6af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6b00: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6b10: 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  emp, "program");
6b20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6b40: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
6b50: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6b60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b70: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6b80: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
6b90: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
6ba0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
6bb0: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
6bc0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
6bd0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
6be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
6bf0: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
6c00: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
6c10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  dif../*.** Decla
6c20: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
6c30: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
6c40: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
6c50: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
6c60: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
6c70: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
6c80: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
6c90: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
6ca0: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
6cb0: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
6cc0: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
6cd0: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
6ce0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
6cf0: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
6d00: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
6d10: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
6d20: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
6d30: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
6d40: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
6d50: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
6d60: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
6d70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
6d80: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
6d90: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
6da0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
6db0: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
6dc0: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
6dd0: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
6de0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
6df0: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
6e00: 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  .  p->btreeMask 
6e10: 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  |= ((yDbMask)1)<
6e20: 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  <i;.  if( i!=1 &
6e30: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
6e40: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
6e50: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
6e60: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20   p->lockMask |= 
6e70: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
6e80: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
6e90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ea0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
6eb0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
6ec0: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53  AFE>0./*.** If S
6ed0: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
6ee0: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
6ef0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
6f00: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
6f10: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
6f20: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
6f30: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
6f40: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
6f50: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
6f60: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
6f70: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
6f80: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
6f90: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
6fa0: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
6fb0: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
6fc0: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
6fd0: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
6fe0: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
6ff0: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
7000: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
7010: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
7020: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
7030: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
7040: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
7050: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
7060: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
7070: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
7080: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
7090: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
70a0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
70b0: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
70c0: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
70d0: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
70e0: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
70f0: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
7100: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
7110: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7120: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
7130: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
7140: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
7150: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
7160: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
7170: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
7180: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
7190: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
71a0: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
71b0: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
71c0: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
71d0: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
71e0: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
71f0: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
7200: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
7210: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
7220: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
7230: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
7240: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
7250: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
7260: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
7270: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
7280: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
7290: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
72a0: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
72b0: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
72c0: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
72d0: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
72e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
72f0: 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b  ;.  yDbMask mask
7300: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7310: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
7320: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e  t nDb;.  if( p->
7330: 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65  lockMask==0 ) re
7340: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
7350: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
7360: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
7370: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
7380: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
7390: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  or(i=0, mask=1; 
73a0: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b  i<nDb; i++, mask
73b0: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69   += mask){.    i
73c0: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b  f( i!=1 && (mask
73d0: 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21   & p->lockMask)!
73e0: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  =0 && ALWAYS(aDb
73f0: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
7400: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
7410: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
7420: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
7430: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
7440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7450: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
7460: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
7470: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
7480: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
7490: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
74a0: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
74b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
74c0: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nter()..*/.void 
74d0: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
74e0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
74f0: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7500: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
7510: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
7520: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
7530: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
7540: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
7550: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
7560: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7570: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
7580: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
7590: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
75a0: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
75b0: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
75c0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
75d0: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
75e0: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
75f0: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7610: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
7620: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
7630: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
7640: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
7650: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
7660: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
7670: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
7680: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
7690: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
76a0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
76b0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
76c0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
76d0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
76e0: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
76f0: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
7700: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
7710: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7720: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
7730: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
7740: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e  d %-4s %.2X %s\n
7750: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
7760: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
7770: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
7780: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
7790: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
77a0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
77b0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
77c0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
77d0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
77e0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
77f0: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
7800: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64  4, pOp->p5,.#ifd
7810: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
7820: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d        pOp->zComm
7830: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ent ? pOp->zComm
7840: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20  ent : "".#else. 
7850: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20       "".#endif. 
7860: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
7870: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
7880: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
7890: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
78a0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
78b0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
78c0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
78d0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
78e0: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
78f0: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
7900: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
7910: 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c    u8 malloc_fail
7920: 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
7930: 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64  ailed;.    if( d
7940: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
7950: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e  ){.      for(pEn
7960: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
7970: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   p++){.        s
7980: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7990: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
79a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
79b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  rn;.    }.    fo
79c0: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
79d0: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
79e0: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
79f0: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
7a00: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
7a10: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
7a20: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
7a30: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
7a40: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
7a50: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
7a60: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
7a70: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
7a80: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
7a90: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
7aa0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
7ab0: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
7ac0: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
7ad0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
7ae0: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
7af0: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
7b00: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
7b10: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
7b20: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
7b30: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
7b40: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
7b50: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
7b60: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
7b70: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
7b80: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
7b90: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
7ba0: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
7bb0: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
7bc0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
7bd0: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
7be0: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
7bf0: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
7c00: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
7c10: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
7c20: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
7c30: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
7c40: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
7c50: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
7c60: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
7c70: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
7c80: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
7c90: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
7ca0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
7cb0: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
7cc0: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
7cd0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
7ce0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
7cf0: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
7d00: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
7d10: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74  Frame|MEM_RowSet
7d20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
7d30: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
7d40: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
7d50: 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f  se if( p->zMallo
7d60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
7d70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7d80: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
7d90: 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d      p->zMalloc =
7da0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
7db0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
7dc0: 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 7d  M_Invalid;.    }
7dd0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
7de0: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
7df0: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
7e00: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
7e10: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
7e20: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
7e30: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
7e40: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
7e50: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
7e60: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
7e70: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
7e80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7e90: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
7ea0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
7eb0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
7ec0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
7ed0: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
7ee0: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
7ef0: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
7f00: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
7f10: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
7f20: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
7f30: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
7f40: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
7f50: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
7f60: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
7f70: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
7f80: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
7f90: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
7fa0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
7fb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7fc0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
7fd0: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
7fe0: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
7ff0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
8000: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
8010: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
8020: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
8030: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
8040: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
8050: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
8060: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
8070: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
8080: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
8090: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
80a0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
80b0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
80c0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
80d0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
80e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
80f0: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
8100: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
8110: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
8120: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
8130: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
8140: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
8150: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
8160: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
8170: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
8180: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
8190: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
81a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
81b0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
81c0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
81d0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
81e0: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
81f0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8200: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
8210: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
8220: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
8230: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8250: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
8260: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
8290: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
82a0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
82b0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
82e0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
82f0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
8300: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
8310: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8320: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
8330: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
8340: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
8370: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
8380: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
8390: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
83a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
83b0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
83c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
83d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8400: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
8410: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8440: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
8450: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
8460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8470: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
8480: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
8490: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
84a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
84b0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
84c0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
84d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
84e0: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
84f0: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
8500: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8510: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
8520: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
8530: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
8540: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
8550: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
8560: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
8570: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
8580: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
8590: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
85a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
85b0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
85c0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
85d0: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
85e0: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
85f0: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
8600: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
8610: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
8620: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
8630: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
8640: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
8650: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
8660: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
8670: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
8680: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
8690: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
86a0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
86b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
86c0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
86d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
86e0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
86f0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
8700: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
8710: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
8720: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
8730: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
8740: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
8750: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
8760: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
8770: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
8780: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
8790: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
87a0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
87b0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
87c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
87d0: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
87e0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
87f0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
8800: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
8810: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
8820: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
8830: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8840: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
8850: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
8860: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
8870: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
8880: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
8890: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
88a0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
88b0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
88c0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
88d0: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
88e0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
88f0: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
8900: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
8910: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
8920: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
8930: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
8940: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
8950: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
8960: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
8970: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
8980: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
8990: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
89a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
89b0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
89c0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
89d0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
89e0: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
89f0: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
8a00: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
8a10: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
8a20: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
8a30: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
8a40: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
8a50: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
8a60: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
8a70: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
8a80: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
8a90: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
8aa0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
8ab0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
8ac0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
8ad0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
8ae0: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
8af0: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
8b00: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
8b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
8b20: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
8b30: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
8b40: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
8b50: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
8b60: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
8b70: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
8b80: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
8b90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8ba0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8bb0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
8bc0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
8bd0: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
8be0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
8bf0: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
8c00: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8c10: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
8c20: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
8c30: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
8c40: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
8c50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
8c60: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a  har *z;.    Op *
8c70: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
8c80: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
8c90: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
8ca0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
8cb0: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
8cc0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
8cd0: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
8ce0: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
8cf0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
8d00: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
8d10: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
8d20: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
8d30: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
8d40: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
8d50: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
8d60: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
8d70: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
8d80: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
8d90: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
8da0: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
8db0: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
8dc0: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
8dd0: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
8de0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
8df0: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
8e00: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
8e10: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
8e20: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
8e30: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8e40: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
8e50: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8e60: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
8e70: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
8e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
8eb0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
8ec0: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
8ed0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8ee0: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
8ef0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
8f00: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
8f10: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
8f20: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
8f30: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
8f40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
8f50: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
8f60: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
8f70: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
8f80: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
8f90: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
8fa0: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
8fb0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
8fc0: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
8fd0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
8fe0: 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  an OP_Program op
8ff0: 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65  code is encounte
9000: 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f  r (the only opco
9010: 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20  de that has.    
9020: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f    ** a P4_SUBPRO
9030: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20  GRAM argument), 
9040: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20  expand the size 
9050: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  of the array of 
9060: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20  subprograms.    
9070: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
9080: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
9090: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
90a0: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
90b0: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
90c0: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c     ** has not al
90d0: 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e  ready been seen.
90e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
90f0: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  if( pOp->p4type=
9100: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
9110: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
9120: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
9130: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
9140: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
9150: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
9160: 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29  =0; j<nSub; j++)
9170: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9180: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
9190: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
91a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
91b0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75        if( j==nSu
91c0: 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  b && SQLITE_OK==
91d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
91e0: 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20  ow(pSub, nByte, 
91f0: 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  nSub!=0) ){.    
9200: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
9210: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
9220: 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  b->z;.          
9230: 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20  apSub[nSub++] = 
9240: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
9250: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
9260: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42  ->flags |= MEM_B
9270: 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  lob;.          p
9280: 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69  Sub->n = nSub*si
9290: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
92a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
92b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
92c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
92d0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
92e0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
9310: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
9320: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
9330: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
9340: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9350: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
9360: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
9370: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9390: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
93a0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
93b0: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
93c0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
93d0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
93e0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
93f0: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
9420: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
9430: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
9440: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
9450: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
9460: 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20  ow(pMem, 32, 0) 
9470: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ){            /*
9480: 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   P4 */.      ass
9490: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
94a0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
94b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
94c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
94d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
94e0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
94f0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d  EM_Term;.    z =
9500: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
9510: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
9520: 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a    if( z!=pMem->z
9530: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9540: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
9550: 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Mem, z, -1, SQLI
9560: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
9570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
9580: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
9590: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
95a0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
95b0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
95c0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
95d0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
95e0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70   }.    pMem->typ
95f0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
9600: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
9610: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
9620: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
9630: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
9640: 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20  row(pMem, 4, 0) 
9650: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9660: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
9670: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9690: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
96a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
96b0: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
96c0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
96d0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
96e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
96f0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
9700: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
9710: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
9720: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
9730: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
9740: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
9750: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
9760: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
9770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9780: 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f  BUG.      if( pO
9790: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
97a0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
97b0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
97c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  _Term;.        p
97d0: 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43  Mem->z = pOp->zC
97e0: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  omment;.        
97f0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
9800: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
9810: 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  z);.        pMem
9820: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
9830: 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  TF8;.        pMe
9840: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
9850: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _TEXT;.      }el
9860: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
9870: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
9880: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
9890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
98a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
98b0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  nt */.        pM
98c0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
98d0: 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_NULL;.      }.
98e0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
98f0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34  esColumn = 8 - 4
9900: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
9910: 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  .    p->pResultS
9920: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
9930: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
9940: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
9950: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
9960: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9970: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9980: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
9990: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
99a0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
99b0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
99c0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
99d0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
99e0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
99f0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
9a00: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
9a10: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
9a20: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
9a30: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
9a40: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
9a50: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
9a60: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
9a70: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
9a80: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=0 ){.    const
9a90: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e   char *z = pOp->
9aa0: 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28  p4.z;.    while(
9ab0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
9ac0: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70  *z) ) z++;.    p
9ad0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
9ae0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
9af0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
9b00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9b10: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
9b20: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9b30: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
9b40: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
9b50: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
9b60: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
9b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9b80: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
9b90: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
9ba0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
9bb0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
9bc0: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
9bd0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
9be0: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
9bf0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
9c00: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
9c10: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
9c20: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
9c30: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
9c40: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
9c50: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
9c60: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
9c70: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
9c80: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
9c90: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
9ca0: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
9cb0: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
9cc0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
9cd0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
9ce0: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
9cf0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
9d00: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
9d10: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
9d20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
9d40: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
9d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9d60: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
9d70: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
9d80: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
9d90: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
9da0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
9db0: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
9dc0: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  _IOTRACE */../*.
9dd0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
9de0: 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73  e from a fixed s
9df0: 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72  ize buffer and r
9e00: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
9e10: 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65  to.** that space
9e20: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
9e30: 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69  nt space is avai
9e40: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55  lable, return NU
9e50: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42  LL..**.** The pB
9e60: 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  uf parameter is 
9e70: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
9e80: 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77  e of a pointer w
9e90: 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63  hich will.** rec
9ea0: 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d  eive the new mem
9eb0: 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f  ory.  pBuf is no
9ec0: 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66  rmally NULL.  If
9ed0: 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20   pBuf is not.** 
9ee0: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
9ef0: 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  hat memory space
9f00: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9f10: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
9f20: 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75  that.** this rou
9f30: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
9f40: 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77  allocate any new
9f50: 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70   memory.  When p
9f60: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
9f70: 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  LL simply return
9f80: 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c   pBuf.  Only all
9f90: 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79  ocate new memory
9fa0: 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66   space when pBuf
9fb0: 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  .** is NULL..**.
9fc0: 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20  ** nByte is the 
9fd0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9fe0: 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e  of space needed.
9ff0: 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70  .**.** *ppFrom p
a000: 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62  oints to availab
a010: 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e  le space and pEn
a020: 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  d points to the 
a030: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76  end of the.** av
a040: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20  ailable space.  
a050: 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c  When space is al
a060: 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d  located, *ppFrom
a070: 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73   is advanced pas
a080: 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  t.** the end of 
a090: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70  the allocated sp
a0a0: 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79  ace..**.** *pnBy
a0b0: 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20  te is a counter 
a0c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a0d0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
a0e0: 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64  that have failed
a0f0: 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e  .** to allocate.
a100: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e    If there is in
a110: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
a120: 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73   in *ppFrom to s
a130: 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65  atisfy the.** re
a140: 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72  quest, then incr
a150: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79  ement *pnByte by
a160: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
a170: 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73  he request..*/.s
a180: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
a190: 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a  cSpace(.  void *
a1a0: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f  pBuf,          /
a1b0: 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70  * Where return p
a1c0: 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73  ointer will be s
a1d0: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tored */.  int n
a1e0: 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
a1f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a200: 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  es to allocate *
a210: 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c  /.  u8 **ppFrom,
a220: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
a230: 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f  UT: Allocate fro
a240: 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75  m *ppFrom */.  u
a250: 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  8 *pEnd,        
a260: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
a270: 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68  o 1 byte past th
a280: 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d  e end of *ppFrom
a290: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
a2a0: 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20   *pnByte        
a2b0: 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69    /* If allocati
a2c0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64  on cannot be mad
a2d0: 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  e, increment *pn
a2e0: 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  Byte */.){.  ass
a2f0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
a300: 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f  ALIGNMENT(*ppFro
a310: 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  m) );.  if( pBuf
a320: 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a   ) return pBuf;.
a330: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
a340: 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26  (nByte);.  if( &
a350: 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d  (*ppFrom)[nByte]
a360: 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   <= pEnd ){.    
a370: 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70  pBuf = (void*)*p
a380: 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72  pFrom;.    *ppFr
a390: 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  om += nByte;.  }
a3a0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74  else{.    *pnByt
a3b0: 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  e += nByte;.  }.
a3c0: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
a3d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
a3e0: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
a3f0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
a400: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
a410: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
a420: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
a430: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
a440: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
a450: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
a460: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
a470: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
a480: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
a490: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
a4a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
a4b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
a4c0: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
a4d0: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
a4e0: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
a4f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
a500: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
a510: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
a520: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
a530: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
a540: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
a550: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
a560: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
a570: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
a580: 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=1; i<p->nMem;
a590: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
a5a0: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
a5b0: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
a5c0: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
a5d0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
a5e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
a5f0: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
a600: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  bort;.  p->magic
a610: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
a620: 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  N;.  p->nChange 
a630: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
a640: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
a650: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
a660: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
a670: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  tement = 0;.  p-
a680: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d  >nFkConstraint =
a690: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
a6a0: 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d  PROFILE.  for(i=
a6b0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
a6c0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  ){.    p->aOp[i]
a6d0: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  .cnt = 0;.    p-
a6e0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
a6f0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
a700: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
a710: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
a720: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20  e for execution 
a730: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
a740: 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61  me after.** crea
a750: 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c  ting the virtual
a760: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
a770: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
a780: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
a790: 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63  ating stack spac
a7a0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  e and initializi
a7b0: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
a7c0: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
a7d0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
a7e0: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
a7f0: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
a800: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
a810: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
a820: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
a830: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a840: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
a850: 78 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65  xact once on a e
a860: 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68  ach virtual mach
a870: 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ine..** After th
a880: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a890: 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20  lled the VM has 
a8a0: 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20  been "packaged" 
a8b0: 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20  and is ready.** 
a8c0: 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74  to run.  After t
a8d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a8e0: 61 6c 6c 65 64 2c 20 66 75 74 68 65 72 20 63 61  alled, futher ca
a8f0: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
a900: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
a910: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
a920: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
a930: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
a940: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
a950: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
a960: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
a970: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
a980: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
a990: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
a9a0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
a9b0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
a9c0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
a9d0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
a9e0: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
a9f0: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
aa00: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
aa10: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
aa20: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
aa30: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
aa40: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
aa50: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
aa60: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
aa70: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
aa80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
aa90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
aaa0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
aab0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
aac0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
aad0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
aae0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
ab10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
ab20: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
ab50: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
ab60: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab80: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
ab90: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
aba0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
abd0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
abe0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac10: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
ac20: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
ac30: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20  nt nOnce;       
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac50: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e   Number of OP_On
ac60: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ce instructions 
ac70: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aca0: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
acb0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
acc0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
acd0: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
ace0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
acf0: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ad10: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
ad20: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
ad30: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
ad40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ad50: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
ad60: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
ad70: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
ad80: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
ad90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
ada0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
adb0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
adc0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
add0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
ade0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
adf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
ae00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
ae10: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
ae20: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
ae30: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
ae40: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
ae50: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
ae60: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
ae70: 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70  Arg;.  nOnce = p
ae80: 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20  Parse->nOnce;.  
ae90: 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e  if( nOnce==0 ) n
aea0: 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73  Once = 1; /* Ens
aeb0: 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ure at least one
aec0: 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63   byte in p->aOnc
aed0: 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20  eFlag[] */.  .  
aee0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
aef0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
af00: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
af10: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
af20: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
af30: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
af40: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
af50: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
af60: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
af70: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
af80: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
af90: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
afa0: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62  ace for.  ** Vdb
afb0: 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72  eCursor/BtCursor
afc0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
afd0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
afe0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
aff0: 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69  .  ** cursor 0 i
b000: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
b010: 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65  ry cell nMem. Me
b020: 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d  mory cell (nMem-
b030: 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  1).  ** stores t
b040: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
b050: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
b060: 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e  h cursor 1, etc.
b070: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
b080: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
b090: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
b0a0: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a  em += nCursor;..
b0b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
b0c0: 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72  ace for memory r
b0d0: 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61  egisters, SQL va
b0e0: 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75  riables, VDBE cu
b0f0: 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20  rsors and .  ** 
b100: 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73  an array to mars
b110: 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  hal SQL function
b120: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20   arguments in.. 
b130: 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38   */.  zCsr = (u8
b140: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
b150: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f  ];       /* Memo
b160: 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72  ry avaliable for
b170: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
b180: 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d   zEnd = (u8*)&p-
b190: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  >aOp[p->nOpAlloc
b1a0: 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  ];  /* First byt
b1b0: 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43  e past end of zC
b1c0: 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c  sr[] */..  resol
b1d0: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
b1e0: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
b1f0: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
b200: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
b210: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
b220: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
b230: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
b240: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
b250: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
b260: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73    }.  memset(zCs
b270: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
b280: 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73  ;.  zCsr += (zCs
b290: 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20  r - (u8*)0)&7;. 
b2a0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
b2b0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
b2c0: 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69  sr) );.  p->expi
b2d0: 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  red = 0;..  /* M
b2e0: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
b2f0: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
b300: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
b310: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
b320: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
b330: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
b340: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
b350: 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  se unused space 
b360: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
b370: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
b380: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
b390: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
b3a0: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
b3b0: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
b3c0: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
b3d0: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
b3e0: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
b3f0: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
b400: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73   fill in the res
b410: 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  t using a fresh 
b420: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
b430: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
b440: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
b450: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
b460: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
b470: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
b480: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61  the leftover spa
b490: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
b4a0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
b4b0: 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e  y can significan
b4c0: 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20  tly.  ** reduce 
b4d0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
b4e0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
b4f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
b500: 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20  t..  */.  do {. 
b510: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
b520: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
b530: 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20  cSpace(p->aMem, 
b540: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
b550: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
b560: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
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 56 61 72 2c 20 6e 56 61 72 2a 73  (p->aVar, nVar*s
b590: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
b5a0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b5b0: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d  ;.    p->apArg =
b5c0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
b5d0: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
b5e0: 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20  f(Mem*), &zCsr, 
b5f0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b600: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c     p->azVar = al
b610: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61  locSpace(p->azVa
b620: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  r, nVar*sizeof(c
b630: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  har*), &zCsr, zE
b640: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b650: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
b660: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
b670: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
b680: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a          &zCsr, z
b6b0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b6c0: 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    p->aOnceFlag =
b6d0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
b6e0: 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c  OnceFlag, nOnce,
b6f0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b700: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Byte);.    if( n
b710: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Byte ){.      p-
b720: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
b730: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
b740: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
b750: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
b760: 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26  ee;.    zEnd = &
b770: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  zCsr[nByte];.  }
b780: 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20  while( nByte && 
b790: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
b7a0: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
b7b0: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
b7c0: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
b7d0: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
b7e0: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
b7f0: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
b800: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
b810: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
b820: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
b830: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b840: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b850: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
b860: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
b870: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56  ar ){.    p->nzV
b880: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56  ar = pParse->nzV
b890: 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ar;.    memcpy(p
b8a0: 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d  ->azVar, pParse-
b8b0: 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72  >azVar, p->nzVar
b8c0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72  *sizeof(p->azVar
b8d0: 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  [0]));.    memse
b8e0: 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  t(pParse->azVar,
b8f0: 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   0, pParse->nzVa
b900: 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  r*sizeof(pParse-
b910: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d  >azVar[0]));.  }
b920: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
b930: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b  {.    p->aMem--;
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
b960: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
b970: 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  m */.    p->nMem
b980: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
b990: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
b9a0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
b9b0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28  em-1 */.    for(
b9c0: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
b9d0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  +){.      p->aMe
b9e0: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
b9f0: 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20  _Invalid;.      
ba00: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
ba10: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
ba20: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
ba30: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
ba40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
ba50: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
ba60: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
ba70: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
ba80: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
ba90: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
baa0: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
bab0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bac0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
bad0: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
bae0: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
baf0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
bb00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
bb10: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
bb20: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
bb30: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
bb40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
bb50: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
bb60: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
bb70: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
bb80: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
bb90: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
bba0: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
bbb0: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
bbc0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
bbd0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
bbe0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
bbf0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
bc00: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
bc10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bc20: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
bc30: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
bc40: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
bc50: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
bc60: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
bc70: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
bc80: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
bc90: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
bca0: 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64  dule = pCx->pMod
bcb0: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
bcc0: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
bcd0: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
bce0: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
bcf0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
bd00: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
bd10: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  dif.}../*.** Cop
bd20: 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
bd30: 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
bd40: 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
bd50: 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
bd60: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
bd70: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
bd80: 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
bd90: 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
bda0: 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
bdb0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
bdc0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
bdd0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
bde0: 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
bdf0: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
be00: 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
be10: 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c  >v;.  v->aOnceFl
be20: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e  ag = pFrame->aOn
be30: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e  ceFlag;.  v->nOn
be40: 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d  ceFlag = pFrame-
be50: 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d  >nOnceFlag;.  v-
be60: 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
be70: 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
be80: 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
be90: 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
bea0: 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
beb0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
bec0: 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
bed0: 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
bee0: 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
bef0: 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
bf00: 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
bf10: 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
bf20: 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
bf30: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
bf40: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72  ge;.  return pFr
bf50: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
bf60: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
bf70: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
bf80: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
bf90: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
bfa0: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
bfb0: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
bfc0: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
bfd0: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
bfe0: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
bff0: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
c000: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
c010: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
c020: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
c030: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
c040: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
c050: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
c060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c070: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
c080: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
c090: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
c0a0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
c0b0: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
c0c0: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
c0d0: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
c0e0: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
c0f0: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
c100: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
c110: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
c120: 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20  }.  p->pFrame = 
c130: 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  0;.  p->nFrame =
c140: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70   0;..  if( p->ap
c150: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
c160: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c170: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
c180: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
c190: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
c1a0: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
c1b0: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
c1c0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
c1d0: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
c1e0: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
c1f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
c200: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
c210: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c  >aMem ){.    rel
c220: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
c230: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
c240: 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  m);.  }.  while(
c250: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b   p->pDelFrame ){
c260: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
c270: 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72  pDel = p->pDelFr
c280: 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c  ame;.    p->pDel
c290: 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50  Frame = pDel->pP
c2a0: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
c2b0: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
c2c0: 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(pDel);.  }.}..
c2d0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
c2e0: 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63  he VM after exec
c2f0: 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ution..**.** Thi
c300: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
c310: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
c320: 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20  se any cursors, 
c330: 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a  lists, and/or.**
c340: 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65   sorters that we
c350: 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49  re left open.  I
c360: 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74  t also deletes t
c370: 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20  he values of.** 
c380: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
c390: 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a   aVar[] array..*
c3a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
c3b0: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
c3c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c3d0: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
c3e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
c3f0: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
c400: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
c410: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
c420: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
c430: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
c440: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
c450: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
c460: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
c470: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
c480: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
c490: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
c4a0: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
c4b0: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
c4c0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
c4d0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
c4e0: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
c4f0: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
c500: 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64  ags==MEM_Invalid
c510: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
c520: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c530: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
c540: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
c550: 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  0;.  p->pResultS
c560: 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et = 0;.}../*.**
c570: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
c580: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
c590: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
c5a0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
c5b0: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
c5c0: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
c5d0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
c5e0: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
c5f0: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
c600: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
c610: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
c620: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
c630: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
c640: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
c650: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
c660: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
c670: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c680: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
c690: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
c6a0: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
c6b0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
c6c0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
c6d0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65  b = p->db;..  re
c6e0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
c6f0: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
c700: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
c710: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  _N);.  sqlite3Db
c720: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
c730: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
c740: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
c750: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
c760: 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f  mn = (u16)nResCo
c770: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
c780: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
c790: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
c7a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
c7b0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
c7c0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
c7d0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
c7e0: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
c7f0: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
c800: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
c810: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
c820: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
c830: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
c840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c850: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
c860: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
c870: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
c880: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
c890: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
c8a0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
c8b0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
c8c0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
c8d0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
c8e0: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
c8f0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
c900: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
c910: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
c920: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
c930: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
c940: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
c950: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
c960: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
c970: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
c980: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
c990: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
c9a0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
c9b0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
c9c0: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
c9d0: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
c9e0: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
c9f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
ca00: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
ca10: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
ca40: 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
ca50: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
ca80: 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
ca90: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
caa0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
cab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
cac0: 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
cad0: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
cae0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
caf0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
cb00: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
cb10: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
cb20: 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
cb30: 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb50: 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
cb60: 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
cb70: 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
cb80: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
cb90: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
cba0: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
cbb0: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
cbc0: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
cbd0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
cbe0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
cbf0: 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
cc00: 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
cc10: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
cc20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cc30: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  MEM;.  }.  asser
cc40: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
cc50: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
cc60: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
cc70: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
cc80: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
cc90: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
cca0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
ccb0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
ccc0: 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
ccd0: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
cce0: 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
ccf0: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
cd00: 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
cd10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cd20: 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
cd30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
cd40: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
cd50: 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
cd60: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
cd70: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
cd80: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
cd90: 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
cda0: 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
cdb0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
cdc0: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
cdd0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
cde0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
cdf0: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
ce00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ce10: 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
ce20: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
ce30: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
ce40: 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
ce50: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
ce60: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
ce70: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
ce80: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
ce90: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
cea0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
ceb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
cec0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
ced0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
cee0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
cef0: 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20  .  /* With this 
cf00: 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56  option, sqlite3V
cf10: 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66  tabSync() is def
cf20: 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c  ined to be simpl
cf30: 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  y .  ** SQLITE_O
cf40: 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73  K so p is not us
cf50: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ed. .  */.  UNUS
cf60: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
cf70: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
cf80: 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
cf90: 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
cfa0: 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
cfb0: 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
cfc0: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
cfd0: 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
cfe0: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
cff0: 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
d000: 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
d010: 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
d020: 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
d030: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d040: 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
d050: 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
d060: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
d070: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
d080: 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
d090: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
d0a0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
d0b0: 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70  3VtabSync(db, &p
d0c0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f  ->zErrMsg);..  /
d0d0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
d0e0: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
d0f0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
d100: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
d110: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
d120: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
d130: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
d140: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
d150: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
d160: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
d170: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
d180: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
d190: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
d1a0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
d1b0: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
d1c0: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
d1d0: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
d1e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
d1f0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
d200: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
d210: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
d220: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d230: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
d240: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
d250: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
d260: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
d270: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
d280: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
d290: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
d2a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
d2b0: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
d2c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
d2d0: 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
d2e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2f0: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
d300: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
d310: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
d320: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
d330: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
d340: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
d350: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d360: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
d370: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
d380: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
d390: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
d3a0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
d3b0: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
d3c0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
d3d0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
d3e0: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
d3f0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
d400: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
d410: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
d420: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d430: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
d440: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
d450: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d460: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
d470: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
d480: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
d490: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
d4a0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
d4b0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
d4c0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
d4d0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
d4e0: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
d4f0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
d500: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
d510: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
d520: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d530: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
d540: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
d550: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
d560: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
d570: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
d580: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
d590: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
d5a0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
d5b0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
d5c0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
d5d0: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
d5e0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
d5f0: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
d600: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
d610: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
d620: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
d630: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
d640: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
d650: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
d660: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d670: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d680: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
d690: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d6a0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
d6b0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
d6c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d6d0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
d6e0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
d6f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
d700: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
d710: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
d720: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
d730: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
d740: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
d750: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
d760: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
d770: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
d780: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
d790: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
d7a0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
d7b0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
d7c0: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
d7d0: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
d7e0: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
d7f0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
d800: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d810: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d820: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
d830: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d840: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d850: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d860: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d870: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d880: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d890: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d8a0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d8b0: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
d8c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d8d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d8e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
d8f0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
d900: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
d910: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
d920: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
d930: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
d940: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d950: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
d960: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
d970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d980: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
d990: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
d9a0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
d9b0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
d9c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d9d0: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
d9e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
d9f0: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
da00: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
da10: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
da20: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
da30: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
da40: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
da50: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
da60: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
da70: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
da80: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
da90: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
daa0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
dab0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
dac0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
dad0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
dae0: 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
daf0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
db00: 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
db10: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
db20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
db30: 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
db40: 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
db50: 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
db60: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
db70: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
db80: 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
db90: 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
dba0: 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
dbb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
dbc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64  ITE_NOMEM;.    d
dbd0: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
dbe0: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
dbf0: 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
dc00: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
dc10: 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
dc20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
dc30: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
dc40: 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
dc50: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
dc60: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
dc70: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
dc80: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
dc90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
dca0: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
dcb0: 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
dcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
dcd0: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
dce0: 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
dcf0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
dd00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dd10: 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
dd20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
dd30: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
dd40: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
dd50: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
dd60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
dd70: 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
dd80: 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
dd90: 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
ddc0: 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
ddd0: 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
dde0: 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
ddf0: 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
de00: 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
de10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
de20: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
de30: 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
de40: 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
de50: 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
de60: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
de70: 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
de80: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
de90: 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
dea0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
deb0: 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
dec0: 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
ded0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dee0: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
def0: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
df00: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
df10: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
df20: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
df30: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
df40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
df50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
df60: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
df70: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
df80: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
df90: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
dfa0: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
dfb0: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
dfc0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
dfd0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
dfe0: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
dff0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
e000: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
e010: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
e020: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
e030: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
e040: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e050: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e060: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e070: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e080: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
e090: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
e0a0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
e0b0: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
e0c0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
e0d0: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
e0e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e0f0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e100: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
e110: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
e120: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
e130: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e140: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
e150: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
e160: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
e170: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
e180: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e190: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
e1a0: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
e1b0: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
e1c0: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
e1d0: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
e1e0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
e1f0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
e200: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
e210: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e220: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
e230: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
e240: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
e250: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
e260: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
e270: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
e280: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
e290: 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
e2a0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
e2b0: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
e2c0: 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
e2d0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
e2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e2f0: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
e300: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
e310: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
e320: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
e330: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
e340: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
e350: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
e360: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
e370: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
e380: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
e390: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e3a0: 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
e3b0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
e3c0: 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
e3d0: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
e3e0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
e3f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
e410: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
e420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e430: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
e440: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
e450: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e460: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e470: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
e480: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
e490: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e4a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
e4b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e4c0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
e4d0: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
e4e0: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
e4f0: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
e500: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
e510: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e520: 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
e530: 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  & 0==(sqlite3OsD
e540: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
e550: 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
e560: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
e570: 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
e580: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
e590: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
e5a0: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
e5b0: 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
e5c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e5d0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
e5e0: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
e5f0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
e600: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
e610: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e620: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e630: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e640: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e650: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
e660: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
e670: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
e680: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
e690: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
e6a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e6b0: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
e6c0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
e6d0: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
e6e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
e6f0: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
e700: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
e710: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
e720: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
e730: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
e740: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
e750: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
e760: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e770: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
e780: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
e790: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
e7a0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
e7b0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
e7c0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
e7d0: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
e7e0: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
e7f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e800: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
e810: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e820: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
e830: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
e840: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e850: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
e860: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
e870: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
e880: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
e890: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e8a0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e8b0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e8c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e8d0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e8e0: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
e8f0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
e900: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
e910: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
e920: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
e930: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e940: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e950: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e960: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e970: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e980: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e990: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
e9a0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e9b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
e9c0: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
e9d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
e9e0: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
e9f0: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
ea00: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
ea10: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
ea20: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
ea30: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
ea40: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
ea50: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
ea60: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
ea70: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
ea80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ea90: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
eaa0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
eab0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
eac0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ead0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
eae0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
eaf0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
eb00: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
eb10: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
eb20: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
eb30: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
eb40: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
eb50: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
eb60: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
eb70: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
eb80: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
eb90: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
eba0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
ebb0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
ebc0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
ebd0: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
ebe0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
ebf0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
ec00: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
ec10: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
ec20: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
ec30: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
ec40: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
ec50: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
ec60: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
ec70: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
ec80: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
ec90: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
eca0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
ecb0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
ecc0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
ecd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ece0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ecf0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
ed00: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
ed10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
ed20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ed30: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
ed40: 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
ed50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ed60: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
ed70: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
ed80: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
ed90: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
eda0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
edb0: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
edc0: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
edd0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
ede0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
edf0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
ee00: 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
ee10: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
ee20: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
ee30: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
ee40: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
ee50: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
ee60: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
ee70: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
ee80: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
ee90: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
eea0: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
eeb0: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
eec0: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
eed0: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
eee0: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
eef0: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
ef00: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
ef10: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
ef20: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
ef30: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
ef40: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
ef50: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
ef60: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
ef70: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
ef80: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
ef90: 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
efa0: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
efb0: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
efc0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
efd0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
efe0: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
eff0: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
f000: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
f010: 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
f020: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
f030: 3e 6e 6f 49 4f 3d 3d 30 20 29 20 6e 52 65 61 64  >noIO==0 ) nRead
f040: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
f050: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
f060: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
f070: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
f080: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69  ;.  assert( nWri
f090: 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  te==db->nVdbeWri
f0a0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
f0b0: 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65  nRead==db->nVdbe
f0c0: 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Read );.}.#else.
f0d0: 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
f0e0: 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
f0f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
f100: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
f110: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
f120: 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74  ment opened a st
f130: 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
f140: 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74  ion,.** close it
f150: 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65   now. Argument e
f160: 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  Op must be eithe
f170: 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
f180: 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50  BACK or.** SAVEP
f190: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66  OINT_RELEASE. If
f1a0: 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
f1b0: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
f1c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
f1d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f1e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20  rolled back. If 
f1f0: 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54  eOp is SAVEPOINT
f200: 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74  _RELEASE, then t
f210: 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
f220: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f230: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
f240: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f250: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54  occurs, an SQLIT
f260: 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
f270: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
f280: 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
f290: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
f2a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
f2b0: 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
f2c0: 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
f2d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73  .  sqlite3 *cons
f2e0: 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  t db = p->db;.  
f2f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f300: 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e  OK;..  /* If p->
f310: 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72  iStatement is gr
f320: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
f330: 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20   then this Vdbe 
f340: 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73  opened a .  ** s
f350: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
f360: 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64  tion that should
f370: 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e   be closed here.
f380: 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74   The only except
f390: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74  ion.  ** is that
f3a0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79   an IO error may
f3b0: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20   have occurred, 
f3c0: 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67  causing an emerg
f3d0: 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ency rollback.. 
f3e0: 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
f3f0: 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74   (db->nStatement
f400: 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20  ==0), and there 
f410: 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  is nothing to do
f420: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
f430: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
f440: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
f450: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
f460: 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
f470: 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
f480: 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
f490: 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
f4a0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
f4b0: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
f4c0: 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
f4d0: 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
f4e0: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
f4f0: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
f500: 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
f510: 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
f520: 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
f530: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f540: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
f550: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
f560: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
f570: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
f580: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
f590: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
f5a0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
f5b0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
f5c0: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
f5d0: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
f5e0: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
f5f0: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
f600: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
f610: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
f620: 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
f630: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
f640: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
f650: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
f660: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
f670: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
f680: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
f690: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f6a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
f6b0: 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
f6c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f6d0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
f6e0: 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
f6f0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ement = 0;..    
f700: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f710: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  K ){.      if( e
f720: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
f730: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
f740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f750: 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
f760: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f770: 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
f780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f790: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f7b0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
f7c0: 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
f7d0: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
f7e0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f7f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f800: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
f810: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f820: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
f830: 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
f840: 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
f850: 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
f860: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
f870: 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
f880: 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
f890: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  n .    ** the st
f8a0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f8b0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
f8c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   */.    if( eOp=
f8d0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
f8e0: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ACK ){.      db-
f8f0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
f900: 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
f910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f920: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f930: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f940: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
f950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
f960: 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
f970: 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
f980: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
f990: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
f9a0: 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
f9b0: 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
f9c0: 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
f9d0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
f9e0: 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
f9f0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
fa00: 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
fa10: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
fa20: 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
fa30: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
fa40: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
fa50: 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
fa60: 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
fa70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
fa80: 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
fa90: 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
faa0: 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
fab0: 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
fac0: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
fad0: 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
fae0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
faf0: 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
fb00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
fb10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fb20: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
fb30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
fb40: 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
fb50: 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
fb60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fb70: 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
fb80: 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44  ferred && db->nD
fb90: 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c  eferredCons>0) |
fba0: 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
fbb0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
fbc0: 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  >0) ){.    p->rc
fbd0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
fbe0: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
fbf0: 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
fc00: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
fc10: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
fc20: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
fc30: 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b  , db, "foreign k
fc40: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
fc50: 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
fc60: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
fc70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
fc80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
fc90: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
fca0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
fcb0: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
fcc0: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
fcd0: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
fce0: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
fcf0: 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
fd00: 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
fd10: 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
fd20: 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
fd30: 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
fd40: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
fd50: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
fd60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
fd70: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
fd80: 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
fd90: 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
fda0: 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
fdb0: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
fdc0: 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
fdd0: 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
fde0: 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
fdf0: 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
fe00: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
fe10: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
fe20: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fe30: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
fe40: 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
fe50: 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
fe60: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
fe70: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
fe80: 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
fe90: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
fea0: 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
feb0: 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
fec0: 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
fed0: 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
fee0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fef0: 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
ff00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
ff30: 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
ff40: 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
ff50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ff60: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
ff70: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
ff80: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
ff90: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
ffa0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
ffb0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ffc0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
ffd0: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
ffe0: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
fff0: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
10000 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
10010 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
10020 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
10030 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
10040 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
10050 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
10060 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
10070 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
10080 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
10090 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
100a0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
100b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
100c0 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
100d0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
100e0 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
100f0 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
10100 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
10110 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
10120 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10130 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
10140 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
10150 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
10160 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
10170 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
10180 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
10190 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
101a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
101b0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
101c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
101d0 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  f( p->aOnceFlag 
101e0 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63  ) memset(p->aOnc
101f0 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e  eFlag, 0, p->nOn
10200 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65  ceFlag);.  close
10210 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
10220 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
10230 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
10240 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10250 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
10260 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10270 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
10280 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
10290 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
102a0 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
102b0 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
102c0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
102d0 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
102e0 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
102f0 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
10300 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
10310 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
10320 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
10330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
10340 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
10350 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
10360 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
10370 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
10380 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
10390 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
103a0 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
103b0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
103c0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
103d0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
103e0 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
103f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
10400 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc!=SQLITE_IOER
10410 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a  R_BLOCKED );  /*
10420 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c   This error no l
10430 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a  onger exists */.
10440 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
10450 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
10460 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
10470 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
104a0 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
104b0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
104c0 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
104d0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
104e0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
104f0 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
10500 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
10510 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
10520 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
10530 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
10540 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
10550 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
10560 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
10570 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
10580 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
10590 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
105a0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
105b0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
105c0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
105d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
105e0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
105f0 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
10600 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
10610 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
10620 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
10630 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
10640 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
10650 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
10660 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
10670 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
10680 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
10690 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
106a0 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
106b0 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
106c0 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
106d0 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
106e0 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
106f0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
10700 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
10710 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
10720 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
10730 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
10740 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
10750 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
10760 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
10770 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
10780 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
10790 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
107a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
107b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
107c0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
107d0 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
107e0 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
107f0 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
10800 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
10810 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
10820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10830 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
10840 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
10850 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
10860 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
10870 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
10880 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
10890 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
108a0 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
108b0 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
108c0 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
108d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
108e0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
108f0 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
10900 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
10910 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
10920 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
10930 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
10940 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
10950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10960 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10970 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
10980 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
10990 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
109a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
109b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
109c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
109d0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
109e0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
109f0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
10a00 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
10a10 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
10a20 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
10a30 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
10a40 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
10a50 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
10a60 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
10a70 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
10a80 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
10a90 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
10aa0 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
10ab0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
10ac0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
10ad0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
10ae0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
10af0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
10b00 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
10b10 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
10b20 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
10b30 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
10b40 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
10b50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
10b60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10b70 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
10b80 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
10b90 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
10ba0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
10bb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
10bc0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
10bd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
10be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10bf0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
10c00 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
10c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10c20 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
10c30 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
10c40 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
10c50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10c60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10c70 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
10c80 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
10c90 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
10ca0 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
10cb0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
10cc0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
10cd0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
10ce0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
10cf0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
10d00 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
10d10 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
10d20 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
10d30 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
10d40 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
10d50 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
10d60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
10d70 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
10d80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
10d90 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
10da0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
10db0 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
10dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10de0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
10df0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
10e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
10e10 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
10e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
10e30 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
10e40 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
10e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10e60 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
10e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10e80 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
10e90 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
10ea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10eb0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
10ec0 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
10ed0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
10ee0 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
10ef0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
10f00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10f20 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
10f30 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d  ITE_OK);.      }
10f40 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
10f50 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
10f60 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
10f70 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
10f80 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
10f90 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
10fa0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10fb0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
10fc0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
10fd0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
10fe0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10ff0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
11000 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
11010 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
11020 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
11030 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
11040 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
11050 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
11060 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
11070 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
11080 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
11090 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
110a0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
110b0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
110c0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
110d0 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
110e0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
110f0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
11100 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
11110 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
11120 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
11130 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
11140 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
11150 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
11160 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
11170 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
11180 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
11190 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
111a0 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
111b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
111c0 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
111d0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
111e0 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20  en promote the. 
111f0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74     ** current st
11200 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f  atement error co
11210 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
11220 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  f( eStatementOp 
11230 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
11240 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
11250 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74  atement(p, eStat
11260 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20  ementOp);.      
11270 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
11280 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11290 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63  ITE_OK || (p->rc
112a0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
112b0 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20  ONSTRAINT ){.   
112c0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
112d0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
112e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
112f0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
11300 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
11310 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
11320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11330 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
11340 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
11350 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
11360 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
11370 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
11380 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11390 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
113a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
113b0 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
113c0 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
113d0 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
113e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
113f0 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
11400 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
11410 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
11420 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11430 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
11440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11450 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
11460 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
11470 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
11480 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
11490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
114a0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
114b0 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
114c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
114d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
114e0 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
114f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11500 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
11510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
11520 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
11530 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
11540 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
11550 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
11560 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
11570 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
11580 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
11590 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
115a0 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
115b0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
115c0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  --;.    if( !p->
115d0 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e  readOnly ) db->n
115e0 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20  VdbeWrite--;.   
115f0 20 69 66 28 20 70 2d 3e 6e 6f 49 4f 3d 3d 30 20   if( p->noIO==0 
11600 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
11610 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
11620 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
11630 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
11640 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
11650 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
11660 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
11670 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
11680 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
11690 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
116a0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
116b0 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
116c0 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
116d0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
116e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
116f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11700 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
11710 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
11720 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
11730 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
11740 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
11750 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
11760 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
11770 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
11780 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
11790 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
117a0 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
117b0 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
117c0 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
117d0 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
117e0 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
117f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
11800 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
11810 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
11820 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
11830 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
11840 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
11850 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
11860 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
11870 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
11880 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
11890 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
118a0 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
118b0 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
118c0 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
118d0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
118e0 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
118f0 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
11900 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
11910 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
11920 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
11930 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
11940 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
11950 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
11960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11970 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
11980 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
11990 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
119a0 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
119b0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
119c0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
119d0 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
119e0 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
119f0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
11a00 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
11a10 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
11a20 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
11a30 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
11a40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11a50 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
11a60 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
11a70 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
11a80 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
11a90 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
11aa0 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
11ab0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11ac0 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
11ad0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
11ae0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
11af0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
11b00 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
11b10 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  g ){.    u8 mall
11b20 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  ocFailed = db->m
11b30 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
11b40 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
11b50 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
11b60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11b70 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
11b80 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
11b90 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
11ba0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
11bb0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
11bc0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11bd0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11be0 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b   = mallocFailed;
11bf0 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65  .    db->errCode
11c00 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = rc;.  }else{.
11c10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11c20 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d  (db, rc, 0);.  }
11c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11c40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11c50 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
11c60 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
11c70 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
11c80 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
11c90 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
11ca0 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
11cb0 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
11cc0 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
11cd0 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
11ce0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
11cf0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
11d00 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
11d10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
11d20 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
11d30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
11d40 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
11d50 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
11d60 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
11d70 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
11d80 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
11d90 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
11da0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11db0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
11dc0 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
11dd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
11de0 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
11df0 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
11e00 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
11e10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11e20 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
11e30 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
11e40 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
11e50 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
11e60 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
11e70 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
11e80 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
11e90 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
11ea0 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
11eb0 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
11ec0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
11ed0 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
11ee0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
11ef0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
11f00 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
11f10 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
11f20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
11f30 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
11f40 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
11f50 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
11f60 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
11f70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
11f80 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
11f90 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
11fa0 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
11fb0 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
11fc0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
11fd0 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
11fe0 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
11ff0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
12000 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
12010 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
12020 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
12030 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
12040 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
12050 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
12060 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
12070 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
12080 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
12090 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
120a0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
120b0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
120c0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
120d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
120e0 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
120f0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
12100 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
12110 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
12120 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
12130 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
12140 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
12150 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
12160 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
12170 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
12180 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
12190 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
121a0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
121b0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
121c0 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
121d0 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
121e0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
121f0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
12200 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
12210 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
12220 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
12230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12240 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
12250 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
12260 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
12270 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
12280 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
12290 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
122a0 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
122b0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
122c0 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
122d0 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
122e0 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
122f0 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
12300 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
12310 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
12320 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
12330 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
12340 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
12350 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
12360 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
12370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
12380 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
12390 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
123a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
123b0 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
123c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
123d0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
123e0 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
123f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
12400 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
12410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
12420 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
12430 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
12440 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
12450 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
12460 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
12470 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
12480 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
12490 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
124a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
124b0 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
124c0 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
124d0 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
124e0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
124f0 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
12500 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
12510 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
12520 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
12530 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
12540 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
12550 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
12560 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
12570 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
12580 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
12590 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
125a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
125b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
125c0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
125d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
125e0 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
125f0 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
12600 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
12610 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
12620 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
12630 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
12640 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
12650 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
12660 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
12670 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
12680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12690 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
126a0 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
126b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
126c0 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
126d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
126e0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
126f0 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74  AGIC_INIT;.  ret
12700 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
12710 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
12720 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
12730 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
12740 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
12750 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
12760 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
12770 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
12780 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
12790 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
127a0 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
127b0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
127c0 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
127d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
127e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
127f0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
12800 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
12810 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
12820 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
12830 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
12840 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
12850 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
12860 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
12870 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
12880 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
12890 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
128a0 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
128b0 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
128c0 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
128d0 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
128e0 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
128f0 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
12900 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
12910 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
12920 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
12930 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
12940 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
12950 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
12960 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
12970 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
12980 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
12990 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
129a0 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
129b0 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
129c0 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
129d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
129e0 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
129f0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
12a00 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
12a10 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
12a20 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
12a30 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75  1 || !(mask&(((u
12a40 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70  32)1)<<i))) && p
12a50 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
12a60 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
12a70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
12a80 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
12a90 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
12aa0 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
12ab0 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
12ac0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
12ad0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
12ae0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12af0 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
12b00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12b10 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f  nt,.** except fo
12b20 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c  r object itself,
12b30 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72   which is preser
12b40 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ved..**.** The d
12b50 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
12b60 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12b70 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
12b80 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
12b90 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
12ba0 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
12bb0 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
12bc0 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
12bd0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
12be0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12bf0 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20  ction and frees 
12c00 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  the object itsel
12c10 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
12c20 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
12c30 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
12c40 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
12c50 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
12c60 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ext;.  int i;.  
12c70 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30  assert( p->db==0
12c80 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b   || p->db==db );
12c90 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
12ca0 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
12cb0 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  Var);.  releaseM
12cc0 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
12cd0 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
12ce0 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
12cf0 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
12d00 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
12d10 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
12d20 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
12d30 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
12d40 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
12d50 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
12d60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
12d70 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
12d80 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a   }.  for(i=p->nz
12d90 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Var-1; i>=0; i--
12da0 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
12db0 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29  db, p->azVar[i])
12dc0 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  ;.  vdbeFreeOpAr
12dd0 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
12de0 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
12df0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
12e00 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aLabel);.  sqlit
12e10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
12e20 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
12e30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12e40 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  ->zSql);.  sqlit
12e50 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
12e60 70 46 72 65 65 29 3b 0a 23 69 66 20 64 65 66 69  pFree);.#if defi
12e70 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
12e80 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
12e90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12ea0 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29  db, p->zExplain)
12eb0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12ec0 65 28 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69  e(db, p->pExplai
12ed0 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  n);.#endif.}../*
12ee0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
12ef0 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
12f00 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12f10 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
12f20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
12f30 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
12f40 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
12f50 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
12f60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12f70 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
12f80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
12f90 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c  eClearObject(db,
12fa0 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50   p);.  if( p->pP
12fb0 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
12fc0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
12fd0 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12fe0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12ff0 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
13000 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
13010 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
13020 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
13030 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
13040 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
13050 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
13060 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
13070 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c  p->db = 0;.  sql
13080 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
13090 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
130a0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
130b0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
130c0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
130d0 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
130e0 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
130f0 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
13100 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
13110 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
13120 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
13130 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
13140 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
13150 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
13160 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
13170 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
13180 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
13190 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
131a0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
131b0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
131c0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
131d0 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
131e0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
131f0 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
13200 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
13210 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
13220 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
13230 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
13240 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
13250 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
13260 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
13270 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
13280 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
13290 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
132a0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
132b0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
132c0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
132d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
132e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
132f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
13300 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
13310 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
13320 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
13330 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
13340 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
13350 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
13360 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
13370 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
13380 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
13390 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
133a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
133b0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
133c0 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
133d0 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
133e0 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
133f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13400 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61  rn rc;.    p->la
13410 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76  stRowid = p->mov
13420 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69  etoTarget;.    i
13430 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
13440 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
13450 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72  T_BKPT;.    p->r
13460 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b  owidIsValid = 1;
13470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
13480 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
13490 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
134a0 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
134b0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
134c0 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
134d0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
134e0 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
134f0 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f  ALWAYS(p->pCurso
13500 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  r) ){.    int ha
13510 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
13520 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
13530 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
13540 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
13550 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
13560 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13570 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
13580 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
13590 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
135a0 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
135b0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
135c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
135d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
135e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
135f0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
13600 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13610 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
13620 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13630 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
13640 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
13650 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
13660 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
13670 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13680 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
13690 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
136a0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
136b0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
136c0 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
136d0 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
136e0 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
136f0 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
13700 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
13710 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
13720 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
13730 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
13740 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
13750 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
13760 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
13770 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
13780 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
13790 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
137a0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
137b0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
137c0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
137d0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
137e0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
137f0 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
13800 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
13810 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
13820 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
13830 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
13840 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
13850 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
13860 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
13870 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
13880 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
13890 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
138a0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
138b0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
138c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
138d0 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
138e0 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
138f0 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
13900 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
13910 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
13920 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
13930 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
13940 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
13950 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
13960 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
13980 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
13990 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
139a0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
139b0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
139c0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
139d0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
139e0 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
13a10 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13a20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
13a30 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
13a40 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13a50 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13a60 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
13a70 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
13a80 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13a90 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
13ac0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13ad0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
13ae0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
13af0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13b00 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13b30 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
13b40 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13b50 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
13b60 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
13b70 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
13b80 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
13b90 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
13ba0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
13bb0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
13bc0 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
13bf0 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
13c00 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
13c10 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
13c20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
13c30 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
13c40 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
13c50 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
13c60 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
13c70 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
13c80 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
13c90 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
13ca0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
13cb0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
13cc0 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
13cd0 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
13ce0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13cf0 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
13d00 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
13d10 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
13d20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13d30 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
13d40 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
13d50 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
13d60 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
13d70 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
13d80 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
13d90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13da0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
13db0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
13dc0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
13dd0 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
13de0 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
13df0 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
13e00 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
13e10 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
13e20 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
13e30 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
13e40 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
13e50 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  i<0 ){.      if(
13e60 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20   i<(-MAX_6BYTE) 
13e70 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20  ) return 6;.    
13e80 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65    /* Previous te
13e90 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20  st prevents:  u 
13ea0 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38  = -(-92233720368
13eb0 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20  54775808) */.   
13ec0 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d     u = -i;.    }
13ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
13ee0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
13ef0 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
13f00 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d   return ((i&1)==
13f10 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
13f20 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20  >=4) ? 8+(u32)u 
13f30 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  : 1;.    }.    i
13f40 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
13f50 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
13f60 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
13f70 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
13f80 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
13f90 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
13fa0 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
13fb0 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
13fc0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
13fd0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
13fe0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
13ff0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14000 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
14010 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
14020 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
14030 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d  b) );.  n = pMem
14040 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
14050 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
14060 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
14070 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73  nZero;.  }.  ass
14080 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
14090 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
140a0 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
140b0 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
140c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
140d0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
140e0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
140f0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
14100 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
14110 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
14120 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
14130 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
14140 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14150 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
14160 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
14170 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
14180 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
14190 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
141a0 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
141b0 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
141c0 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
141d0 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
141e0 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
141f0 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
14200 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
14210 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
14220 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
14230 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
14240 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
14250 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
14260 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
14270 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
14280 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
14290 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
142a0 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
142b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
142c0 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
142d0 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
142e0 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
142f0 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
14300 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
14310 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
14320 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
14330 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
14340 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
14350 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
14360 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
14370 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
14380 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
14390 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
143a0 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
143b0 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
143c0 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
143d0 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
143e0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
143f0 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
14400 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
14410 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
14420 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
14430 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
14440 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
14450 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
14460 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
14470 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
14480 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
14490 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
144a0 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
144b0 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
144c0 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
144d0 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
144e0 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
144f0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
14500 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
14510 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
14520 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
14530 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
14540 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
14550 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
14560 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
14570 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
14580 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
14590 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
145a0 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
145b0 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
145c0 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
145d0 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
145e0 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
145f0 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
14600 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
14610 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
14620 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
14630 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
14640 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
14650 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
14660 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
14670 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
14680 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
14690 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
146a0 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
146b0 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
146c0 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
146d0 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
146e0 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
146f0 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
14700 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
14710 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
14720 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
14730 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
14740 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
14750 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
14760 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
14770 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
14780 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
14790 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
147a0 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
147b0 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
147c0 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
147d0 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
147e0 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
147f0 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
14800 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
14810 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
14820 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
14830 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
14840 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
14850 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
14860 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
14870 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
14880 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
14890 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
148a0 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
148b0 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
148c0 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
148d0 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
148e0 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
148f0 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
14900 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
14910 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
14920 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
14930 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
14940 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
14950 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
14960 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
14970 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
14980 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
14990 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
149a0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
149b0 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
149c0 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
149d0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
149e0 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
149f0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
14a00 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
14a10 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
14a20 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
14a30 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14a40 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
14a50 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
14a60 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
14a70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
14a80 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
14a90 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
14aa0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
14ab0 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
14ac0 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
14ad0 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
14ae0 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
14af0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
14b00 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
14b10 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
14b20 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
14b30 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
14b40 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
14b50 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
14b60 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
14b70 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
14b80 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
14b90 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
14ba0 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
14bb0 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
14bc0 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
14bd0 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
14be0 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
14bf0 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
14c00 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
14c10 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
14c20 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
14c30 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
14c40 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
14c50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14c60 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
14c70 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
14c80 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
14c90 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
14ca0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
14cb0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
14cc0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
14cd0 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
14ce0 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
14cf0 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
14d00 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
14d10 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
14d20 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
14d30 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
14d40 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
14d50 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
14d60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14d70 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
14d80 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c  format);.  u32 l
14d90 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
14da0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
14db0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
14dc0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
14dd0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
14de0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
14df0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14e00 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
14e10 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
14e20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
14e30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14e40 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
14e50 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
14e60 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14e70 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
14e80 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
14e90 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
14ea0 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
14eb0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14ec0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
14ed0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
14ee0 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29  len<=(u32)nBuf )
14ef0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
14f00 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
14f10 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
14f20 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
14f30 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14f40 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
14f50 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
14f60 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
14f70 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
14f80 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
14f90 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
14fa0 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
14fb0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
14fc0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
14fd0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
14fe0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
14ff0 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
15000 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
15010 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
15020 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
15030 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
15040 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
15050 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
15060 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
15070 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
15080 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73  nZero;.      ass
15090 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a  ert( nBuf>=0 );.
150a0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20        if( len > 
150b0 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20  (u32)nBuf ){.   
150c0 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29       len = (u32)
150d0 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nBuf;.      }.  
150e0 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b      memset(&buf[
150f0 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e  pMem->n], 0, len
15100 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d  -pMem->n);.    }
15110 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
15120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
15130 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
15140 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
15150 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  0;.}../*.** Dese
15160 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
15170 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
15180 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
15190 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
151a0 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
151b0 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
151c0 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
151d0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
151e0 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  read..*/ .u32 sq
151f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15200 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
15210 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
15220 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
15230 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
15240 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
15250 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
15260 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
15270 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
15280 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
15290 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
152a0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
152b0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
152c0 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
152d0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
152e0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
152f0 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
15300 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
15310 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
15320 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
15330 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
15340 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
15350 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
15360 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15370 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
15380 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15390 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
153a0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
153b0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
153c0 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
153d0 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
153e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
153f0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15400 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
15410 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
15420 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
15430 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15440 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
15450 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
15460 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
15470 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
15480 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15490 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
154a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
154b0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
154c0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
154d0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
154e0 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
154f0 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
15500 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
15510 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
15520 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15530 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
15540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15550 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
15560 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
15570 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
15580 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
15590 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
155a0 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
155b0 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
155c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
155d0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
155e0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
155f0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
15600 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15610 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
15620 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
15630 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
15640 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
15650 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
15660 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
15670 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
15680 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
15690 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
156a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
156b0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
156c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
156d0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
156e0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
156f0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
15700 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
15710 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
15720 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
15730 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15740 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a  */.      u64 x;.
15750 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66        u32 y;.#if
15760 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
15770 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
15780 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
15790 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
157a0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
157b0 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
157c0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
157d0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
157e0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64       ** byte ord
157f0 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
15800 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
15810 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
15820 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66   is.      ** def
15830 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
15840 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15850 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
15860 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a  e mixed.      **
15870 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a   endian..      *
15880 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
15890 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
158a0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
158b0 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69  <32;.      stati
158c0 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
158d0 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75  1 = 1.0;.      u
158e0 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
158f0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
15900 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
15910 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
15920 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
15930 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
15940 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
15950 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
15960 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d       x = (buf[0]
15970 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
15980 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
15990 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
159a0 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c     y = (buf[4]<<
159b0 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31  24) | (buf[5]<<1
159c0 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29  6) | (buf[6]<<8)
159d0 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20   | buf[7];.     
159e0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
159f0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
15a00 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
15a10 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15a20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
15a30 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15a40 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15a60 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15a70 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
15a80 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20  pMem->r)==8 );. 
15a90 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64         swapMixed
15aa0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
15ab0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
15ac0 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a  pMem->r, &x, siz
15ad0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20  eof(x));.       
15ae0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
15af0 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
15b00 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  ->r) ? MEM_Null 
15b10 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  : MEM_Real;.    
15b20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
15b30 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   8;.    }.    ca
15b40 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
15b50 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
15b60 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
15b70 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
15b80 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
15b90 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
15ba0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15bb0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15bc0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
15bd0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
15be0 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69   u32 len = (seri
15bf0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
15c00 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
15c10 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
15c20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
15c30 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65  .      pMem->xDe
15c40 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  l = 0;.      if(
15c50 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30   serial_type&0x0
15c60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
15c70 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
15c80 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  tr | MEM_Ephem;.
15c90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15ca0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15cb0 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45   = MEM_Blob | ME
15cc0 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
15cd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65  .      return le
15ce0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
15cf0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15d00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15d10 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
15d20 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
15d30 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
15d40 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
15d50 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
15d60 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
15d70 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
15d80 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
15d90 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
15da0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
15db0 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
15dc0 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
15dd0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
15de0 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
15df0 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
15e00 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
15e10 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
15e20 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
15e30 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
15e40 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
15e50 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
15e60 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
15e70 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
15e80 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
15e90 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
15ea0 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
15eb0 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
15ec0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
15ed0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
15ee0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
15ef0 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
15f00 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
15f10 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
15f20 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
15f30 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
15f40 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
15f50 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
15f60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
15f70 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
15f80 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
15f90 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
15fa0 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
15fb0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
15fc0 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
15fd0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
15ff0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
16000 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
16010 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
16020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
16030 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
16040 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
16050 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16070 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
16080 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
16090 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160b0 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
160c0 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
160d0 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
160e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
160f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16100 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
16110 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
16120 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
16150 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
16160 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
16170 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16190 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
161a0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
161b0 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
161c0 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
161d0 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
161e0 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
161f0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
16200 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
16210 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
16220 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
16230 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
16240 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
16250 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
16260 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
16270 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
16280 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
16290 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
162a0 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
162b0 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
162c0 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
162d0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
162e0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
162f0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
16300 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
16310 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
16320 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
16330 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
16340 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
16350 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
16360 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
16370 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
16380 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
16390 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
163a0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
163b0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
163c0 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
163d0 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
163e0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
163f0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
16400 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
16410 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
16420 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
16430 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
16440 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
16450 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
16460 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
16470 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
16480 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
16490 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
164a0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
164b0 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
164c0 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
164d0 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
164e0 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
164f0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
16500 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
16510 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
16520 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
16530 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
16540 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
16550 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
16560 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
16570 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
16580 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
16590 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
165a0 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
165b0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
165d0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
165e0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
165f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
16600 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
16610 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
16620 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
16630 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
16640 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
16650 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
16660 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
16670 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16680 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
16690 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
166a0 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
166b0 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
166e0 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
166f0 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
16720 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
16730 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
16740 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
16750 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c  ->aMem;..  p->fl
16760 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ags = 0;.  asser
16770 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
16780 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
16790 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
167a0 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
167b0 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
167c0 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
167d0 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
167e0 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c  <p->nField && d<
167f0 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
16800 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
16810 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
16820 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
16830 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
16840 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
16850 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
16860 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
16870 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
16880 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
16890 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
168a0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
168b0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
168c0 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
168d0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
168e0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
168f0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
16900 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
16910 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
16920 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20  m++;.    u++;.  
16930 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
16940 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
16950 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
16960 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ld = u;.}../*.**
16970 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
16980 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
16990 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
169a0 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
169b0 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
169c0 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
169d0 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
169e0 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
169f0 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
16a00 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
16a10 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
16a20 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
16a30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
16a40 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
16a50 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
16a60 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
16a70 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d  eated by th OP_M
16a80 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
16a90 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
16aa0 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
16ab0 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
16ac0 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
16ad0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
16ae0 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
16af0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  ecord..**.** Key
16b00 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
16b10 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
16b20 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
16b30 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20  r of fields..** 
16b40 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77  The key with few
16b50 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75  er fields is usu
16b60 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65  ally compares le
16b70 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20  ss than the .** 
16b80 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77  longer key.  How
16b90 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41  ever if the UNPA
16ba0 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61  CKED_INCRKEY fla
16bb0 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20  gs in pPKey2 is 
16bc0 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  set.** and the c
16bd0 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61  ommon prefixes a
16be0 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b  re equal, then k
16bf0 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
16c00 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20   key2..** Or if 
16c10 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54  the UNPACKED_MAT
16c20 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69  CH_PREFIX flag i
16c30 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72  s set and the pr
16c40 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71  efixes are.** eq
16c50 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65  ual, then the ke
16c60 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ys are considere
16c70 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e  d to be equal an
16c80 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62  d.** the parts b
16c90 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  eyond the common
16ca0 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f   prefix are igno
16cb0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
16cc0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
16cd0 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
16ce0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
16cf0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
16d00 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
16d10 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
16d20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
16d30 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
16d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16d50 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
16d60 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
16d70 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
16d80 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
16d90 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
16da0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
16db0 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
16dc0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
16dd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16de0 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
16df0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
16e00 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
16e10 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
16e20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16e30 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
16e40 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
16e50 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
16e60 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
16e70 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
16e80 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
16e90 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
16ea0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
16eb0 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
16ec0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
16ed0 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
16ee0 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
16ef0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
16f00 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
16f10 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
16f20 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61  A_ONLY( mem1.zMa
16f30 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
16f40 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
16f50 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
16f60 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
16f70 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
16f80 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
16f90 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
16fa0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
16fb0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
16fc0 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
16fd0 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
16fe0 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
16ff0 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
17000 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
17010 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
17020 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
17030 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
17040 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
17050 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
17060 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
17070 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
17080 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
17090 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
170a0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
170b0 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
170c0 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
170d0 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
170e0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
170f0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
17100 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
17110 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
17120 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
17130 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
17140 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
17150 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
17160 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
17170 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
17180 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
17190 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
171a0 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 6e 46  1 = szHdr1;.  nF
171b0 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
171c0 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73 73 65 72  >nField;.  asser
171d0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
171e0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
171f0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
17200 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
17210 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
17220 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
17230 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
17240 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
17250 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
17260 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
17270 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
17280 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
17290 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
172a0 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
172b0 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
172c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
172d0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
172e0 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
172f0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
17300 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
17310 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
17320 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
17330 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17340 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
17350 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
17360 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
17370 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
17380 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
17390 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
173a0 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
173b0 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173d0 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
173e0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
173f0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
17400 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
17410 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
17420 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
17430 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
17440 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
17450 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
17460 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
17470 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
17480 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 46 69  .      if( i<nFi
17490 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  eld && pKeyInfo-
174a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
174b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
174c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
174d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
174e0 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
174f0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61  lag is set and a
17500 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74  ll fields except
17510 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20   the final.     
17520 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20   ** rowid field 
17530 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e  were equal, then
17540 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49   clear the PREFI
17550 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e  X_SEARCH flag an
17560 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20  d set .      ** 
17570 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f  pPKey2->rowid to
17580 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17590 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e  e rowid field in
175a0 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e   (pKey1, nKey1).
175b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
175c0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  s used by the OP
175d0 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65  _IsUnique opcode
175e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
175f0 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c   if( (pPKey2->fl
17600 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
17610 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26  REFIX_SEARCH) &&
17620 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69   i==(pPKey2->nFi
17630 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  eld-1) ){.      
17640 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d    assert( idx1==
17650 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a  szHdr1 && rc );.
17660 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17670 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d  mem1.flags & MEM
17680 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  _Int );.        
17690 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d  pPKey2->flags &=
176a0 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49   ~UNPACKED_PREFI
176b0 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20  X_SEARCH;.      
176c0 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20    pPKey2->rowid 
176d0 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20  = mem1.u.i;.    
176e0 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72    }.    .      r
176f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17700 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
17710 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
17720 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
17730 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
17740 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
17750 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
17760 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
17770 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
17780 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
17790 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
177a0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
177b0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
177c0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
177d0 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
177e0 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
177f0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
17800 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
17810 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
17820 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
17830 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
17840 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
17850 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
17860 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
17870 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  e UNPACKED_INCRK
17880 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  EY.  ** flag is 
17890 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20  set, then break 
178a0 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74  the tie by treat
178b0 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67  ing key2 as larg
178c0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  er..  ** If the 
178d0 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  UPACKED_PREFIX_M
178e0 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ATCH flag is set
178f0 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68  , then keys with
17900 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
17910 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64  .  ** are consid
17920 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
17930 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
17940 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20  e longer key is 
17950 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72  the .  ** larger
17960 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73  .  As it happens
17970 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c  , the pPKey2 wil
17980 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  l always be the 
17990 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74  longer.  ** if t
179a0 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72  here is a differ
179b0 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ence..  */.  ass
179c0 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
179d0 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
179e0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  s & UNPACKED_INC
179f0 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d  RKEY ){.    rc =
17a00 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   -1;.  }else if(
17a10 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
17a20 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
17a30 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a  _MATCH ){.    /*
17a40 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a   Leave rc==0 */.
17a50 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31    }else if( idx1
17a60 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72  <szHdr1 ){.    r
17a70 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 1;.  }.  ret
17a80 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a  urn rc;.}. ../*.
17a90 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
17aa0 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
17ab0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
17ac0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
17ad0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
17ae0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
17af0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
17b00 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
17b10 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
17b20 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
17b30 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
17b40 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
17b50 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
17b60 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
17b70 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
17b80 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
17b90 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
17ba0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
17bb0 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
17bc0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
17bd0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
17be0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
17bf0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
17c00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
17c10 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
17c20 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
17c30 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
17c40 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
17c50 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
17c60 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
17c70 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17c80 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
17c90 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
17ca0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
17cb0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
17cc0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
17cd0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
17ce0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
17cf0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55  Mem m, v;..  UNU
17d00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
17d10 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  );..  /* Get the
17d20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
17d30 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
17d40 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
17d50 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
17d60 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
17d70 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
17d80 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
17d90 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
17da0 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
17db0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
17dc0 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
17dd0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
17de0 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
17df0 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
17e00 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
17e10 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
17e20 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
17e30 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
17e40 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
17e50 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
17e60 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
17e70 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
17e80 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
17e90 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
17ea0 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f  LITE_OK );     /
17eb0 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
17ec0 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
17ed0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
17ee0 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
17ef0 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
17f00 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
17f10 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
17f20 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
17f30 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
17f40 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
17f50 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30  /.  memset(&m, 0
17f60 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20  , sizeof(m));.  
17f70 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
17f80 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
17f90 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c  r, 0, (int)nCell
17fa0 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
17fb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
17fc0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
17fd0 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72  * The index entr
17fe0 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74  y must begin wit
17ff0 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20  h a header size 
18000 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
18010 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
18020 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63   szHdr);.  testc
18030 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b  ase( szHdr==3 );
18040 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
18050 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28  dr==m.n );.  if(
18060 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c   unlikely(szHdr<
18070 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e  3 || (int)szHdr>
18080 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  m.n) ){.    goto
18090 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
180a0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
180b0 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20   The last field 
180c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f  of the index sho
180d0 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65  uld be an intege
180e0 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20  r - the ROWID.. 
180f0 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   ** Verify that 
18100 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72  the last entry r
18110 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65  eally is an inte
18120 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29  ger. */.  (void)
18130 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
18140 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20  )&m.z[szHdr-1], 
18150 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
18160 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18170 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  d==1 );.  testca
18180 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32  se( typeRowid==2
18190 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
181a0 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a  typeRowid==3 );.
181b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
181c0 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65  Rowid==4 );.  te
181d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
181e0 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61  d==5 );.  testca
181f0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36  se( typeRowid==6
18200 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18210 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a  typeRowid==8 );.
18220 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18230 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66  Rowid==9 );.  if
18240 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52  ( unlikely(typeR
18250 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f  owid<1 || typeRo
18260 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77  wid>9 || typeRow
18270 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f  id==7) ){.    go
18280 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
18290 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c  ruption;.  }.  l
182a0 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
182b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
182c0 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  en(typeRowid);. 
182d0 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29   testcase( (u32)
182e0 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f  m.n==szHdr+lenRo
182f0 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  wid );.  if( unl
18300 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73  ikely((u32)m.n<s
18310 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29  zHdr+lenRowid) )
18320 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
18330 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
18340 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
18350 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
18360 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18370 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
18380 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
18390 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
183a0 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
183b0 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
183c0 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
183d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
183e0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
183f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18400 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
18410 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
18420 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
18430 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
18440 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
18450 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
18460 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
18470 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18480 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
18490 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
184a0 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c  testcase( m.zMal
184b0 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
184c0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
184d0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
184e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
184f0 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
18500 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
18510 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
18520 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
18530 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
18540 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
18550 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
18560 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
18570 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
18580 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
18590 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
185a0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
185b0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
185c0 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
185d0 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
185e0 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
185f0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18600 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
18610 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
18620 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
18630 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
18640 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
18650 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
18660 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
18670 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
18680 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
18690 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
186a0 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
186b0 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
186c0 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
186d0 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
186e0 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
186f0 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
18700 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
18710 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
18720 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
18730 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
18740 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20  VdbeCursor *pC, 
18750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18760 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
18770 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
18780 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
18790 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a   *pUnpacked,  /*
187a0 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
187b0 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70  n of key to comp
187c0 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
187d0 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
187f0 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
18800 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
18810 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
18820 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
18830 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
18840 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
18850 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  sor;.  Mem m;.. 
18860 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18870 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
18880 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
18890 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
188a0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
188b0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
188c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
188d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
188e0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
188f0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
18900 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
18910 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79  */.  /* nCellKey
18920 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
18930 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
18940 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65  ffffffff because
18950 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a   of the say.  **
18960 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65   that btreeParse
18970 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71  CellPtr() and sq
18980 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
18990 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
189a0 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c  ed */.  if( nCel
189b0 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c  lKey<=0 || nCell
189c0 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29  Key>0x7fffffff )
189d0 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
189e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
189f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18a00 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c    }.  memset(&m,
18a10 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
18a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
18a30 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
18a40 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
18a50 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
18a60 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
18a70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18a80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18a90 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20  Unpacked->flags 
18aa0 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
18ab0 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20 2a 72 65  X_MATCH );.  *re
18ac0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
18ad0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
18ae0 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
18af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18b00 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
18b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18b20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
18b30 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
18b40 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
18b50 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
18b60 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
18b70 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
18b80 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
18b90 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
18ba0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
18bb0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
18bc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
18bd0 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
18be0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18bf0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
18c00 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
18c10 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
18c20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
18c30 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
18c40 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
18c50 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
18c60 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
18c70 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
18c80 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
18c90 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
18ca0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18cb0 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
18cc0 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
18cd0 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
18ce0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
18cf0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18d00 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
18d10 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
18d20 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
18d30 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
18d40 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
18d50 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
18d60 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
18d70 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
18d80 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
18d90 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
18da0 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
18db0 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
18dc0 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
18dd0 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
18de0 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
18df0 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
18e00 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
18e10 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
18e20 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
18e30 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
18e40 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
18e50 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
18e60 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
18e70 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
18e80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18e90 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
18ea0 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
18eb0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
18ec0 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
18ed0 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
18ee0 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
18ef0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
18f00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18f10 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
18f20 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
18f30 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
18f40 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
18f50 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
18f60 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
18f70 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
18f80 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
18f90 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
18fa0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
18fb0 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
18fc0 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
18fd0 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
18fe0 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
18ff0 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
19000 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
19010 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
19020 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
19030 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
19040 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
19050 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
19060 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
19070 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
19080 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
19090 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
190a0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
190b0 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
190c0 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
190d0 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
190e0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
190f0 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
19100 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
19110 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
19120 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
19130 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
19140 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
19150 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
19160 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
19170 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
19180 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
19190 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
191a0 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
191b0 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
191c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
191d0 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
191e0 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
191f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
19200 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
19210 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
19220 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
19230 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19240 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a  StoreType((Mem *
19250 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  )pRet);.      }.
19260 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
19270 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
19280 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
19290 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
192a0 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
192b0 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
192c0 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
192d0 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
192e0 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
192f0 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
19300 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
19310 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
19320 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
19330 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
19340 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
19350 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
19360 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
19370 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
19380 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
19390 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
193a0 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
193b0 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
193c0 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
193d0 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
193e0 7d 0a 7d 0a                                      }.}.