/ Hex Artifact Content
Login

Artifact 3c36d92d3ad7225e0436474f4256243e5ceaeabb:


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 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  j<p->nLabel );. 
1b70: 20 69 66 28 20 6a 3e 3d 30 20 26 26 20 70 2d 3e   if( j>=0 && 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 62 49 73 52 65 61 64   1;.  p->bIsRead
2d70: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f  er = 0;.  for(pO
2d80: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
2d90: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
2da0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
2db0: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
2dc0: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f  code;..    /* NO
2dd0: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
2de0: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
2df0: 61 77 6b 20 77 68 65 6e 20 61 64 64 69 6e 67 20  awk when adding 
2e00: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
2e10: 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68  ** cases from th
2e20: 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20  is switch! */.  
2e30: 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f 64 65    switch( opcode
2e40: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
2e50: 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 20  P_Function:.    
2e60: 20 20 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65    case OP_AggSte
2e70: 70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  p: {.        if(
2e80: 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67   pOp->p5>nMaxArg
2e90: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
2ea0: 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20 20 20 20  Op->p5;.        
2eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2ec0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
2ed0: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
2ee0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21      if( pOp->p2!
2ef0: 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  =0 ) p->readOnly
2f00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
2f10: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
2f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
2f30: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
2f40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
2f50: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
2f60: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
2f70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
2f80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
2f90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fa0: 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f  WAL.      case O
2fb0: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65  P_Checkpoint:.#e
2fc0: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
2fd0: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
2fe0: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
2ff0: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
3000: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
3010: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
3020: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
3030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3040: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3050: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
3060: 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  LE.      case OP
3070: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
3080: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
3090: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
30a0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
30b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
30d0: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
30e0: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
30f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
3100: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
3110: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3120: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
3130: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
3140: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d         n = pOp[-
3150: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  1].p1;.        i
3160: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
3170: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
3180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3190: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31a0: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
31b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
31c0: 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20  rterNext: {.    
31d0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
31e0: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
31f0: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
3200: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3210: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
3220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3230: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
3240: 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20 20  Prev: {.        
3250: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3260: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
3270: 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20  revious;.       
3280: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3290: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
32a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70  }.    }..    pOp
32c0: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
32d0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
32e0: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
32f0: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
3300: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
3310: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
3320: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3330: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c  -1-pOp->p2<p->nL
3340: 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f  abel );.      pO
3350: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
3360: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  1-pOp->p2];.    
3370: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
3380: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
3390: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c  aLabel);.  p->aL
33a0: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61  abel = 0;.  *pMa
33b0: 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78  xFuncArgs = nMax
33c0: 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20  Args;.  assert( 
33d0: 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20  p->bIsReader!=0 
33e0: 7c 7c 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 3d  || p->btreeMask=
33f0: 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  =0 );.}../*.** R
3400: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
3410: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
3420: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
3430: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
3440: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
3450: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
3460: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
3470: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
3480: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
3490: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
34a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34b0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
34c0: 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  er to the array 
34d0: 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63  of opcodes assoc
34e0: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
34f0: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
3500: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
3510: 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63  ent. It is the c
3520: 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
3530: 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61  ility.** to arra
3540: 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75  nge for the retu
3550: 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65  rned array to be
3560: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
3570: 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  d using the .** 
3580: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
3590: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
35a0: 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
35b0: 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74  ng, *pnOp is set
35c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
35d0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
35e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72   returned.** arr
35f0: 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78  ay. Also, *pnMax
3600: 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  Arg is set to th
3610: 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20  e larger of its 
3620: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e  current value an
3630: 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  d .** the number
3640: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
3650: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
3660: 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74  array required t
3670: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a  o execute the .*
3680: 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72  * returned progr
3690: 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  am..*/.VdbeOp *s
36a0: 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70  qlite3VdbeTakeOp
36b0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69  Array(Vdbe *p, i
36c0: 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70  nt *pnOp, int *p
36d0: 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65  nMaxArg){.  Vdbe
36e0: 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *aOp = p->aOp
36f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20  ;.  assert( aOp 
3700: 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  && !p->db->mallo
3710: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a  cFailed );..  /*
3720: 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69   Check that sqli
3730: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
3740: 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
3750: 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a  d on this VM */.
3760: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 74 72    assert( p->btr
3770: 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20  eeMask==0 );..  
3780: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
3790: 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20  p, pnMaxArg);.  
37a0: 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  *pnOp = p->nOp;.
37b0: 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20    p->aOp = 0;.  
37c0: 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f  return aOp;.}../
37d0: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
37e0: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
37f0: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
3800: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
3810: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65  urn the.** addre
3820: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
3830: 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e  operation added.
3840: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
3850: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62  dbeAddOpList(Vdb
3860: 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56  e *p, int nOp, V
3870: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
3880: 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64  *aOp){.  int add
3890: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  r;.  assert( p->
38a0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
38b0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
38c0: 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70  p->nOp + nOp > p
38d0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
38e0: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
38f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3900: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
3910: 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  p;.  if( ALWAYS(
3920: 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e  nOp>0) ){.    in
3930: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c  t i;.    VdbeOpL
3940: 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d  ist const *pIn =
3950: 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d   aOp;.    for(i=
3960: 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70  0; i<nOp; i++, p
3970: 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  In++){.      int
3980: 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20   p2 = pIn->p2;. 
3990: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75       VdbeOp *pOu
39a0: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  t = &p->aOp[i+ad
39b0: 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  dr];.      pOut-
39c0: 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f  >opcode = pIn->o
39d0: 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75  pcode;.      pOu
39e0: 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b  t->p1 = pIn->p1;
39f0: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
3a00: 26 26 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  && (sqlite3Opcod
3a10: 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e  eProperty[pOut->
3a20: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
3a30: 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20  JUMP)!=0 ){.    
3a40: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
3a50: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
3a60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3a70: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
3a80: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
3a90: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
3aa0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
3ab0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
3ac0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
3ad0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
3ae0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
3af0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
3b00: 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d  EBUG.      pOut-
3b10: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20  >zComment = 0;. 
3b20: 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e       if( p->db->
3b30: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
3b40: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
3b50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3b60: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
3b70: 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69  +addr, &p->aOp[i
3b80: 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d  +addr]);.      }
3b90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
3ba0: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
3bb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
3bc0: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dr;.}../*.** Cha
3bd0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3be0: 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   the P1 operand 
3bf0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3c00: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3c10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3c20: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
3c30: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
3c40: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
3c50: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
3c60: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
3c70: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
3c80: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
3c90: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
3ca0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
3cb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3cc0: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
3cd0: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
3ce0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
3cf0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
3d00: 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29  f( ((u32)p->nOp)
3d10: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
3d20: 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76  aOp[addr].p1 = v
3d30: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3d40: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3d50: 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72  e of the P2 oper
3d60: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3d70: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3d80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3d90: 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  is useful for se
3da0: 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73  tting a jump des
3db0: 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  tination..*/.voi
3dc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3dd0: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75  ngeP2(Vdbe *p, u
3de0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
3df0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3e00: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32  0 );.  if( ((u32
3e10: 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b  )p->nOp)>addr ){
3e20: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
3e30: 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p2 = val;.  }.
3e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3e50: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3e60: 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P3 operand for 
3e70: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3e80: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
3e90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3ea0: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP3(Vdbe *p, u32
3eb0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3ec0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3ed0: 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70  );.  if( ((u32)p
3ee0: 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20  ->nOp)>addr ){. 
3ef0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3f00: 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p3 = val;.  }.}.
3f10: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3f20: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3f30: 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68  5 operand for th
3f40: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a  e most recently.
3f50: 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69  ** added operati
3f60: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3f70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
3f80: 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29  Vdbe *p, u8 val)
3f90: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3fa0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
3fb0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3fc0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
3fd0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3fe0: 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p5 = val;.  }.}
3ff0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4000: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
4010: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
4020: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
4030: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
4040: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
4050: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4060: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
4070: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
4080: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
4090: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
40a0: 20 41 4c 57 41 59 53 28 61 64 64 72 3e 3d 30 29   ALWAYS(addr>=0)
40b0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
40c0: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
40d0: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
40e0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
40f0: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
4100: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
4110: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
4120: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
4130: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
4140: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
4150: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
4160: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
4170: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
4180: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
4190: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
41a0: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
41b0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
41c0: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
41d0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
41e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
41f0: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
4200: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4210: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
4220: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
4230: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
4240: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
4250: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
4260: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
4270: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
4280: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
4290: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
42a0: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
42b0: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
42c0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
42d0: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
42e0: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
42f0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
4300: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
4310: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
4320: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
4330: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4340: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
4350: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
4360: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
4370: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4390: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
43a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
43b0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
43c0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
43d0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
43e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
43f0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
4400: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
4410: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4420: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
4430: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
4440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4450: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
4460: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4470: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4480: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4490: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
44a0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
44b0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
44c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
44d0: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
44e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
44f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
4500: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
4510: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4520: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
4530: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
4540: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4550: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
4560: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4570: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4580: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
4590: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
45a0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
45b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
45c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
45d0: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
45e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
45f0: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
4600: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
4610: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
4620: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
4630: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
4640: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
4650: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
4660: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
4670: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
4680: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
4690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
46a0: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
46b0: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
46c0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
46d0: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61  (pOp=aOp; pOp<&a
46e0: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b  Op[nOp]; pOp++){
46f0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4700: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4710: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
4720: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4730: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4740: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
4750: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
4760: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73    .    }.  }.  s
4770: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4780: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOp);.}../*.** 
4790: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
47a0: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
47b0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
47c0: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
47d0: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
47e0: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
47f0: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
4800: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
4810: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
4820: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
4830: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
4840: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
4850: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4860: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
4870: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
4880: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
4890: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
48a0: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
48b0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
48c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
48d0: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
48e0: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
48f0: 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  oop.*/.void sqli
4900: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
4910: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
4920: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d   addr){.  if( p-
4930: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
4940: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4950: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
4960: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4970: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
4980: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4990: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
49a0: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
49b0: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
49c0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
49d0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a  OP_Noop;.  }.}..
49e0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
49f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
4a00: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4a10: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4a20: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
4a30: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
4a40: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
4a50: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
4a60: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
4a70: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
4a80: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
4a90: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
4aa0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
4ab0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
4ac0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
4ad0: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
4ae0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
4af0: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
4b00: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
4b10: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
4b20: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
4b30: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4b40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4b50: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
4b60: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
4b70: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
4b80: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
4b90: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
4ba0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
4bb0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
4bc0: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
4bd0: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
4be0: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
4bf0: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
4c00: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
4c10: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
4c20: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
4c30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
4c40: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
4c50: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
4c60: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
4c70: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
4c80: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
4c90: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
4ca0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
4cb0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
4cc0: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
4cd0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4ce0: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
4cf0: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
4d00: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
4d10: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4d20: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
4d30: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
4d40: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
4d50: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
4d60: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
4d70: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
4d80: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
4d90: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
4da0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
4db0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
4dc0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
4dd0: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
4de0: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
4df0: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
4e00: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
4e10: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
4e20: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
4e30: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
4e40: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
4e50: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
4e60: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
4e70: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
4e80: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4e90: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
4ea0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4ec0: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
4ed0: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
4ee0: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
4ef0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
4f00: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
4f10: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
4f20: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
4f30: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4f40: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4f50: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
4f60: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
4f70: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
4f80: 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n!=P4_KEYINFO 
4f90: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  && n!=P4_VTAB ) 
4fa0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
4fb0: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
4fc0: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
4fd0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
4fe0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
4ff0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
5000: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
5010: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
5020: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
5030: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
5040: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
5050: 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r];.  assert( pO
5060: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
5070: 54 55 53 45 44 20 7c 7c 20 70 4f 70 2d 3e 70 34  TUSED || pOp->p4
5080: 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
5090: 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70  ;.  freeP4(db, p
50a0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
50b0: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
50c0: 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  4.p = 0;.  if( n
50d0: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
50e0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
50f0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
5100: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
5110: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
5120: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
5130: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
5140: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
5150: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
5160: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
5170: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
5180: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5190: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
51a0: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
51b0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
51c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
51d0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
51e0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
51f0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
5200: 4b 65 79 49 6e 66 6f 20 2a 70 4f 72 69 67 2c 20  KeyInfo *pOrig, 
5210: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4f 72 69  *pNew;..    pOri
5220: 67 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 7a 50  g = (KeyInfo*)zP
5230: 34 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  4;.    pNew = sq
5240: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
5250: 63 28 64 62 2c 20 70 4f 72 69 67 2d 3e 6e 46 69  c(db, pOrig->nFi
5260: 65 6c 64 2c 20 70 4f 72 69 67 2d 3e 6e 58 46 69  eld, pOrig->nXFi
5270: 65 6c 64 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  eld);.    pOp->p
5280: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4e 65  4.pKeyInfo = pNe
5290: 77 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  w;.    if( pNew 
52a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
52b0: 20 70 4f 72 69 67 2d 3e 6e 46 69 65 6c 64 2b 70   pOrig->nField+p
52c0: 4f 72 69 67 2d 3e 6e 58 46 69 65 6c 64 3b 0a 20  Orig->nXField;. 
52d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
52e0: 2d 3e 61 43 6f 6c 6c 2c 20 70 4f 72 69 67 2d 3e  ->aColl, pOrig->
52f0: 61 43 6f 6c 6c 2c 20 6e 2a 73 69 7a 65 6f 66 28  aColl, n*sizeof(
5300: 70 4e 65 77 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 29  pNew->aColl[0]))
5310: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
5320: 4e 65 77 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  New->aSortOrder,
5330: 20 70 4f 72 69 67 2d 3e 61 53 6f 72 74 4f 72 64   pOrig->aSortOrd
5340: 65 72 2c 20 6e 29 3b 0a 20 20 20 20 20 20 70 4f  er, n);.      pO
5350: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
5360: 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73  EYINFO;.    }els
5370: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e  e{.      p->db->
5380: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
5390: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  ;.      pOp->p4t
53a0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
53b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
53c0: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
53d0: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
53e0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
53f0: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
5400: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
5410: 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69  YINFO;.  }else i
5420: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b  f( n==P4_VTAB ){
5430: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
5440: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
5450: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5460: 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69  4_VTAB;.    sqli
5470: 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61  te3VtabLock((VTa
5480: 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20  ble *)zP4);.    
5490: 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65  assert( ((VTable
54a0: 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e   *)zP4)->db==p->
54b0: 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  db );.  }else if
54c0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
54d0: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
54e0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
54f0: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
5500: 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  har)n;.  }else{.
5510: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
5520: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
5530: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
5540: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
5550: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
5560: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
5570: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
5580: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23  YNAMIC;.  }.}..#
5590: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
55a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
55b0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  omment on the mo
55c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
55d0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
55e0: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
55f0: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
5600: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
5610: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
5620: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
5630: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
5640: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
5650: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
5660: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
5670: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
5680: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  ion build..*/.st
5690: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43  atic void vdbeVC
56a0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
56b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
56c0: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29  mat, va_list ap)
56d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
56e0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
56f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5700: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
5710: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5720: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
5730: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5740: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5750: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
5760: 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c  ->aOp );.    sql
5770: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
5780: 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  , p->aOp[p->nOp-
5790: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  1].zComment);.  
57a0: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
57b0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71  1].zComment = sq
57c0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
57d0: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
57e0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
57f0: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
5800: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5810: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5820: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5830: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
5840: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5850: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
5860: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
5870: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5880: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
5890: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
58a0: 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62  eNoopComment(Vdb
58b0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
58c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
58d0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
58e0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
58f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
5900: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  p, OP_Noop);.   
5910: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5920: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
5930: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
5940: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5950: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5960: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
5970: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  G */../*.** Retu
5980: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
5990: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
59a0: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
59b0: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
59c0: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
59d0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
59e0: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
59f0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
5a00: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
5a10: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
5a20: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
5a30: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
5a40: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
5a50: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
5a60: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
5a70: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
5a80: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
5a90: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
5aa0: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
5ab0: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
5ac0: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
5ad0: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
5ae0: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
5af0: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
5b00: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
5b10: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20  ning.** after a 
5b20: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
5b30: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
5b40: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
5b50: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
5b60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5b70: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
5b80: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
5b90: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
5ba0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
5bb0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
5bc0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
5bd0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
5be0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
5bf0: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
5c00: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a  ith Valgrind..**
5c10: 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69  .** About the #i
5c20: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5c30: 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c  _TRACE:  Normall
5c40: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
5c50: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a  is never called.
5c60: 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70  ** unless p->nOp
5c70: 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63  >0.  This is bec
5c80: 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65  ause in the abse
5c90: 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  nse of SQLITE_OM
5ca0: 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20  IT_TRACE,.** an 
5cb0: 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63  OP_Trace instruc
5cc0: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
5cd0: 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74  nserted by sqlit
5ce0: 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73  e3VdbeGet() as s
5cf0: 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20  oon as.** a new 
5d00: 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e  VDBE is created.
5d10: 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65    So we are free
5d20: 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20   to set addr to 
5d30: 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74  p->nOp-1 without
5d40: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f  .** having to do
5d50: 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61  uble-check to ma
5d60: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5d70: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e   result is non-n
5d80: 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20  egative. But.** 
5d90: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  if SQLITE_OMIT_T
5da0: 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c  RACE is defined,
5db0: 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73   the OP_Trace is
5dc0: 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20   omitted and we 
5dd0: 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68  do need to.** ch
5de0: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66  eck the value of
5df0: 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65   p->nOp-1 before
5e00: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a   continuing..*/.
5e10: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
5e20: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
5e30: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
5e40: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
5e50: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
5e60: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
5e70: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
5e80: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
5e90: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
5ea0: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
5eb0: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
5ec0: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
5ed0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
5ee0: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
5ef0: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
5f00: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
5f10: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
5f20: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
5f30: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
5f40: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
5f50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5f60: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
5f70: 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65  ( p->nOp==0 ) re
5f80: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
5f90: 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ummy;.#endif.   
5fa0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
5fb0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
5fc0: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
5fd0: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
5fe0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5ff0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
6000: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
6020: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
6030: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6040: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
6050: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
6060: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
6070: 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  )./*.** Compute 
6080: 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  a string for the
6090: 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64   "comment" field
60a0: 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64   of a VDBE opcod
60b0: 65 20 6c 69 73 74 69 6e 67 0a 2a 2f 0a 73 74 61  e listing.*/.sta
60c0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43  tic int displayC
60d0: 6f 6d 6d 65 6e 74 28 4f 70 20 2a 70 4f 70 2c 20  omment(Op *pOp, 
60e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
60f0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
6100: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 6f 6e 73  t nTemp){.  cons
6110: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
6120: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6130: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
6140: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
6150: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65  i, jj;.  zOpName
6160: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
6170: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
6180: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
6190: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
61a0: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
61b0: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
61c0: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
61d0: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7a 53  nCom = 0;.    zS
61e0: 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d  ynopsis = zOpNam
61f0: 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31  e += nOpName + 1
6200: 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d  ;.    for(ii=jj=
6210: 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26  0; jj<nTemp-1 &&
6220: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 3b 20   zSynopsis[ii]; 
6230: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
6240: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 3d 3d   zSynopsis[ii]==
6250: 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  'P' ){.        i
6260: 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20 63 6f  nt v;.        co
6270: 6e 73 74 20 63 68 61 72 20 2a 7a 53 68 6f 77 20  nst char *zShow 
6280: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 69 2b  = 0;.        ii+
6290: 2b 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  +;.        switc
62a0: 68 28 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d  h( zSynopsis[ii]
62b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
62c0: 73 65 20 27 31 27 3a 20 76 20 3d 20 70 4f 70 2d  se '1': v = pOp-
62d0: 3e 70 31 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  >p1;  break;.   
62e0: 20 20 20 20 20 20 20 63 61 73 65 20 27 32 27 3a         case '2':
62f0: 20 76 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 62   v = pOp->p2;  b
6300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
6310: 63 61 73 65 20 27 33 27 3a 20 76 20 3d 20 70 4f  case '3': v = pO
6320: 70 2d 3e 70 33 3b 20 20 62 72 65 61 6b 3b 0a 20  p->p3;  break;. 
6330: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 27 35           case '5
6340: 27 3a 20 76 20 3d 20 70 4f 70 2d 3e 70 35 3b 20  ': v = pOp->p5; 
6350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6360: 20 20 63 61 73 65 20 27 34 27 3a 20 7a 53 68 6f    case '4': zSho
6370: 77 20 3d 20 7a 50 34 3b 20 20 62 72 65 61 6b 3b  w = zP4;  break;
6380: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
6390: 27 58 27 3a 20 7a 53 68 6f 77 20 3d 20 70 4f 70  'X': zShow = pOp
63a0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 20 73 65 65 6e  ->zComment; seen
63b0: 43 6f 6d 20 3d 20 31 3b 20 62 72 65 61 6b 3b 0a  Com = 1; break;.
63c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
63d0: 20 20 69 66 28 20 7a 53 68 6f 77 20 29 7b 0a 20    if( zShow ){. 
63e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
63f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
6400: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
6410: 73 22 2c 20 7a 53 68 6f 77 29 3b 0a 20 20 20 20  s", zShow);.    
6420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6430: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6440: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6450: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20  zTemp+jj, "%d", 
6460: 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  v);.        }.  
6470: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
6480: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
6490: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
64a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
64b0: 70 5b 6a 6a 2b 2b 5d 20 3d 20 7a 53 79 6e 6f 70  p[jj++] = zSynop
64c0: 73 69 73 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d  sis[ii];.      }
64d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
64e0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
64f0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
6500: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
6510: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6520: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
6530: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
6540: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
6550: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
6560: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
6570: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
6580: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
6590: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
65a0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
65b0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
65c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
65d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
65e0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
65f0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
6600: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
6610: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6620: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
6630: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
6640: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
6650: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
6660: 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65  BUG */...#if !de
6670: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6680: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
6690: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
66a0: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
66b0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
66c0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
66d0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
66e0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
66f0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
6700: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
6710: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
6720: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
6730: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
6740: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
6750: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
6760: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
6770: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
6780: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
6790: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
67a0: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
67b0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
67c0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
67d0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
67e0: 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a  _KEYINFO_STATIC:
67f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
6800: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
6810: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
6820: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
6830: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
6840: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
6850: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
6860: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
6870: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6880: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6890: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
68a0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
68b0: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
68c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
68d0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
68e0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
68f0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
6900: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6910: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
6920: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
6930: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6940: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
6950: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e  Coll->zName : "n
6960: 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  il";.        int
6970: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
6980: 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20  en30(zColl);.   
6990: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
69a0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
69b0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
69c0: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
69d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
69e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69f0: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
6a00: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ';.        if( p
6a10: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6a20: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6a30: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
6a40: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '-';.        }.
6a50: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
6a60: 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c  zTemp[i], zColl,
6a70: 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69   n+1);.        i
6a80: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
6a90: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
6aa0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
6ab0: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
6ac0: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
6ad0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
6ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6af0: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
6b00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6b10: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
6b20: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
6b30: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6b40: 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65  , zTemp, "collse
6b50: 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  q(%.20s)", pColl
6b60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
6b70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6b80: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
6b90: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
6ba0: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
6bb0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
6bc0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6bd0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6be0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
6bf0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
6c00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6c10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6c20: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
6c30: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6c40: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6c50: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
6c60: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
6c70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6c80: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
6c90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6ca0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6cb0: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
6cc0: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
6cd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6ce0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
6cf0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6d00: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6d10: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
6d20: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
6d30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6d40: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
6d50: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
6d60: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
6d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
6d80: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
6d90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
6da0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
6db0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
6dc0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
6dd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
6de0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6df0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
6e00: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
6e10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6e20: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6e30: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
6e40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6e50: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6e60: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
6e70: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
6e80: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
6e90: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
6ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6eb0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6ec0: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
6ed0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ee0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
6ef0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
6f00: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
6f10: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
6f20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6f30: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6f40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6f50: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
6f60: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
6f70: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
6f80: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
6f90: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
6fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6fb0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6fc0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
6fd0: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
6fe0: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
6ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7000: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
7010: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
7020: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7030: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7040: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
7050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7060: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
7070: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
7080: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7090: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
70a0: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
70b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
70c0: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
70d0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
70e0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
70f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7100: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7110: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
7120: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
7130: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
7140: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
7150: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
7160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7170: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
7180: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
7190: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
71a0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
71b0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
71c0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
71d0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
71e0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
71f0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
7200: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
7210: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
7220: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
7230: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
7240: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7250: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
7260: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
7270: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
7280: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
7290: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
72a0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
72b0: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
72c0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
72d0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
72e0: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
72f0: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
7300: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
7310: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
7320: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
7330: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
7340: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
7350: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
7360: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
7370: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
7380: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d  eMask)*8 );.  p-
7390: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28  >btreeMask |= ((
73a0: 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  yDbMask)1)<<i;. 
73b0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
73c0: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
73d0: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
73e0: 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c  pBt) ){.    p->l
73f0: 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62  ockMask |= ((yDb
7400: 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a  Mask)1)<<i;.  }.
7410: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
7420: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
7430: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
7440: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
7450: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
7460: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
7470: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
7480: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
7490: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
74a0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
74b0: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
74c0: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
74d0: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
74e0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
74f0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
7500: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
7510: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
7520: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
7530: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
7540: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
7550: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
7560: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
7570: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
7580: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
7590: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
75a0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
75b0: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
75c0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
75d0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
75e0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
75f0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
7600: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
7610: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
7620: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
7630: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
7640: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
7650: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
7660: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
7670: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
7680: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
7690: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
76a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
76b0: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
76c0: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
76d0: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
76e0: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
76f0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
7700: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
7710: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
7720: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
7730: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
7740: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
7750: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
7760: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
7770: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
7780: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
7790: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
77a0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
77b0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
77c0: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
77d0: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
77e0: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
77f0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
7800: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
7810: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
7820: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
7830: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
7840: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
7850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7860: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
7870: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79  p){.  int i;.  y
7880: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73  DbMask mask;.  s
7890: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
78a0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
78b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d  ;.  if( p->lockM
78c0: 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ask==0 ) return;
78d0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
78e0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
78f0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
7900: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
7910: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
7920: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62  0, mask=1; i<nDb
7930: 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d  ; i++, mask += m
7940: 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  ask){.    if( i!
7950: 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d  =1 && (mask & p-
7960: 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26  >lockMask)!=0 &&
7970: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
7980: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
7990: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
79a0: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
79b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
79c0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
79d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
79e0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
79f0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
7a00: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
7a10: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
7a20: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
7a30: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
7a40: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
7a50: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7a60: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
7a70: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7a80: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
7a90: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
7aa0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
7ab0: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
7ac0: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
7ad0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
7ae0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
7af0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
7b00: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
7b10: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
7b20: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
7b30: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
7b40: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
7b50: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
7b60: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
7b70: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
7b80: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
7b90: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
7ba0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
7bb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
7bc0: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
7bd0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
7be0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
7bf0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
7c00: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
7c10: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
7c20: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
7c30: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
7c40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7c50: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
7c60: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
7c70: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
7c80: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
7c90: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
7ca0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
7cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
7cc0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
7cd0: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
7ce0: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
7cf0: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
7d00: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
7d10: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
7d20: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
7d30: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
7d40: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7d50: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
7d60: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20  pOp, zP4, zCom, 
7d70: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23  sizeof(zCom));.#
7d80: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d  else.  zCom[0] =
7d90: 20 30 0a 23 65 6e 64 69 66 0a 20 20 66 70 72 69   0.#endif.  fpri
7da0: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
7db0: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
7dc0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
7dd0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
7de0: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
7df0: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
7e00: 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43  Op->p5,.      zC
7e10: 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  om.  );.  fflush
7e20: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
7e30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7e40: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
7e50: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
7e60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7e70: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
7e80: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
7e90: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
7ea0: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
7eb0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7ec0: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
7ed0: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
7ee0: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
7ef0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7f00: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
7f10: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
7f20: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
7f30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7f40: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7f60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7f70: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
7f80: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
7f90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
7fa0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
7fb0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7fc0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7fd0: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7fe0: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7ff0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
8000: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
8010: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
8020: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
8030: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
8040: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
8050: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
8060: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
8070: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
8080: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
8090: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
80a0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
80b0: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
80c0: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
80d0: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
80e0: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
80f0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
8100: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
8110: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
8120: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
8130: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
8140: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
8150: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
8160: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
8170: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
8180: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
8190: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
81a0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
81b0: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
81c0: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
81d0: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
81e0: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
81f0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
8200: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
8210: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
8220: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
8230: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
8240: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
8250: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
8260: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
8270: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
8280: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
8290: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
82a0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
82b0: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
82c0: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
82d0: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
82e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
82f0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
8300: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
8310: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
8320: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8330: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
8340: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
8350: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
8360: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
8370: 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20  = MEM_Invalid;. 
8380: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
8390: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
83a0: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
83b0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
83c0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
83d0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
83e0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
83f0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
8400: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
8410: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
8420: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
8430: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
8440: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
8450: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
8460: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
8470: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
8480: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
8490: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
84a0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
84b0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
84c0: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
84d0: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
84e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
84f0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
8500: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
8510: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
8520: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
8530: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
8540: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
8550: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
8560: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8570: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
8580: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
8590: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
85a0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
85b0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
85c0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
85d0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
85e0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
85f0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
8600: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
8610: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
8620: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
8630: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
8640: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
8650: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
8660: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
8670: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
8680: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
8690: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
86a0: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
86b0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
86c0: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
86d0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
86e0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
86f0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
8700: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
8710: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
8720: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
8730: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
8740: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8750: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
8760: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
8770: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
8780: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
8790: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
87a0: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
87b0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
87c0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
87d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
87e0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
8810: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8840: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
8850: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
8860: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
8870: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8890: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
88a0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
88b0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
88c0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
88d0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
88e0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
88f0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
8920: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
8930: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
8940: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8950: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
8960: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
8970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
89b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
89c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
89d0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
89e0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
89f0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
8a00: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
8a10: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
8a20: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
8a30: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
8a40: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
8a50: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
8a60: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
8a70: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
8a80: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
8a90: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
8aa0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
8ab0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8ac0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
8ad0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
8ae0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
8af0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
8b00: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
8b10: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
8b20: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
8b30: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
8b40: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
8b50: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
8b60: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
8b70: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
8b80: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
8b90: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
8ba0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
8bb0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
8bc0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
8bd0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8be0: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
8bf0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
8c00: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
8c10: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
8c20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
8c30: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8c40: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
8c50: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
8c60: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8c70: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
8c80: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8c90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
8ca0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
8cb0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
8cc0: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
8cd0: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
8ce0: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
8cf0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
8d00: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
8d10: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
8d20: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
8d30: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
8d40: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
8d50: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
8d60: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
8d70: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8d80: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
8d90: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
8da0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
8db0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
8dc0: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
8dd0: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
8de0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8df0: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
8e00: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
8e10: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
8e20: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
8e30: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
8e40: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
8e50: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
8e60: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
8e70: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
8e80: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
8e90: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
8ea0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
8eb0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
8ec0: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
8ed0: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
8ee0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
8ef0: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
8f00: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8f10: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
8f20: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
8f30: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
8f40: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
8f50: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
8f60: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
8f70: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
8f80: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
8f90: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
8fa0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
8fb0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8fc0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
8fd0: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
8fe0: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
8ff0: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
9000: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
9010: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
9020: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
9030: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
9040: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
9050: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
9060: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
9070: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
9080: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
9090: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
90a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
90b0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
90c0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
90d0: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
90e0: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
90f0: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
9100: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
9110: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
9120: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
9130: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
9140: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9150: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
9160: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
9170: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
9180: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
9190: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
91a0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
91b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
91c0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
91d0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
91e0: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
91f0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
9200: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
9210: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
9220: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
9230: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
9240: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
9250: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
9260: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
9270: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
9280: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
9290: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
92a0: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
92b0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
92c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
92d0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
92e0: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
92f0: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
9300: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
9310: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
9320: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
9330: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
9340: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
9350: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
9360: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
9370: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
9380: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
9390: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
93a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
93b0: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
93c0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
93d0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
93e0: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
93f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
9400: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
9410: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
9420: 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  R;.      pMem->u
9430: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
9460: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
9470: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
9480: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9490: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
94a0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
94b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
94c0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
94d0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
94e0: 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20  ode); /* Opcode 
94f0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9500: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
9510: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
9520: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9530: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
9540: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9550: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
9560: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
9570: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
9580: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  em++;..      /* 
9590: 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72  When an OP_Progr
95a0: 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  am opcode is enc
95b0: 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79  ounter (the only
95c0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73   opcode that has
95d0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  .      ** a P4_S
95e0: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
95f0: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
9600: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
9610: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
9620: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69  .      ** kept i
9630: 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74  n p->aMem[9].z t
9640: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70  o hold the new p
9650: 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e  rogram - assumin
9660: 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61  g this subprogra
9670: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  m.      ** has n
9680: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
9690: 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  seen..      */. 
96a0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
96b0: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
96c0: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RAM ){.        i
96d0: 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62  nt nByte = (nSub
96e0: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
96f0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
9700: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
9710: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
9720: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
9730: 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70   if( apSub[j]==p
9740: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  Op->p4.pProgram 
9750: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
9760: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
9770: 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45  ==nSub && SQLITE
9780: 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  _OK==sqlite3Vdbe
9790: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42  MemGrow(pSub, nB
97a0: 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b  yte, nSub!=0) ){
97b0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
97c0: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
97d0: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
97e0: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
97f0: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
9800: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20  ogram;.         
9810: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
9820: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
9830: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
9840: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
9850: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
9860: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
9870: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
9880: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
9890: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
98a0: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P1 */.    pMem-
98d0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
98e0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
98f0: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
9900: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
9910: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
9920: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
9950: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9960: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
9970: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
9980: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
9990: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
99a0: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
99d0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
99e0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
99f0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
9a00: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9a10: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32  MemGrow(pMem, 32
9a20: 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20  , 0) ){         
9a30: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
9a40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
9a50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9a60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9a70: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9a80: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
9a90: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
9aa0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
9ab0: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
9ac0: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
9ad0: 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34  32);.    if( zP4
9ae0: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
9af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
9b00: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50  mSetStr(pMem, zP
9b10: 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  4, -1, SQLITE_UT
9b20: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
9b30: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9b40: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
9b50: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
9b60: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9b70: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
9b80: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
9b90: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
9ba0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9bb0: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9bc0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
9bd0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9be0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9bf0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
9c00: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
9c10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9c20: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9c30: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
9c40: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
9c50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9c60: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9c70: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45  M_Dyn|MEM_Str|ME
9c80: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
9c90: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
9ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9cb0: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
9cc0: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
9cd0: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
9ce0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9cf0: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
9d00: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
9d10: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
9d20: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65  pMem++;.  .#ifde
9d30: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9d40: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9d50: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
9d60: 2c 20 35 30 30 2c 20 30 29 20 29 7b 0a 20 20 20  , 500, 0) ){.   
9d70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9d90: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
9da0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
9db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9dc0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9dd0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
9de0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
9df0: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
9e00: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
9e10: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
9e20: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
9e30: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
9e40: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
9e50: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
9e60: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
9e70: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
9e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9e90: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
9ea0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  nt */.      pMem
9eb0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9ec0: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  NULL;.#endif.   
9ed0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
9ee0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
9ef0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
9f00: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
9f10: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
9f20: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
9f30: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
9f40: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
9f50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
9f60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9f70: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
9f80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9f90: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
9fa0: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
9fb0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9fc0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
9fd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9fe0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
9ff0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
a000: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
a010: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
a020: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
a030: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
a040: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
a050: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
a060: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
a070: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
a080: 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
a090: 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  z;.    while( sq
a0a0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
a0b0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
a0c0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
a0d0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
a0e0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
a0f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
a100: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
a110: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
a120: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
a130: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
a140: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
a150: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
a160: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
a170: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
a180: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
a190: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
a1a0: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
a1b0: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
a1c0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
a1d0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
a1e0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
a1f0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
a200: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
a210: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
a220: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
a230: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
a240: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a250: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
a260: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
a270: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
a280: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
a290: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
a2a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
a2b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
a2c0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
a2d0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
a2e0: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
a2f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
a300: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
a310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a320: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
a330: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
a340: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
a350: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
a360: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
a370: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
a380: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
a390: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
a3a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
a3b0: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
a3c0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
a3d0: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
a3e0: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
a3f0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
a400: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
a410: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
a420: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
a430: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
a440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
a450: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
a460: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
a470: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
a480: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
a490: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
a4a0: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
a4b0: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
a4c0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
a4d0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
a4e0: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
a4f0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
a500: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
a510: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
a520: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
a530: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
a540: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
a550: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
a560: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
a570: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
a580: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
a590: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
a5a0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
a5b0: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
a5c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a5d0: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
a5e0: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
a5f0: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
a600: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
a610: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
a620: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
a630: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
a640: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
a650: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
a660: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
a670: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
a680: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
a690: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
a6a0: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
a6b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
a6c0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
a6d0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
a6e0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
a6f0: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
a700: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
a710: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
a720: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
a730: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
a740: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
a750: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
a760: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
a770: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
a780: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
a790: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
a7a0: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
a7b0: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
a7c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
a7d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
a7e0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
a7f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
a800: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
a810: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
a820: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
a830: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
a840: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
a850: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
a860: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
a870: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
a880: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
a890: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
a8a0: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
a8b0: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
a8c0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
a8d0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
a8e0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
a8f0: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
a900: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
a910: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
a920: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
a930: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
a940: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
a950: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
a960: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
a970: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
a980: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
a990: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
a9a0: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
a9b0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
a9c0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
a9d0: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
a9e0: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
a9f0: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
aa00: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
aa10: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
aa20: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
aa30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
aa40: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
aa50: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
aa60: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
aa70: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
aa80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
aa90: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
aaa0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
aab0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
aac0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
aad0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
aae0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
aaf0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
ab00: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
ab10: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
ab20: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
ab30: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
ab40: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
ab50: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
ab60: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
ab70: 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  1; i<p->nMem; i+
ab80: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
ab90: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
aba0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
abb0: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
abc0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
abd0: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
abe0: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
abf0: 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  t;.  p->magic = 
ac00: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
ac10: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
ac20: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
ac30: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
ac40: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
ac50: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
ac60: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
ac70: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
ac80: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
ac90: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
aca0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
acb0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
acc0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
acd0: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
ace0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
acf0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
ad00: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
ad10: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
ad20: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
ad30: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
ad40: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
ad50: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
ad60: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
ad70: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
ad80: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
ad90: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
ada0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
adb0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
adc0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
add0: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
ade0: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
adf0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
ae00: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
ae10: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
ae20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
ae30: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
ae40: 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68  t once on a each
ae50: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
ae60: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
ae70: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ae80: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
ae90: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
aea0: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
aeb0: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
aec0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
aed0: 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73  ed, futher calls
aee0: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
aef0: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
af00: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
af10: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
af20: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
af30: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
af40: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
af50: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
af60: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
af70: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
af80: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
af90: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
afa0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
afb0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
afc0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
afd0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
afe0: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
aff0: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
b000: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
b010: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
b020: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
b030: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
b040: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
b050: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
b060: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
b090: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
b0a0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
b0b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b0c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
b0d0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b0f0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
b100: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
b110: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b130: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
b140: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
b150: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
b160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b170: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
b180: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
b190: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b1b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
b1c0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
b1d0: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b200: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
b210: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
b220: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
b230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b240: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
b250: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
b260: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b290: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
b2c0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
b2d0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
b2e0: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b300: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
b310: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
b320: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
b350: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
b360: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
b370: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
b380: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
b390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b3a0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
b3b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
b3c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
b3d0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
b3e0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
b3f0: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
b400: 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
b410: 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
b420: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
b430: 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
b440: 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
b450: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
b460: 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72  ;.  nOnce = pPar
b470: 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  se->nOnce;.  if(
b480: 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63   nOnce==0 ) nOnc
b490: 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65  e = 1; /* Ensure
b4a0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
b4b0: 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c  te in p->aOnceFl
b4c0: 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ag[] */.  .  /* 
b4d0: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
b4e0: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
b4f0: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
b500: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
b510: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
b520: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
b530: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
b540: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
b550: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
b560: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
b570: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
b580: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
b590: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
b5a0: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
b5b0: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
b5c0: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
b5d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
b5e0: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
b5f0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
b600: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
b610: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
b620: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
b630: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
b640: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
b650: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
b660: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
b670: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
b680: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
b690: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
b6a0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
b6b0: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
b6c0: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
b6d0: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
b6e0: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
b6f0: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
b700: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
b710: 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f  guments in..  */
b720: 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26  .  zCsr = (u8*)&
b730: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20  p->aOp[p->nOp]; 
b740: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
b750: 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c  avaliable for al
b760: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45  location */.  zE
b770: 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  nd = (u8*)&p->aO
b780: 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20  p[p->nOpAlloc]; 
b790: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
b7a0: 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b  ast end of zCsr[
b7b0: 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ] */..  resolveP
b7c0: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
b7d0: 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
b7e0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
b7f0: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
b800: 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
b810: 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
b820: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
b830: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
b840: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
b850: 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20  .  memset(zCsr, 
b860: 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20  0, zEnd-zCsr);. 
b870: 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d   zCsr += (zCsr -
b880: 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73   (u8*)0)&7;.  as
b890: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
b8a0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29  _ALIGNMENT(zCsr)
b8b0: 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64   );.  p->expired
b8c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
b8d0: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
b8e0: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
b8f0: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
b900: 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20  located in two. 
b910: 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
b920: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
b930: 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
b940: 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20  unused space at 
b950: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
b960: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
b970: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
b980: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
b990: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
b9a0: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
b9b0: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
b9c0: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
b9d0: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
b9e0: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
b9f0: 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75  ll in the rest u
ba00: 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c  sing a fresh all
ba10: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
ba20: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
ba30: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
ba40: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
ba50: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
ba60: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
ba70: 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20   leftover space 
ba80: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ba90: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63  e opcode array c
baa0: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
bab0: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
bac0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
bad0: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
bae0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
baf0: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
bb00: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  nByte = 0;.    p
bb10: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
bb20: 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  ace(p->aMem, nMe
bb30: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  m*sizeof(Mem), &
bb40: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
bb50: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  te);.    p->aVar
bb60: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
bb70: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
bb80: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
bb90: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
bba0: 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
bbb0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72  locSpace(p->apAr
bbc0: 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
bbd0: 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  em*), &zCsr, zEn
bbe0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
bbf0: 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63  p->azVar = alloc
bc00: 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20  Space(p->azVar, 
bc10: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72  nVar*sizeof(char
bc20: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
bc30: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
bc40: 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
bc50: 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43  ace(p->apCsr, nC
bc60: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
bc70: 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20  eCursor*),.     
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64       &zCsr, zEnd
bca0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
bcb0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c  ->aOnceFlag = al
bcc0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63  locSpace(p->aOnc
bcd0: 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a  eFlag, nOnce, &z
bce0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
bcf0: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
bd00: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46  e ){.      p->pF
bd10: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
bd20: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
bd30: 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
bd40: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b  zCsr = p->pFree;
bd50: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73  .    zEnd = &zCs
bd60: 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69  r[nByte];.  }whi
bd70: 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62  le( nByte && !db
bd80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bd90: 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  ;..  p->nCursor 
bda0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e  = nCursor;.  p->
bdb0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63  nOnceFlag = nOnc
bdc0: 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72  e;.  if( p->aVar
bdd0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20   ){.    p->nVar 
bde0: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
bdf0: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
be00: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
be10: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
be20: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
be30: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
be40: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
be50: 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20  .  if( p->azVar 
be60: 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20  ){.    p->nzVar 
be70: 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  = pParse->nzVar;
be80: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
be90: 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a  zVar, pParse->az
bea0: 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69  Var, p->nzVar*si
beb0: 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d  zeof(p->azVar[0]
bec0: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  ));.    memset(p
bed0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c  Parse->azVar, 0,
bee0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73   pParse->nzVar*s
bef0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a  izeof(pParse->az
bf00: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  Var[0]));.  }.  
bf10: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
bf20: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65     /* aMem[] goe
bf50: 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a  s from 1..nMem *
bf60: 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  /.    p->nMem = 
bf70: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
bf80: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
bf90: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
bfa0: 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31  1 */.    for(n=1
bfb0: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
bfc0: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
bfd0: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ].flags = MEM_In
bfe0: 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 2d 3e  valid;.      p->
bff0: 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aMem[n].db = db;
c000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
c010: 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65  explain = pParse
c020: 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c  ->explain;.  sql
c030: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70  ite3VdbeRewind(p
c040: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
c050: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
c060: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
c070: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
c080: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
c090: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
c0a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c0b0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
c0c0: 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72  e *p, VdbeCursor
c0d0: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
c0e0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
c0f0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
c100: 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
c110: 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
c120: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
c130: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
c140: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
c150: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d  .    /* The pCx-
c160: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
c170: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
c180: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
c190: 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ts, by.    ** th
c1a0: 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
c1b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78  .  }else if( pCx
c1c0: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
c1d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
c1e0: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
c1f0: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
c200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c210: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
c220: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
c230: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
c240: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
c250: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
c260: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
c270: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
c280: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
c290: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
c2a0: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
c2b0: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70  ethod = 1;.    p
c2c0: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
c2d0: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20  VtabCursor);.   
c2e0: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
c2f0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
c300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
c310: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
c320: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
c330: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
c340: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
c350: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
c360: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
c370: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
c380: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
c390: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
c3a0: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
c3b0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
c3c0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
c3d0: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
c3e0: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
c3f0: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
c400: 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  .  v->aOnceFlag 
c410: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46  = pFrame->aOnceF
c420: 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46  lag;.  v->nOnceF
c430: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  lag = pFrame->nO
c440: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f  nceFlag;.  v->aO
c450: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
c460: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
c470: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
c480: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
c490: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
c4a0: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
c4b0: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
c4c0: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
c4d0: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
c4e0: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
c4f0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
c500: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
c510: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
c520: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
c530: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
c540: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
c550: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
c560: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
c570: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
c580: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
c590: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
c5a0: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
c5b0: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
c5c0: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
c5d0: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
c5e0: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
c5f0: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
c600: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
c610: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
c620: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
c630: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
c640: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
c650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
c660: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
c670: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
c680: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
c690: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
c6a0: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
c6b0: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
c6c0: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
c6d0: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
c6e0: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
c6f0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
c700: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20  e(pFrame);.  }. 
c710: 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
c720: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
c730: 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ..  if( p->apCsr
c740: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
c750: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
c760: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
c770: 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72        VdbeCursor
c780: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
c790: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  i];.      if( pC
c7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c7b0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
c7c0: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
c7d0: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
c7e0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
c7f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
c800: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
c810: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
c820: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  em[1], p->nMem);
c830: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
c840: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
c850: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
c860: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
c870: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
c880: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
c890: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
c8a0: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
c8b0: 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
c8c0: 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
c8d0: 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
c8e0: 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
c8f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
c900: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d  leteAuxData(p, -
c910: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
c920: 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
c930: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
c940: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
c950: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
c960: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c970: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
c980: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
c990: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
c9a0: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
c9b0: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
c9c0: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
c9d0: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
c9e0: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
c9f0: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
ca00: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
ca10: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
ca20: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
ca30: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
ca40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
ca50: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
ca60: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
ca70: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
ca80: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
ca90: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
caa0: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
cab0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
cac0: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
cad0: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
cae0: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
caf0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
cb00: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
cb10: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
cb20: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
cb30: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
cb40: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29  i<=p->nMem; i++)
cb50: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
cb60: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49  [i].flags==MEM_I
cb70: 6e 76 61 6c 69 64 20 29 3b 0a 20 20 7d 0a 23 65  nvalid );.  }.#e
cb80: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44  ndif..  sqlite3D
cb90: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
cba0: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
cbb0: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
cbc0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
cbd0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
cbe0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
cbf0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
cc00: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
cc10: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
cc20: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
cc30: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
cc40: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
cc50: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
cc60: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
cc70: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
cc80: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
cc90: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
cca0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
ccb0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
ccc0: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
ccd0: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
cce0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
ccf0: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
cd00: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
cd10: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
cd20: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
cd30: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
cd40: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
cd50: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
cd60: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
cd70: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
cd80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
cd90: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
cda0: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
cdb0: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
cdc0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
cdd0: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
cde0: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
cdf0: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
ce00: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ce10: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
ce20: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
ce30: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
ce40: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
ce50: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
ce60: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
ce70: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
ce80: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
ce90: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
cea0: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
ceb0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
cec0: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
ced0: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
cee0: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
cef0: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
cf00: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
cf10: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
cf20: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
cf30: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
cf40: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
cf50: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
cf60: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
cf70: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
cf80: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
cf90: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
cfa0: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
cfb0: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
cfc0: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
cfd0: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
cfe0: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
cff0: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
d000: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
d010: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
d020: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
d030: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
d040: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
d050: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
d060: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d070: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d090: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
d0a0: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
d0b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d0e0: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
d0f0: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
d100: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
d130: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
d140: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
d150: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
d160: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
d170: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
d180: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
d190: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
d1a0: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
d1b0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
d1c0: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
d1d0: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
d1e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
d1f0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
d200: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
d210: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
d220: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
d230: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
d240: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d250: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d260: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
d270: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
d280: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d290: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d2a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
d2b0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
d2c0: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
d2d0: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
d2e0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
d2f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
d300: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
d310: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
d320: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
d330: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
d340: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
d350: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
d360: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
d370: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d380: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
d390: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
d3a0: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
d3b0: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
d3c0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
d3d0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
d3e0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
d3f0: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
d400: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
d410: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d420: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
d430: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
d440: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
d450: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
d460: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
d470: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
d480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d490: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
d4a0: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
d4b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
d4c0: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
d4d0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
d4e0: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
d4f0: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
d500: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
d510: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d520: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
d530: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
d540: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d550: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
d560: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
d570: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
d580: 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
d590: 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
d5a0: 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
d5b0: 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
d5c0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d5d0: 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
d5e0: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
d5f0: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
d600: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
d610: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
d620: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
d630: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
d640: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
d650: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
d660: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
d670: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
d680: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
d690: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d6a0: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
d6b0: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
d6c0: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
d6d0: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
d6e0: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
d6f0: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
d700: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
d710: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
d720: 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
d730: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
d740: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
d750: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
d760: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
d770: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
d780: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
d790: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
d7a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
d7b0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
d7c0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
d7d0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
d7e0: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
d7f0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
d800: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
d810: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
d820: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
d830: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
d840: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
d850: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
d860: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
d870: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
d880: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d890: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
d8a0: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
d8b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d8c0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
d8d0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
d8e0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
d8f0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
d900: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
d910: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
d920: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
d930: 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  nter(pBt);.     
d940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d950: 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
d960: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
d970: 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73  r(pBt));.      s
d980: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
d990: 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
d9a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d9b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
d9c0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
d9d0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
d9e0: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
d9f0: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
da00: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
da10: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
da20: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
da30: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
da40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
da50: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
da60: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
da70: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
da80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
da90: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
daa0: 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a  MMITHOOK;.    }.
dab0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
dac0: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
dad0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
dae0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
daf0: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
db00: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
db10: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
db20: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
db30: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
db40: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
db50: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
db60: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
db70: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
db80: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
db90: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
dba0: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
dbb0: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
dbc0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
dbd0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
dbe0: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
dbf0: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
dc00: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
dc10: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
dc20: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
dc30: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
dc40: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
dc50: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
dc60: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
dc70: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
dc80: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
dc90: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
dca0: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
dcb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
dcc0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
dcd0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
dce0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
dcf0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
dd00: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
dd10: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
dd20: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
dd30: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
dd40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dd50: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
dd60: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
dd70: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
dd80: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
dd90: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
dda0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
ddb0: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
ddc0: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
ddd0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
dde0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
ddf0: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
de00: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
de10: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
de20: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
de30: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
de40: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
de50: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
de60: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
de70: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
de80: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
de90: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
dea0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
deb0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
dec0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
ded0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
dee0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
def0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df00: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
df10: 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
df20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
df30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
df40: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
df50: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
df60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
df70: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
df80: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
df90: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
dfa0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
dfb0: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
dfc0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
dfd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
dfe0: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
dff0: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
e000: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
e010: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
e020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
e030: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
e040: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
e050: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
e060: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
e070: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
e080: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
e090: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
e0a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e0b0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
e0c0: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
e0d0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
e0e0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
e0f0: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
e100: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
e110: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
e120: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
e130: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
e140: 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
e150: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
e160: 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
e170: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
e180: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
e190: 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
e1a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e1b0: 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
e1c0: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
e1d0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e1e0: 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
e1f0: 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
e200: 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
e210: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e220: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a  NOMEM;.    do {.
e230: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
e240: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
e250: 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
e260: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
e270: 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
e280: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
e290: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
e2a0: 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
e2b0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
e2c0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e2d0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
e2e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
e2f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
e300: 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
e310: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
e320: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
e330: 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
e340: 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
e350: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
e360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e370: 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
e380: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
e390: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
e3a0: 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
e3b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e3c0: 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
e3d0: 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
e3e0: 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
e3f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
e420: 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
e430: 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
e440: 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
e450: 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
e460: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e470: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
e480: 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
e490: 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
e4a0: 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
e4b0: 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
e4c0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
e4d0: 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
e4e0: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
e4f0: 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
e500: 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
e510: 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
e520: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e530: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e540: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
e550: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
e560: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
e570: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
e580: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e590: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
e5a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e5b0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
e5c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e5d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
e5e0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
e5f0: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
e600: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
e610: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
e620: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
e630: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
e640: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
e650: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
e660: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
e670: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
e680: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
e690: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e6a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e6b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e6c0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e6d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e6e0: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
e6f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
e700: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
e710: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
e720: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
e730: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
e740: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
e750: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
e760: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
e770: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
e780: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e790: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
e7a0: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
e7b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
e7c0: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
e7d0: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
e7e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
e7f0: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
e800: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
e810: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
e820: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
e830: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
e840: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e850: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e860: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e870: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e880: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e890: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
e8a0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
e8b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
e8c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
e8d0: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
e8e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
e8f0: 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
e900: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
e910: 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
e920: 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
e930: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
e940: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
e950: 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
e960: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
e970: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
e980: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
e990: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
e9a0: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
e9b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
e9c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e9d0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
e9e0: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
e9f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
ea00: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
ea10: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
ea20: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ea30: 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
ea40: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ea50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ea60: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
ea70: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
ea80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ea90: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
eaa0: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
eab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
eac0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
ead0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
eae0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
eaf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
eb00: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
eb10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
eb20: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
eb30: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
eb40: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
eb50: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
eb60: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
eb70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
eb80: 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d  Sync .     && 0=
eb90: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
eba0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ebb0: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
ebc0: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
ebd0: 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
ebe0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
ebf0: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
ec00: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
ec10: 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
ec20: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
ec30: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
ec40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
ec50: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
ec60: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
ec70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ec80: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
ec90: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
eca0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
ecb0: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
ecc0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
ecd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
ece0: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
ecf0: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
ed00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
ed10: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
ed20: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
ed30: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
ed40: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
ed50: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
ed60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ed70: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
ed80: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
ed90: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
eda0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
edb0: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
edc0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
edd0: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
ede0: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
edf0: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
ee00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ee10: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
ee20: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
ee30: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
ee40: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
ee50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ee60: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
ee70: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
ee80: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
ee90: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
eea0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
eeb0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
eec0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
eed0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
eee0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
eef0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ef00: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ef10: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ef20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
ef30: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
ef40: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
ef50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ef60: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
ef70: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
ef80: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ef90: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
efa0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
efb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
efc0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
efd0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
efe0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
eff0: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
f000: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f010: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
f020: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
f030: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
f040: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
f050: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
f060: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
f070: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
f080: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
f090: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
f0a0: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
f0b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f0c0: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
f0d0: 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
f0e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f0f0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f100: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
f110: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
f120: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f130: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
f140: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
f150: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
f160: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
f170: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
f180: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
f190: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
f1a0: 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
f1b0: 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
f1c0: 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
f1d0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
f1e0: 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
f1f0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
f200: 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
f210: 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
f220: 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
f230: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
f240: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
f250: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
f260: 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
f270: 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
f280: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
f290: 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
f2a0: 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
f2b0: 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
f2c0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
f2d0: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
f2e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
f2f0: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
f300: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
f310: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
f320: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
f330: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f340: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
f350: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
f360: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
f370: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
f380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
f390: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
f3a0: 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
f3b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
f3c0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
f3d0: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
f3e0: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
f3f0: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
f400: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
f410: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
f420: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f430: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
f440: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
f450: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
f460: 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
f470: 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
f480: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
f490: 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
f4a0: 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
f4b0: 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
f4c0: 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
f4d0: 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
f4e0: 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
f4f0: 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
f500: 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
f510: 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
f520: 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
f530: 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
f540: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
f550: 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
f560: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
f570: 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
f580: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
f590: 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
f5a0: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
f5b0: 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
f5c0: 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
f5d0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
f5e0: 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
f5f0: 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
f600: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
f610: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
f620: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
f630: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
f640: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
f650: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
f660: 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
f670: 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
f680: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
f690: 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
f6a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
f6b0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
f6c0: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
f6d0: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
f6e0: 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
f6f0: 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
f700: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
f710: 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
f720: 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
f730: 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
f740: 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
f750: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
f760: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
f770: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
f780: 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
f790: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
f7a0: 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
f7b0: 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
f7c0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
f7d0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f7e0: 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
f7f0: 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
f800: 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
f810: 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
f820: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
f830: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
f840: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
f850: 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
f860: 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
f870: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
f880: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
f890: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
f8a0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
f8b0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
f8c0: 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
f8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f8e0: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
f8f0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
f900: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
f910: 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
f920: 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
f930: 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
f940: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
f950: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f960: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
f970: 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
f980: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
f990: 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
f9a0: 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
f9b0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f9c0: 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
f9d0: 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
f9e0: 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
f9f0: 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
fa00: 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
fa10: 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61  ave occurred, ca
fa20: 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e  using an emergen
fa30: 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a  cy rollback..  *
fa40: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  * In this case (
fa50: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
fa60: 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  0), and there is
fa70: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a   nothing to do..
fa80: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e    */.  if( db->n
fa90: 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e  Statement && p->
faa0: 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  iStatement ){.  
fab0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
fac0: 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
fad0: 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
fae0: 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t-1;..    assert
faf0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
fb00: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
fb10: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
fb20: 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ASE);.    assert
fb30: 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
fb40: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
fb50: 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d  ( p->iStatement=
fb60: 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  =(db->nStatement
fb70: 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  +db->nSavepoint)
fb80: 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   );..    for(i=0
fb90: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
fba0: 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ){ .      int rc
fbb0: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
fbc0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
fbd0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
fbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
fbf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  ){.        if( e
fc00: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
fc10: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
fc20: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
fc30: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
fc40: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
fc50: 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
fc60: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
fc70: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d          if( rc2=
fc80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fc90: 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
fca0: 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
fcb0: 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
fcc0: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
fcd0: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
fce0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
fcf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fd00: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
fd10: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
fd20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fd30: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d  db->nStatement--
fd40: 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d  ;.    p->iStatem
fd50: 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ent = 0;..    if
fd60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fd70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
fd80: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
fd90: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
fda0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
fdb0: 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
fdc0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
fdd0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
fde0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fdf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fe00: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fe10: 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
fe20: 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
fe30: 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
fe40: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
fe50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
fe60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
fe70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
fe80: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
fe90: 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
fea0: 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
feb0: 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
fec0: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
fed0: 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
fee0: 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
fef0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
ff00: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
ff10: 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
ff20: 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
ff30: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
ff40: 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
ff50: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
ff60: 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
ff70: 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
ff80: 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
ff90: 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
ffa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ffb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ffc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ffd0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
ffe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
fff0: 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
10000 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
10010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10020 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
10030 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
10040 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
10050 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
10060 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10070 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
10080 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
10090 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
100a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
100b0 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
100c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
100d0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
100e0 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
100f0 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
10100 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
10110 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
10120 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
10130 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
10140 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10150 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
10160 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
10170 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
10180 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
10190 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
101a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
101b0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
101c0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
101d0 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
101e0 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
101f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10200 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
10210 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
10220 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
10230 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
10240 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
10250 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
10260 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
10270 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
10280 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
10290 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
102a0 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
102b0 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
102c0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
102d0 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
102e0 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  b, "foreign key 
102f0 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
10300 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
10310 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
10320 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
10330 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
10340 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10350 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
10360 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
10370 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
10380 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
10390 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
103a0 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
103b0 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
103c0 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
103d0 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
103e0 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
103f0 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
10400 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
10410 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
10420 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
10430 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
10440 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
10450 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
10460 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
10470 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
10480 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
10490 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
104a0 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
104b0 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
104c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
104d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
104e0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
104f0 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
10500 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
10510 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
10520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
10530 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
10540 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
10550 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
10560 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
10570 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
10580 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
10590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
105a0 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
105b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
105e0 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
105f0 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
10600 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
10610 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
10620 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
10630 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
10640 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
10650 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
10660 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
10670 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
10680 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
10690 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
106a0 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
106b0 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
106c0 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
106d0 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
106e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
106f0 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
10700 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
10710 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
10720 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
10730 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
10740 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
10750 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
10760 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
10770 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
10780 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
10790 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
107a0 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
107b0 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
107c0 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
107d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
107e0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
107f0 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
10800 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
10810 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
10820 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
10830 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
10840 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
10850 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
10860 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
10870 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
10880 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d  p->aOnceFlag ) m
10890 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c  emset(p->aOnceFl
108a0 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46  ag, 0, p->nOnceF
108b0 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c  lag);.  closeAll
108c0 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
108d0 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
108e0 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
108f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10900 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
10910 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
10920 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
10930 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
10940 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
10950 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
10960 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
10970 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
10980 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
10990 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
109a0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
109b0 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
109c0 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
109d0 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
109e0 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
109f0 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
10a00 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
10a10 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
10a20 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
10a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10a40 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
10a50 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
10a60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
10a70 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
10a80 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
10a90 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
10aa0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
10ab0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
10ac0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
10ad0 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
10ae0 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
10af0 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xff;.    assert(
10b00 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49   p->rc!=SQLITE_I
10b10 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20  OERR_BLOCKED ); 
10b20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e   /* This error n
10b30 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20  o longer exists 
10b40 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  */.    isSpecial
10b50 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
10b60 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
10b70 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
10ba0 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
10bb0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
10bc0 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
10bd0 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
10be0 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
10bf0 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
10c00 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
10c10 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
10c20 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
10c30 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
10c40 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
10c50 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
10c60 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
10c70 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
10c80 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
10c90 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
10ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10cb0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
10cc0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
10cd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10ce0 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
10cf0 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
10d00 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
10d10 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
10d20 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
10d30 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
10d40 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
10d50 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
10d60 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
10d70 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72  ccurred while wr
10d80 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
10d90 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
10da0 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
10db0 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
10dc0 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
10dd0 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
10de0 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
10df0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
10e00 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
10e10 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
10e20 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
10e30 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
10e40 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
10e50 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
10e60 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
10e70 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
10e80 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
10e90 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
10ea0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
10eb0 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
10ec0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
10ed0 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
10ee0 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
10ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
10f00 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
10f10 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
10f20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10f30 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
10f40 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
10f50 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
10f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
10f70 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
10f80 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
10f90 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
10fa0 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
10fb0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
10fc0 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
10fd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
10fe0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
10ff0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
11000 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
11010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11020 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
11030 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
11040 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
11050 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
11060 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11070 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
11080 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
11090 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
110a0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
110b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
110c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
110d0 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
110e0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
110f0 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
11100 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
11110 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
11120 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
11130 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
11140 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
11150 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
11160 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
11170 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
11180 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
11190 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
111a0 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
111b0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
111c0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
111d0 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
111e0 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
111f0 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
11200 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
11210 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
11220 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
11230 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  & db->nVdbeWrite
11240 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
11250 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
11260 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11270 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
11280 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
11290 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
112a0 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
112b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
112c0 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
112d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
112e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
112f0 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
11300 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
11310 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
11320 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
11330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
11340 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
11350 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
11360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
11370 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11380 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
11390 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
113a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
113b0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
113c0 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20   true, the vdbe 
113d0 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63  program was succ
113e0 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20  essful .        
113f0 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
11400 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
11410 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
11420 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
11430 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20  reign.          
11440 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  ** key constrain
11450 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68  ts to hold up th
11460 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
11470 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
11480 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  it .          **
11490 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
114a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
114b0 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
114c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
114d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
114e0 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72  ITE_BUSY && p->r
114f0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
11500 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11510 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
11520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11530 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
11540 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
11550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11560 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
11570 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11580 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
11590 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
115a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
115b0 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
115c0 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
115d0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
115e0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
115f0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
11600 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
11610 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20  _DeferFKs;.     
11620 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
11630 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
11640 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
11650 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11660 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11670 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
11680 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d  ITE_OK);.      }
11690 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
116a0 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
116b0 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
116c0 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
116d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
116e0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
116f0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
11700 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
11710 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
11720 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
11730 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
11740 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
11750 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
11760 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
11770 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
11780 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
11790 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
117a0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
117b0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
117c0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
117d0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
117e0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
117f0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
11800 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
11810 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
11820 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
11830 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
11840 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
11850 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
11860 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
11870 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
11880 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
11890 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
118a0 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
118b0 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
118c0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
118d0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
118e0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
118f0 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
11900 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
11910 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
11920 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
11930 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20  en promote the. 
11940 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74     ** current st
11950 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f  atement error co
11960 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
11970 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  f( eStatementOp 
11980 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
11990 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
119a0 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74  atement(p, eStat
119b0 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20  ementOp);.      
119c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
119d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
119e0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63  ITE_OK || (p->rc
119f0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
11a00 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20  ONSTRAINT ){.   
11a10 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
11a20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
11a30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11a40 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
11a50 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
11a60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
11a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11a80 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
11a90 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
11aa0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
11ab0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
11ac0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
11ad0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11ae0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
11af0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
11b00 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
11b10 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
11b20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
11b30 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11b40 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
11b50 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
11b60 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
11b70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11b80 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
11b90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11ba0 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
11bb0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
11bc0 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
11bd0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
11be0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11bf0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
11c00 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
11c10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11c20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
11c30 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
11c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11c50 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
11c60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
11c70 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
11c80 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
11c90 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
11ca0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
11cb0 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
11cc0 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
11cd0 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
11ce0 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
11cf0 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
11d00 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
11d10 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  --;.    if( !p->
11d20 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e  readOnly ) db->n
11d30 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20  VdbeWrite--;.   
11d40 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
11d50 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  r ) db->nVdbeRea
11d60 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d--;.    assert(
11d70 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
11d80 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  >=db->nVdbeRead 
11d90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
11da0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62  b->nVdbeRead>=db
11db0 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
11dc0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
11dd0 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b  nVdbeWrite>=0 );
11de0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
11df0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
11e00 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
11e10 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
11e20 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
11e30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
11e40 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
11e50 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
11e60 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
11e70 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
11e80 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
11e90 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
11ea0 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
11eb0 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
11ec0 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
11ed0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
11ee0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
11ef0 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
11f00 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
11f10 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
11f20 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
11f30 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
11f40 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
11f50 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
11f60 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
11f70 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
11f80 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d  eActive>0 || db-
11f90 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
11fa0 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  | db->nStatement
11fb0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11fc0 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42  (p->rc==SQLITE_B
11fd0 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  USY ? SQLITE_BUS
11fe0 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  Y : SQLITE_OK);.
11ff0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
12000 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
12010 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
12020 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
12030 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
12040 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
12050 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
12060 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
12070 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
12080 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
12090 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
120a0 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
120b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
120c0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65  /*.** Copy the e
120d0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
120e0 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f  ror message belo
120f0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42  nging to the VDB
12100 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  E passed.** as t
12110 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
12120 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73  t to its databas
12130 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61  e handle (so tha
12140 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a  t they will be .
12150 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63  ** returned by c
12160 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
12170 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71  errcode() and sq
12180 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e  lite3_errmsg()).
12190 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
121a0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c  tion does not cl
121b0 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72  ear the VDBE err
121c0 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61  or code or messa
121d0 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69  ge, just.** copi
121e0 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64  es them to the d
121f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
12200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
12210 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
12220 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
12230 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
12240 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
12250 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  c;.  if( p->zErr
12260 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61  Msg ){.    u8 ma
12270 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d  llocFailed = db-
12280 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
12290 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
122a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
122b0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
122c0 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
122d0 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
122e0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
122f0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
12300 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
12310 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
12320 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
12330 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65  ed = mallocFaile
12340 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  d;.    db->errCo
12350 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65  de = rc;.  }else
12360 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12370 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
12380 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12390 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
123a0 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f  _ENABLE_SQLLOG./
123b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54  *.** If an SQLIT
123c0 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20  E_CONFIG_SQLLOG 
123d0 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72  hook is register
123e0 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61  ed and the VM ha
123f0 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20  s been run, .** 
12400 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74  invoke it..*/.st
12410 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
12420 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20  vokeSqllog(Vdbe 
12430 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *v){.  if( sqlit
12440 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
12450 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d  Sqllog && v->rc=
12460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d  =SQLITE_OK && v-
12470 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d  >zSql && v->pc>=
12480 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
12490 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74  Expanded = sqlit
124a0 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28  e3VdbeExpandSql(
124b0 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20  v, v->zSql);.   
124c0 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e   assert( v->db->
124d0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
124e0 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65      if( zExpande
124f0 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
12500 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
12510 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20  Sqllog(.        
12520 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
12530 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
12540 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  , v->db, zExpand
12550 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20  ed, 1.      );. 
12560 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
12570 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  ee(v->db, zExpan
12580 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ded);.    }.  }.
12590 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
125a0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
125b0 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g(x).#endif../*.
125c0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
125d0 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
125e0 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
125f0 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
12600 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
12610 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
12620 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
12630 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
12640 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
12650 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
12660 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
12670 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
12680 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
12690 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
126a0 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
126b0 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
126c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
126d0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
126e0 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
126f0 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
12700 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
12710 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
12720 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
12730 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
12740 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
12750 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
12760 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
12770 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
12780 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
12790 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
127a0 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
127b0 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
127c0 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
127d0 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
127e0 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
127f0 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
12800 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
12810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
12820 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
12830 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
12840 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
12850 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
12860 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
12870 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
12880 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
12890 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
128a0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
128b0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
128c0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
128d0 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
128e0 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
128f0 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
12900 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
12910 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
12920 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
12930 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
12940 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
12950 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
12960 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
12970 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
12980 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
12990 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
129a0 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(p);.    sqlite
129b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
129c0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
129d0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
129e0 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f   if( p->runOnlyO
129f0 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64  nce ) p->expired
12a00 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
12a10 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
12a20 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
12a30 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
12a40 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
12a50 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
12a60 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
12a70 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
12a80 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
12a90 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
12aa0 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
12ab0 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
12ac0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
12ad0 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
12ae0 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
12af0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
12b00 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
12b10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
12b20 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
12b30 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
12b40 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
12b50 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
12b60 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  T);.    sqlite3D
12b70 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
12b80 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
12b90 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
12ba0 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
12bb0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
12bc0 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
12bd0 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
12be0 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
12bf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
12c00 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
12c10 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
12c20 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
12c30 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
12c40 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
12c50 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
12c60 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
12c70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
12c80 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
12c90 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
12ca0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
12cb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
12cc0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
12cd0 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
12ce0 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
12cf0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
12d00 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
12d10 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
12d20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
12d30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
12d40 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
12d50 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
12d60 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
12d70 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
12d80 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
12d90 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
12da0 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
12db0 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
12dc0 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
12dd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12de0 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
12df0 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
12e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12e10 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
12e20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
12e30 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65   p->iCurrentTime
12e40 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = 0;.  p->magic
12e50 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
12e60 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
12e70 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
12e80 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
12e90 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
12ea0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
12eb0 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
12ec0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12ed0 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
12ee0 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
12ef0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
12f00 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
12f10 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
12f20 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
12f30 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
12f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12f50 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
12f60 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
12f70 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
12f80 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
12f90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12fa0 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
12fb0 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
12fc0 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
12fd0 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
12fe0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
12ff0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13000 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
13010 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
13020 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
13030 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
13040 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
13050 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
13060 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
13070 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
13080 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
13090 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
130a0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
130b0 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
130c0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
130d0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
130e0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
130f0 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
13100 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
13110 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
13120 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
13130 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
13140 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
13150 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
13160 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
13170 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
13180 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
13190 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
131a0 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
131b0 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
131c0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
131d0 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
131e0 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
131f0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
13200 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
13210 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
13220 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
13230 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
13240 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
13250 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
13260 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
13270 6f 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74  orrsponds to bit
13280 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69   0 etc.)..*/.voi
13290 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
132a0 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20  eteAuxData(Vdbe 
132b0 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c  *pVdbe, int iOp,
132c0 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75   int mask){.  Au
132d0 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56  xData **pp = &pV
132e0 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20  dbe->pAuxData;. 
132f0 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
13300 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
13310 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
13320 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
13330 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20  (pAux->iOp==iOp 
13340 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33  && (pAux->iArg>3
13350 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 28 28  1 || !(mask & ((
13360 75 33 32 29 31 3c 3c 70 41 75 78 2d 3e 69 41 72  u32)1<<pAux->iAr
13370 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
13380 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
13390 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
133a0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
133b0 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
133c0 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
133d0 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
133e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
133f0 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
13400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13410 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
13420 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
13430 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
13440 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
13450 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
13460 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
13470 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
13480 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
13490 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
134a0 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
134b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
134c0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
134d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
134e0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
134f0 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
13500 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
13510 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
13520 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
13530 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
13540 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
13550 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13560 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
13570 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
13580 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
13590 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
135a0 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
135b0 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
135c0 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
135d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
135e0 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
135f0 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
13600 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
13610 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
13620 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
13630 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
13640 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
13650 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
13660 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
13670 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
13680 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
13690 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
136a0 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
136b0 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
136c0 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
136d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
136e0 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
136f0 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
13700 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
13710 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13720 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
13730 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
13740 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
13750 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
13760 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62  Free(db, p->aLab
13770 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  el);.  sqlite3Db
13780 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
13790 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
137a0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
137b0 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
137c0 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
137d0 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  e);.#if defined(
137e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
137f0 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71  EE_EXPLAIN).  sq
13800 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13810 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  p->zExplain);.  
13820 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13830 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a  , p->pExplain);.
13840 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
13850 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
13860 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
13870 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
13880 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
13890 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
138a0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
138b0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
138c0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
138d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
138e0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
138f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
13900 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
13910 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
13920 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
13930 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
13940 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
13950 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
13960 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
13970 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
13980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
13990 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
139a0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
139b0 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
139c0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
139d0 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
139e0 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
139f0 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
13a00 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
13a10 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
13a20 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
13a30 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
13a40 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
13a50 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
13a60 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
13a70 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
13a80 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
13a90 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
13aa0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
13ab0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
13ac0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
13ad0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
13ae0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
13af0 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
13b00 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
13b10 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
13b20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
13b30 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
13b40 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
13b50 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
13b60 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
13b70 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
13b80 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
13b90 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
13ba0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
13bb0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
13bc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
13bd0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
13be0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
13bf0 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
13c00 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
13c10 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
13c20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
13c30 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
13c40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13c50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
13c60 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
13c70 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
13c80 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
13c90 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
13ca0 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
13cb0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
13cc0 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
13cd0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
13ce0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
13cf0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
13d00 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
13d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13d20 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
13d30 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
13d40 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
13d50 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
13d60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13d70 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
13d80 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
13d90 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72  arget;.    if( r
13da0 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
13db0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13dc0 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  PT;.    p->rowid
13dd0 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66  IsValid = 1;.#if
13de0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
13df0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
13e00 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
13e10 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
13e20 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
13e30 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
13e40 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
13e50 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
13e60 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  YS(p->pCursor) )
13e70 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
13e80 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
13e90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
13ea0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
13eb0 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
13ec0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
13ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13ee0 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
13ef0 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
13f00 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
13f10 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
13f20 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
13f30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13f40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13f50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
13f60 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
13f70 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13f80 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
13f90 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13fa0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
13fb0 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
13fc0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
13fd0 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
13fe0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
13ff0 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
14000 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
14010 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
14020 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
14030 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
14040 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
14050 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
14060 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
14070 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
14080 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
14090 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
140a0 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
140b0 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
140c0 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
140d0 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
140e0 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
140f0 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
14100 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
14110 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
14120 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
14130 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
14140 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
14150 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
14160 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
14170 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
14180 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
14190 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
141a0 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
141b0 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
141c0 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
141d0 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
141e0 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
141f0 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
14200 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
14210 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
14220 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
14230 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14240 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
14250 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
14260 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
14270 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
14280 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
14290 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
142a0 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
142b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
142c0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
142d0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
142e0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14300 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
14310 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
14340 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
14350 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
14370 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
14380 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
14390 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
143a0 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
143b0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
143c0 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
143f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
14400 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
14410 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
14420 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
14430 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
14440 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
14450 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
14460 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
14470 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
144a0 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
144b0 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
144c0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
144d0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
144e0 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
14510 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
14520 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
14550 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
14560 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
14570 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
14580 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
14590 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
145a0 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
145b0 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
145c0 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
145d0 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
145e0 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
145f0 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
14600 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
14610 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
14620 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
14630 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
14640 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
14650 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
14660 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
14670 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
14680 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
14690 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
146a0 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
146b0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
146c0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
146d0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
146e0 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
146f0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
14700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
14710 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
14720 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
14730 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
14740 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
14750 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
14760 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
14770 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
14780 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
14790 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
147a0 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
147b0 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
147c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28  ){.      if( i<(
147d0 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65  -MAX_6BYTE) ) re
147e0 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a  turn 6;.      /*
147f0 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70   Previous test p
14800 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28  revents:  u = -(
14810 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
14820 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75  5808) */.      u
14830 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = -i;.    }else
14840 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
14850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
14860 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74  127 ){.      ret
14870 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26  urn ((i&1)==i &&
14880 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29   file_format>=4)
14890 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b   ? 8+(u32)u : 1;
148a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
148b0 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
148c0 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
148d0 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
148e0 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
148f0 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
14900 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
14910 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
14920 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
14930 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
14940 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
14950 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
14960 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
14970 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
14980 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
14990 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
149a0 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
149b0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
149c0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
149d0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
149e0 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
149f0 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
14a00 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
14a10 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
14a20 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
14a30 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
14a40 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
14a50 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
14a60 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
14a70 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
14a80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14a90 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
14aa0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
14ab0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
14ac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
14ad0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
14ae0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
14af0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
14b00 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
14b10 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
14b20 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
14b30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
14b40 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
14b50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
14b60 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
14b70 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
14b80 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
14b90 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
14ba0 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
14bb0 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
14bc0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
14bd0 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
14be0 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
14bf0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
14c00 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
14c10 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
14c20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
14c30 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
14c40 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
14c50 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
14c60 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
14c70 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
14c80 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
14c90 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
14ca0 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
14cb0 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
14cc0 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
14cd0 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
14ce0 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
14cf0 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
14d00 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
14d10 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
14d20 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
14d30 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
14d40 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
14d50 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
14d60 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
14d70 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
14d80 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
14d90 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
14da0 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
14db0 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
14dc0 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
14dd0 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
14de0 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
14df0 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
14e00 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
14e10 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
14e20 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
14e30 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
14e40 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
14e50 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
14e60 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
14e70 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
14e80 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
14e90 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
14ea0 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
14eb0 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
14ec0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
14ed0 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
14ee0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
14ef0 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
14f00 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
14f10 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
14f20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
14f30 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
14f40 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
14f50 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
14f60 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
14f70 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
14f80 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
14f90 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
14fa0 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
14fb0 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
14fc0 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
14fd0 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
14fe0 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
14ff0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
15000 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
15010 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
15020 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
15030 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
15040 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
15050 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
15060 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
15070 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
15080 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
15090 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
150a0 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
150b0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
150c0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
150d0 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
150e0 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
150f0 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
15100 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
15110 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
15120 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
15130 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
15140 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
15150 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
15160 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
15170 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
15180 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
15190 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
151a0 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
151b0 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
151c0 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
151d0 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
151e0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
151f0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
15200 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
15210 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
15220 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
15230 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
15240 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
15250 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
15260 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
15270 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
15280 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
15290 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
152a0 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
152b0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
152c0 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
152d0 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
152e0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
152f0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
15300 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
15310 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
15320 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
15330 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
15340 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
15350 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
15360 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
15370 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
15380 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
15390 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
153a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
153b0 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
153c0 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
153d0 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
153e0 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
153f0 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
15400 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
15410 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
15420 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
15430 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
15440 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
15450 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
15460 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
15470 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
15480 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
15490 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
154a0 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
154b0 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
154c0 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
154d0 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
154e0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
154f0 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
15500 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
15510 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
15520 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
15530 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
15540 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
15550 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
15560 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
15570 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
15580 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
15590 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
155a0 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
155b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
155c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
155d0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
155e0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
155f0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
15600 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
15610 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
15620 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
15630 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
15640 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
15650 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
15660 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
15670 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
15680 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
15690 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
156a0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
156b0 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
156c0 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
156d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
156e0 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
156f0 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
15700 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
15710 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
15720 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
15730 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
15740 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
15750 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
15760 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
15770 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
15780 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
15790 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
157a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
157b0 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
157c0 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
157d0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
157e0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
157f0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
15800 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
15810 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
15820 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15830 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
15840 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
15850 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
15860 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
15870 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
15880 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
15890 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
158a0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
158b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
158c0 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
158d0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
158e0 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
158f0 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
15900 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
15910 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
15920 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
15930 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
15940 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15950 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
15960 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
15970 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
15980 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
15990 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
159a0 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
159b0 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
159c0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
159d0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
159e0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
159f0 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
15a00 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
15a10 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
15a20 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
15a30 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
15a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a50 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
15a60 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
15a70 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
15a80 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
15a90 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
15aa0 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
15ab0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
15ac0 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
15ad0 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
15ae0 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
15af0 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
15b00 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
15b10 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
15b20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
15b30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
15b40 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
15b50 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
15b60 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
15b70 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
15b80 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
15b90 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
15ba0 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
15bb0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
15bc0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
15bd0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
15be0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
15bf0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
15c20 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
15c30 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
15c40 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
15c50 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
15c60 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
15c70 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
15c80 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
15c90 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
15ca0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
15cb0 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
15cc0 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
15cd0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15ce0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
15cf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15d00 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
15d10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
15d20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15d30 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
15d40 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
15d50 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15d60 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
15d70 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
15d80 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
15d90 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15da0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
15db0 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
15dc0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
15dd0 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
15de0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15df0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15e00 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
15e10 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
15e20 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
15e30 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15e40 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
15e50 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
15e60 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
15e70 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
15e80 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15e90 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15ea0 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
15eb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
15ec0 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
15ed0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
15ee0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
15ef0 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
15f00 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
15f10 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
15f20 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
15f30 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15f40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
15f50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15f60 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
15f70 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
15f80 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
15f90 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
15fa0 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
15fb0 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
15fc0 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
15fd0 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
15fe0 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
15ff0 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
16000 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
16010 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
16020 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
16030 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
16040 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
16050 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
16060 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
16070 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
16080 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
16090 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
160a0 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
160b0 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
160c0 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
160d0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
160e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
160f0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
16100 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
16110 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
16120 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
16130 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
16140 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
16150 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
16160 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
16170 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
16180 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
16190 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
161a0 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
161b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
161c0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
161d0 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
161e0 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
161f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
16200 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
16210 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
16220 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
16230 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
16240 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
16250 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
16260 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
16270 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
16280 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
16290 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
162a0 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
162b0 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
162c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
162d0 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
162e0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
162f0 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
16300 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
16310 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
16320 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
16330 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
16340 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
16350 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
16360 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
16370 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
16380 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
16390 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
163a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
163b0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
163c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
163d0 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
163e0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
163f0 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
16400 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
16410 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
16420 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
16430 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
16440 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
16450 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
16460 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
16470 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
16480 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
16490 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
164a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
164b0 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
164c0 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
164d0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
164e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
164f0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
16500 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
16510 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
16520 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
16530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
16540 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
16550 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
16560 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
16570 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
16580 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
16590 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
165a0 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
165b0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
165c0 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
165d0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
165e0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
165f0 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
16600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16610 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
16620 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
16630 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
16640 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
16650 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16660 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
16670 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
16680 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
16690 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
166a0 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
166b0 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
166c0 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
166d0 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
166e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
166f0 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
16700 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16710 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
16720 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
16730 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
16740 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
16750 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
16760 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
16770 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
16780 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
16790 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
167a0 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
167b0 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
167c0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
167d0 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
167e0 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
167f0 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
16800 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
16810 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
16820 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
16830 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
16840 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
16850 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
16860 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
16870 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
16880 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
16890 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
168a0 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
168b0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
168c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
168d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
168e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
168f0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
16900 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
16910 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
16920 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
16930 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
16940 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
16950 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
16960 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
16970 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
16980 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
16990 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
169a0 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
169b0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
169c0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
169d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
169e0 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
169f0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
16a00 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
16a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16a20 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
16a30 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
16a40 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
16a50 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
16a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
16a70 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
16a80 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
16a90 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ab0 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
16ac0 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
16ad0 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
16ae0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
16af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16b00 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
16b10 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
16b20 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
16b30 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
16b40 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
16b50 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
16b60 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
16b70 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
16b80 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
16b90 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
16ba0 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
16bb0 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
16bc0 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
16bd0 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
16be0 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
16bf0 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
16c00 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
16c10 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
16c20 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
16c30 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
16c40 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
16c50 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
16c60 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
16c70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
16c80 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
16c90 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
16ca0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
16cb0 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
16cc0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
16cd0 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
16ce0 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
16cf0 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
16d00 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
16d10 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16d20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
16d30 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
16d40 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
16d50 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
16d60 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
16d70 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
16d80 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
16d90 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
16da0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
16db0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
16dc0 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
16dd0 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
16de0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
16df0 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
16e00 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
16e10 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
16e20 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
16e30 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
16e40 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
16e50 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
16e60 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
16e70 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
16e80 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
16e90 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
16ea0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
16eb0 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
16ec0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16ed0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
16ee0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16ef0 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
16f00 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
16f10 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
16f20 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
16f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16f40 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
16f50 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
16f60 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
16f70 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
16f80 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
16f90 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
16fa0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
16fb0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
16fc0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16fd0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
16fe0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
16ff0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
17000 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
17010 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
17020 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17040 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
17050 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
17060 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
17090 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
170a0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
170b0 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
170c0 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20  em;..  p->flags 
170d0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
170e0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
170f0 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
17100 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
17110 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
17120 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
17130 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
17140 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
17150 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
17160 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
17170 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
17180 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
17190 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
171a0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
171b0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
171c0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
171d0 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
171e0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
171f0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
17200 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
17210 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
17220 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
17230 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  /.    pMem->zMal
17240 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
17250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17260 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
17270 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
17280 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
17290 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
172a0 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
172b0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
172c0 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
172d0 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   u;.}../*.** Thi
172e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
172f0 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
17300 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
17310 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
17320 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
17330 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
17340 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
17350 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
17360 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
17370 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
17380 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
17390 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
173a0 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
173b0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
173c0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
173d0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
173e0 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
173f0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
17400 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
17410 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
17420 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
17430 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
17440 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
17450 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
17460 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
17470 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
17480 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
17490 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
174a0 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
174b0 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
174c0 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
174d0 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
174e0 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
174f0 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
17500 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
17510 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
17520 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
17530 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
17540 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
17550 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
17560 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
17570 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
17580 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
17590 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
175a0 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
175b0 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
175c0 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
175d0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
175e0 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
175f0 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
17600 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
17610 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
17620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17630 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
17640 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
17650 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
17660 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
17670 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
17680 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
17690 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
176a0 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
176b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
176c0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
176d0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
176e0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
176f0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
17700 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
17710 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
17720 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
17730 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
17740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
17750 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
17760 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
17770 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
17780 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17790 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
177a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
177b0 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
177c0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
177d0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
177e0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
177f0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31  pKeyInfo;.  mem1
17800 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
17810 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
17820 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
17830 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
17840 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
17850 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
17860 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17870 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
17880 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  ONLY( mem1.zMall
17890 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
178a0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
178b0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
178c0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
178d0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
178e0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
178f0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
17900 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
17910 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
17920 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
17930 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
17940 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
17950 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
17960 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
17970 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
17980 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
17990 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
179a0 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
179b0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
179c0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
179d0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
179e0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
179f0 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
17a00 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
17a10 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
17a20 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
17a30 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
17a40 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
17a50 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
17a60 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
17a70 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
17a80 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
17a90 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
17aa0 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
17ab0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
17ac0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
17ad0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
17ae0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
17af0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
17b00 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
17b10 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
17b20 69 65 6c 64 2b 31 3e 3d 70 50 4b 65 79 32 2d 3e  ield+1>=pPKey2->
17b30 6e 46 69 65 6c 64 20 29 3b 0a 20 20 61 73 73 65  nField );.  asse
17b40 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
17b50 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
17b60 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
17b70 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
17b80 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
17b90 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
17ba0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
17bb0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
17bc0 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
17bd0 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
17be0 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
17bf0 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
17c00 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
17c10 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
17c20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
17c30 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
17c40 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
17c50 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
17c60 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
17c70 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
17c80 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
17c90 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
17ca0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
17cb0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
17cc0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
17cd0 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
17ce0 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
17cf0 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
17d00 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
17d10 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
17d20 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
17d30 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
17d40 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
17d50 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
17d60 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
17d70 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
17d80 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
17d90 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
17da0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
17db0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
17dc0 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
17dd0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
17de0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17df0 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
17e00 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
17e10 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
17e20 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
17e30 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
17e40 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
17e50 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
17e60 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
17e70 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
17e80 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
17e90 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
17ea0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
17eb0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
17ec0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
17ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
17ee0 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
17ef0 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
17f00 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
17f10 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
17f20 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
17f30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
17f40 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
17f50 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
17f60 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
17f70 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
17f80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17f90 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
17fa0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
17fb0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
17fc0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
17fd0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
17fe0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
17ff0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
18000 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
18010 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
18020 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
18030 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
18040 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
18050 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
18060 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
18070 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
18080 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
18090 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
180a0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
180b0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
180c0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
180d0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
180e0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
180f0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
18100 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
18110 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67  NCRKEY.  ** flag
18120 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72   is set, then br
18130 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74  eak the tie by t
18140 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20  reating key2 as 
18150 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20  larger..  ** If 
18160 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
18170 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
18180 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
18190 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
181a0 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ixes.  ** are co
181b0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
181c0 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
181d0 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
181e0 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61   is the .  ** la
181f0 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70  rger.  As it hap
18200 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32  pens, the pPKey2
18210 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
18220 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20  the longer.  ** 
18230 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
18240 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
18250 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
18260 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
18270 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
18280 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
18290 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
182a0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
182b0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
182c0 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
182d0 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30    /* Leave rc==0
182e0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
182f0 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20  idx1<szHdr1 ){. 
18300 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
18310 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
18320 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
18330 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
18340 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
18350 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
18360 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
18370 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
18380 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
18390 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
183a0 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
183b0 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
183c0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
183d0 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
183e0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
183f0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
18400 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
18410 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
18420 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
18430 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
18440 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
18450 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
18460 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
18470 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
18480 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
18490 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
184a0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
184b0 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
184c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
184d0 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
184e0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
184f0 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
18500 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
18510 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
18520 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
18530 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
18540 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
18550 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
18560 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
18570 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
18580 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
18590 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
185a0 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
185b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
185c0 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
185d0 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
185e0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
185f0 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
18600 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
18610 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
18620 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
18630 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
18640 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
18650 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
18660 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
18670 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
18680 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
18690 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
186a0 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
186b0 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
186c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
186d0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
186e0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
186f0 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
18700 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
18710 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
18720 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
18730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
18740 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
18750 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
18760 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
18770 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
18780 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
18790 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
187a0 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
187b0 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
187c0 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
187d0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
187e0 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ry */.  memset(&
187f0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
18800 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18810 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
18820 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e  (pCur, 0, (int)n
18830 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
18840 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
18850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18860 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
18870 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
18880 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
18890 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
188a0 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
188b0 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
188c0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
188d0 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
188e0 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
188f0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
18900 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
18910 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
18920 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
18930 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
18940 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
18950 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
18960 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
18970 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
18980 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
18990 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
189a0 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
189b0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
189c0 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
189d0 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
189e0 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
189f0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18a00 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
18a10 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18a20 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
18a30 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
18a40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18a50 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
18a60 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18a70 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
18a80 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18a90 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
18aa0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
18ab0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18ac0 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
18ad0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
18ae0 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
18af0 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
18b00 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
18b10 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
18b20 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
18b30 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
18b40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
18b50 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
18b60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
18b70 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
18b80 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
18b90 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
18ba0 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
18bb0 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
18bc0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
18bd0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
18be0 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
18bf0 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
18c00 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
18c10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
18c20 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
18c30 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
18c40 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
18c50 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
18c60 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
18c70 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18c80 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18c90 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
18ca0 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
18cb0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
18cc0 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
18cd0 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
18ce0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
18cf0 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
18d00 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18d10 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
18d20 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
18d30 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
18d40 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
18d50 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
18d60 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
18d70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18d80 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
18d90 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
18da0 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
18db0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
18dc0 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
18dd0 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
18de0 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
18df0 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
18e00 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
18e10 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
18e20 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
18e30 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
18e40 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
18e50 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
18e60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
18e70 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
18e80 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18e90 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
18ea0 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
18eb0 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
18ec0 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
18ed0 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
18ee0 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
18ef0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
18f00 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
18f10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18f20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
18f30 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
18f40 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
18f50 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
18f60 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
18f70 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
18f80 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
18f90 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
18fa0 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
18fb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
18fc0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
18fd0 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  (.  VdbeCursor *
18fe0 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
18ff0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
19000 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
19010 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
19020 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
19030 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
19040 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20  rsion of key to 
19050 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
19060 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
19090 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
190a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
190b0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
190c0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
190d0 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
190e0 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d  pCursor;.  Mem m
190f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19100 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
19110 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
19120 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
19130 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
19140 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
19150 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
19160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19170 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
19180 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
19190 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
191a0 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
191b0 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
191c0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
191d0 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
191e0 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
191f0 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
19200 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
19210 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
19220 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
19230 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
19240 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
19250 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
19260 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
19270 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
19280 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19290 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
192a0 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
192b0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
192c0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
192d0 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
192e0 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
192f0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
19300 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
19310 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
19320 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
19330 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
19340 52 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20  REFIX_MATCH );. 
19350 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
19360 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
19370 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
19380 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
19390 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
193a0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
193b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
193c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
193d0 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
193e0 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
193f0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
19400 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
19410 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
19420 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
19430 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
19440 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
19450 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
19460 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
19470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19480 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
19490 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
194a0 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
194b0 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
194c0 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
194d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
194e0 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
194f0 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
19500 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
19510 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
19520 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
19530 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19540 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
19550 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
19560 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
19570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
19580 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
19590 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
195a0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
195b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
195c0 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
195d0 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
195e0 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
195f0 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
19600 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
19610 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
19620 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
19630 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
19640 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
19650 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
19660 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
19670 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
19680 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
19690 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
196a0 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
196b0 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
196c0 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
196d0 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
196e0 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
196f0 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
19700 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
19710 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
19720 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
19730 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
19740 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
19750 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
19760 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
19770 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
19780 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
19790 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
197a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
197b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
197c0 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
197d0 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
197e0 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
197f0 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
19800 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
19810 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
19820 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
19830 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
19840 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
19850 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
19860 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
19870 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
19880 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
19890 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
198a0 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
198b0 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
198c0 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
198d0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
198e0 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
198f0 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
19900 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
19910 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
19920 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
19930 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
19940 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
19950 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19960 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
19970 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
19980 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
19990 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
199a0 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
199b0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
199c0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
199d0 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
199e0 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
199f0 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
19a00 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
19a10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19a20 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
19a30 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
19a40 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
19a50 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
19a60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
19a70 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
19a80 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
19a90 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
19aa0 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
19ab0 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
19ac0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19ad0 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
19ae0 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b  pe((Mem *)pRet);
19af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19b00 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
19b10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
19b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
19b30 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
19b40 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
19b50 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
19b60 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
19b70 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
19b80 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
19b90 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
19ba0 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
19bb0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
19bc0 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
19bd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19be0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
19bf0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
19c00 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
19c10 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
19c20 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
19c30 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
19c40 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
19c50 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
19c60 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
19c70 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
19c80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19c90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
19ca0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
19cb0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
19cc0 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
19cd0 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
19ce0 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
19cf0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
19d00 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
19d10 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
19d20 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
19d30 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
19d40 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
19d50 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
19d60 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
19d70 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
19d80 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
19d90 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
19da0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19db0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69   = p->db;.  sqli
19dc0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
19dd0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
19de0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
19df0 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56  3DbStrDup(db, pV
19e00 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
19e10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
19e20 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
19e30 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
19e40 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
19e50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19e60 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a           TUALTABLE */.