/ Hex Artifact Content
Login

Artifact d5cdd5bd5c063cc912df20b0bcadf78b6b351cb2:


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 70 4f 70 2d 3e  code;..    pOp->
2dd0: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
2de0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
2df0: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
2e00: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
2e10: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
2e20: 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20  OP_AggStep ){.  
2e30: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e      if( pOp->p5>
2e40: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2e50: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20  rgs = pOp->p5;. 
2e60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2e70: 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74  ode==OP_Transact
2e80: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ion ){.      if(
2e90: 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d   pOp->p2!=0 ) p-
2ea0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
2eb0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
2ec0: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 1;.    }else
2ed0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2ee0: 41 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20 6f 70  AutoCommit || op
2ef0: 63 6f 64 65 3d 3d 4f 50 5f 53 61 76 65 70 6f 69  code==OP_Savepoi
2f00: 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 62  nt ){.      p->b
2f10: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
2f20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
2f30: 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 0a 20 20  de==OP_Vacuum.  
2f40: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f           || opco
2f50: 64 65 3d 3d 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  de==OP_JournalMo
2f60: 64 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  de.#ifndef SQLIT
2f70: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2f80: 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d        || opcode=
2f90: 3d 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 0a 23  =OP_Checkpoint.#
2fa0: 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2fb0: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
2fc0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 62 49 73   0;.      p->bIs
2fd0: 52 65 61 64 65 72 20 3d 20 31 3b 0a 23 69 66 6e  Reader = 1;.#ifn
2fe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ff0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
3000: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3010: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b  e==OP_VUpdate ){
3020: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
3030: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
3040: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
3050: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3060: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74  opcode==OP_VFilt
3070: 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
3080: 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
3090: 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33   p->nOp - i >= 3
30a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
30b0: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
30c0: 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a  ==OP_Integer );.
30d0: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
30e0: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ].p1;.      if( 
30f0: 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  n>nMaxArgs ) nMa
3100: 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69  xArgs = n;.#endi
3110: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
3120: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20  opcode==OP_Next 
3130: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  || opcode==OP_So
3140: 72 74 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  rterNext ){.    
3150: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3160: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3170: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70  eNext;.      pOp
3180: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
3190: 56 41 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65  VANCE;.    }else
31a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
31b0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f  Prev ){.      pO
31c0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
31d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
31e0: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70  vious;.      pOp
31f0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
3200: 56 41 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VANCE;.    }..  
3210: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
3220: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  ags & OPFLG_JUMP
3230: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  )!=0 && pOp->p2<
3240: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
3250: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d  t( -1-pOp->p2<p-
3260: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
3270: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
3280: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3290: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
32a0: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
32b0: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d  p->aLabel);.  p-
32c0: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >aLabel = 0;.  *
32d0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
32e0: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
32f0: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3300: 3d 30 20 7c 7c 20 70 2d 3e 62 74 72 65 65 4d 61  =0 || p->btreeMa
3310: 73 6b 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  sk==0 );.}../*.*
3320: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
3330: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
3340: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3350: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3360: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3370: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3380: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3390: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
33a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
33b0: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
33c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
33d0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
33e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
33f0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
3400: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
3410: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
3420: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3430: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
3440: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3450: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3460: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3470: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3480: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3490: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
34a0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
34b0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
34c0: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
34d0: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
34e0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
34f0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3500: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
3510: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
3520: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
3530: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
3540: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3550: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3560: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3570: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3580: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3590: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
35a0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
35b0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
35c0: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
35d0: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
35e0: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
35f0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
3600: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
3610: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
3620: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
3630: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
3640: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3650: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3660: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3670: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3680: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3690: 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a  btreeMask==0 );.
36a0: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
36b0: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
36c0: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
36d0: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
36e0: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
36f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
3700: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
3710: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
3720: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
3730: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
3740: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3750: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
3760: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3770: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3780: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
3790: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
37a0: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
37b0: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
37c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
37d0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
37e0: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
37f0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
3800: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20   growOpArray(p) 
3810: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3820: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
3830: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
3840: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
3850: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
3860: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
3870: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
3880: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
3890: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
38a0: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
38b0: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
38c0: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
38d0: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
38e0: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
38f0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
3900: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
3910: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
3920: 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70  <0 && (sqlite3Op
3930: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75  codeProperty[pOu
3940: 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  t->opcode] & OPF
3950: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20  LG_JUMP)!=0 ){. 
3960: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3970: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
3980: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3990: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
39a0: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
39b0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
39c0: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
39d0: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
39e0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
39f0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
3a00: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
3a10: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
3a20: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
3a30: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
3a40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64  ;.      if( p->d
3a50: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
3a60: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
3a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3a80: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
3a90: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
3aa0: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
3ab0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
3ac0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
3ad0: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
3ae0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
3af0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3b00: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
3b10: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3b20: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3b30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3b40: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
3b50: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
3b60: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
3b70: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
3b80: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
3b90: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
3ba0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
3bb0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
3bc0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
3bd0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
3be0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
3bf0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3c00: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3c10: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3c20: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3c30: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3c40: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
3c50: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3c60: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3c70: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
3c80: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3c90: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3ca0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3cb0: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
3cc0: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
3cd0: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
3ce0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3cf0: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
3d00: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3d10: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3d20: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3d30: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3d40: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3d50: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
3d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3d70: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3d80: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
3d90: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3da0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
3db0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3dc0: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
3dd0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
3de0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3df0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
3e00: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
3e10: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3e20: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
3e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3e40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3e50: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
3e60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3e70: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
3e80: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
3e90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3ea0: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
3eb0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3ec0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3ed0: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
3ee0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
3ef0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
3f00: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
3f10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3f20: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
3f30: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
3f40: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
3f50: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3f60: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3f70: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
3f80: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
3f90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3fa0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
3fb0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3fc0: 69 66 28 20 41 4c 57 41 59 53 28 61 64 64 72 3e  if( ALWAYS(addr>
3fd0: 3d 30 29 20 29 20 73 71 6c 69 74 65 33 56 64 62  =0) ) sqlite3Vdb
3fe0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3ff0: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
4000: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
4010: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
4020: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
4030: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
4040: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
4050: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
4060: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
4070: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
4080: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
4090: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
40a0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
40b0: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
40c0: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
40d0: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
40e0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
40f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4100: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
4110: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4120: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4130: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
4140: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
4150: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
4160: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
4170: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
4180: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
4190: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
41a0: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
41b0: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
41c0: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
41d0: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
41e0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
41f0: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
4200: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
4210: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
4220: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4230: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
4240: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
4250: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
4260: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
4270: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4280: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4290: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
42a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
42b0: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
42c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
42d0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
42e0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
42f0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4300: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4310: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
4320: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
4330: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
4340: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
4350: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4360: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4370: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4380: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4390: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
43a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
43b0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
43c0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
43d0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
43e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
43f0: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
4400: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4410: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
4420: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
4430: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4440: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
4450: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
4460: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4470: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4480: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4490: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
44a0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
44b0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
44c0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
44d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
44e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
44f0: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4500: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4510: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
4520: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
4530: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
4540: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
4550: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
4560: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
4570: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4580: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
45a0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
45b0: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
45c0: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
45d0: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
45e0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
45f0: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4600: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4610: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4620: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4630: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
4640: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4650: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4660: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
4670: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
4680: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
4690: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
46a0: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
46b0: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
46c0: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
46d0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
46e0: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
46f0: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
4700: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
4710: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
4720: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
4730: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
4740: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
4750: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
4760: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
4770: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4780: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
4790: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
47a0: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
47b0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
47c0: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
47d0: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
47e0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
47f0: 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74  ge the opcode at
4800: 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f   addr into OP_No
4810: 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  op.*/.void sqlit
4820: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
4830: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
4840: 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  addr){.  if( p->
4850: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
4860: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
4870: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
4880: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4890: 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20  .    freeP4(db, 
48a0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
48b0: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d  ->p4.p);.    mem
48c0: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
48d0: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
48e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
48f0: 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  P_Noop;.  }.}../
4900: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
4910: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
4920: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
4930: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
4940: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
4950: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
4960: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
4970: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
4980: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
4990: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
49a0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
49b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
49c0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
49d0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
49e0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
49f0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
4a00: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
4a10: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
4a20: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
4a30: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
4a40: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
4a50: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4a60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
4a70: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
4a80: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
4a90: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
4aa0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
4ab0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
4ac0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
4ad0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
4ae0: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a  tes of zP4..**.*
4af0: 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  * If n==P4_KEYIN
4b00: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
4b10: 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65   zP4 is a pointe
4b20: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
4b30: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
4b40: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
4b50: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
4b60: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
4b70: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
4b80: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
4b90: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
4ba0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
4bb0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
4bc0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4bd0: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
4be0: 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  t zP4 points to 
4bf0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
4c00: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
4c10: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
4c20: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
4c30: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4c40: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
4c50: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
4c60: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
4c70: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
4c80: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
4c90: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
4ca0: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
4cb0: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
4cc0: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
4cd0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
4ce0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
4cf0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
4d00: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
4d10: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
4d20: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
4d30: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
4d40: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
4d50: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
4d60: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
4d70: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
4d80: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
4d90: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
4da0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
4db0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
4dc0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
4dd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4de0: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
4df0: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
4e00: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
4e10: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
4e20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
4e30: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
4e40: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
4e50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4e60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4e70: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
4e80: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
4e90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28  iled ){.    if (
4ea0: 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26   n!=P4_KEYINFO &
4eb0: 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 7b  & n!=P4_VTAB ) {
4ec0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4ed0: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
4ee0: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
4ef0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
4f00: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
4f10: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
4f20: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
4f30: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
4f40: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
4f50: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
4f60: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
4f70: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ];.  assert( pOp
4f80: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
4f90: 55 53 45 44 20 7c 7c 20 70 4f 70 2d 3e 70 34 74  USED || pOp->p4t
4fa0: 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b  ype==P4_INT32 );
4fb0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
4fc0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4fd0: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
4fe0: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
4ff0: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
5000: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
5010: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
5020: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
5030: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
5040: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
5050: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
5060: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
5070: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
5080: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
5090: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
50a0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
50b0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
50c0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
50d0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
50e0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
50f0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
5100: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5110: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b  KEYINFO ){.    K
5120: 65 79 49 6e 66 6f 20 2a 70 4f 72 69 67 2c 20 2a  eyInfo *pOrig, *
5130: 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4f 72 69 67  pNew;..    pOrig
5140: 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34   = (KeyInfo*)zP4
5150: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b  ;.    pOp->p4.pK
5160: 65 79 49 6e 66 6f 20 3d 20 70 4e 65 77 20 3d 20  eyInfo = pNew = 
5170: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
5180: 6c 6f 63 28 64 62 2c 20 70 4f 72 69 67 2d 3e 6e  loc(db, pOrig->n
5190: 46 69 65 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  Field);.    if( 
51a0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 6d 65  pNew ){.      me
51b0: 6d 63 70 79 28 70 4e 65 77 2d 3e 61 43 6f 6c 6c  mcpy(pNew->aColl
51c0: 2c 20 70 4f 72 69 67 2d 3e 61 43 6f 6c 6c 2c 20  , pOrig->aColl, 
51d0: 70 4f 72 69 67 2d 3e 6e 46 69 65 6c 64 2a 73 69  pOrig->nField*si
51e0: 7a 65 6f 66 28 70 4e 65 77 2d 3e 61 43 6f 6c 6c  zeof(pNew->aColl
51f0: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  [0]));.      mem
5200: 63 70 79 28 70 4e 65 77 2d 3e 61 53 6f 72 74 4f  cpy(pNew->aSortO
5210: 72 64 65 72 2c 20 70 4f 72 69 67 2d 3e 61 53 6f  rder, pOrig->aSo
5220: 72 74 4f 72 64 65 72 2c 20 70 4f 72 69 67 2d 3e  rtOrder, pOrig->
5230: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 70  nField);.      p
5240: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5250: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
5260: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
5270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5280: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
5290: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
52a0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
52b0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
52c0: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
52d0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
52e0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
52f0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
5300: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
5310: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
5320: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5330: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5340: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5350: 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c  P4_VTAB;.    sql
5360: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
5370: 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20  able *)zP4);.   
5380: 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c   assert( ((VTabl
5390: 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d  e *)zP4)->db==p-
53a0: 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  >db );.  }else i
53b0: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
53c0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
53d0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
53e0: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
53f0: 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b  char)n;.  }else{
5400: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
5410: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5420: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
5430: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
5440: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
5450: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
5460: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5470: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
5480: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
5490: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
54a0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
54b0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
54c0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
54d0: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
54e0: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
54f0: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
5500: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
5510: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
5520: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
5530: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
5540: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
5550: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
5560: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
5570: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
5580: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
5590: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
55a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
55b0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
55c0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
55d0: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
55e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
55f0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5600: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5610: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5620: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5630: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
5640: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5650: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
5660: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5670: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
5680: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
5690: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
56a0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
56b0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
56c0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
56d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
56e0: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
56f0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5700: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5710: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5720: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
5730: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5740: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
5750: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
5760: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
5770: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
5780: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5790: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
57a0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
57b0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
57c0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
57d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
57e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
57f0: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5800: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5810: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
5820: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
5830: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5840: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
5850: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
5860: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
5870: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
5880: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
5890: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
58a0: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
58b0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
58c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
58d0: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
58e0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
58f0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
5900: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
5910: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
5920: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
5930: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
5940: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
5950: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
5960: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
5970: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
5980: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
5990: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
59a0: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
59b0: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
59c0: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
59d0: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
59e0: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
59f0: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
5a00: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
5a10: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
5a20: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
5a30: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5a40: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
5a50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5a60: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
5a70: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
5a80: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
5a90: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
5aa0: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
5ab0: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
5ac0: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
5ad0: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
5ae0: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
5af0: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
5b00: 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23  *.** About the #
5b10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5b20: 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c  T_TRACE:  Normal
5b30: 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ly, this routine
5b40: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
5b50: 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f  .** unless p->nO
5b60: 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65  p>0.  This is be
5b70: 63 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73  cause in the abs
5b80: 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  ense of SQLITE_O
5b90: 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e  MIT_TRACE,.** an
5ba0: 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75   OP_Trace instru
5bb0: 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ction is always 
5bc0: 69 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69  inserted by sqli
5bd0: 74 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20  te3VdbeGet() as 
5be0: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77  soon as.** a new
5bf0: 20 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64   VDBE is created
5c00: 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65  .  So we are fre
5c10: 65 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f  e to set addr to
5c20: 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75   p->nOp-1 withou
5c30: 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64  t.** having to d
5c40: 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d  ouble-check to m
5c50: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5c60: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d  e result is non-
5c70: 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a  negative. But.**
5c80: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
5c90: 54 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64  TRACE is defined
5ca0: 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69  , the OP_Trace i
5cb0: 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65  s omitted and we
5cc0: 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63   do need to.** c
5cd0: 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f  heck the value o
5ce0: 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72  f p->nOp-1 befor
5cf0: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f  e continuing..*/
5d00: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
5d10: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
5d20: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
5d30: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
5d40: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
5d50: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
5d60: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
5d70: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
5d80: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
5d90: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
5da0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
5db0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
5dc0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
5dd0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
5de0: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
5df0: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
5e00: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
5e10: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5e20: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5e30: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
5e40: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
5e50: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
5e60: 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72  f( p->nOp==0 ) r
5e70: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
5e80: 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20  dummy;.#endif.  
5e90: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
5ea0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
5eb0: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
5ec0: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
5ed0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5ee0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
5ef0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5f00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
5f10: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
5f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
5f30: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
5f40: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
5f50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5f60: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
5f70: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
5f80: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
5f90: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
5fa0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
5fb0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
5fc0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
5fd0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
5fe0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
5ff0: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
6000: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
6010: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
6020: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
6030: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
6040: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
6050: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
6060: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
6070: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
6080: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
6090: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
60a0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
60b0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
60c0: 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a  _KEYINFO_STATIC:
60d0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
60e0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
60f0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
6100: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
6110: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
6120: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
6130: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
6140: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
6150: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6160: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6170: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
6180: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
6190: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
61a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
61b0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
61c0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
61d0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
61e0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
61f0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
6200: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
6210: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6220: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
6230: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e  Coll->zName : "n
6240: 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  il";.        int
6250: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
6260: 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20  en30(zColl);.   
6270: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
6280: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
6290: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
62a0: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
62b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
62c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
62d0: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
62e0: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ';.        if( p
62f0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6300: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6310: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
6320: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '-';.        }.
6330: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
6340: 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c  zTemp[i], zColl,
6350: 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69   n+1);.        i
6360: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
6370: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
6380: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
6390: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
63a0: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
63b0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
63c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
63d0: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
63e0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
63f0: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
6400: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
6410: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6420: 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65  , zTemp, "collse
6430: 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  q(%.20s)", pColl
6440: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
6450: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6460: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
6470: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
6480: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
6490: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
64a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
64b0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
64c0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
64d0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
64e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
64f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6500: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
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 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6530: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
6540: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
6550: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6560: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
6570: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6580: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6590: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
65a0: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
65b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
65c0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
65d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
65e0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
65f0: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
6600: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
6610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6620: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
6630: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
6640: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
6650: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
6660: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
6670: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
6680: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
6690: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
66a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
66b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
66c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
66d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
66e0: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
66f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6700: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6710: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
6720: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6730: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6740: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
6750: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
6760: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
6770: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
6780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6790: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
67a0: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
67b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67c0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
67d0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
67e0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
67f0: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
6800: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6810: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6830: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
6840: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
6850: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
6860: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
6870: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6890: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
68a0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
68b0: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
68c0: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
68d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
68e0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
68f0: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
6900: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6910: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6920: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
6930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6940: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
6950: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
6960: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6970: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6980: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
6990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
69a0: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
69b0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
69c0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
69d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
69e0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
69f0: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
6a00: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
6a10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
6a20: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
6a30: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
6a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
6a60: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
6a70: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
6a80: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
6a90: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
6aa0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
6ab0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
6ac0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
6ad0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
6ae0: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
6af0: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
6b00: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
6b10: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
6b20: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
6b30: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
6b40: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
6b50: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
6b60: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
6b70: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
6b80: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
6b90: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
6ba0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
6bb0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
6bc0: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
6bd0: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
6be0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6bf0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
6c00: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
6c10: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
6c20: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
6c30: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
6c40: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
6c50: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
6c60: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d  eMask)*8 );.  p-
6c70: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28  >btreeMask |= ((
6c80: 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  yDbMask)1)<<i;. 
6c90: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
6ca0: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
6cb0: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
6cc0: 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c  pBt) ){.    p->l
6cd0: 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62  ockMask |= ((yDb
6ce0: 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a  Mask)1)<<i;.  }.
6cf0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
6d10: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
6d20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
6d30: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
6d40: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
6d50: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
6d60: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
6d70: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
6d80: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
6d90: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
6da0: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
6db0: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
6dc0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
6dd0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
6de0: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
6df0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
6e00: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
6e10: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
6e20: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
6e30: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
6e40: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
6e50: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
6e60: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
6e70: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
6e80: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
6e90: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
6ea0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
6eb0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
6ec0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
6ed0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
6ee0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
6ef0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
6f00: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
6f10: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
6f20: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
6f30: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
6f40: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6f50: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
6f60: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
6f70: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
6f80: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
6f90: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
6fa0: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
6fb0: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
6fc0: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
6fd0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
6fe0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
6ff0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
7000: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
7010: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
7020: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
7030: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
7040: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
7050: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
7060: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
7070: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
7080: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
7090: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
70a0: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
70b0: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
70c0: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
70d0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
70e0: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
70f0: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
7100: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
7110: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
7120: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
7130: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7140: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
7150: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79  p){.  int i;.  y
7160: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73  DbMask mask;.  s
7170: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
7180: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
7190: 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d  ;.  if( p->lockM
71a0: 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ask==0 ) return;
71b0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
71c0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
71d0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
71e0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
71f0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
7200: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62  0, mask=1; i<nDb
7210: 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d  ; i++, mask += m
7220: 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  ask){.    if( i!
7230: 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d  =1 && (mask & p-
7240: 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26  >lockMask)!=0 &&
7250: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
7260: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
7270: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
7280: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
7290: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
72a0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
72b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
72c0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
72d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
72e0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
72f0: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
7300: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
7310: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
7320: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
7330: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7340: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
7350: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7360: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
7370: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
7380: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
7390: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
73a0: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
73b0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
73c0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
73d0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
73e0: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
73f0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
7400: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
7410: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
7420: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
7430: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
7440: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
7450: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
7460: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
7470: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
7480: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
7490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
74a0: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
74b0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
74c0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
74d0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
74e0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
74f0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
7500: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
7510: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
7520: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7530: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
7540: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
7550: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
7560: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
7570: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
7580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
7590: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
75a0: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34   %4d %4d %4d %-4
75b0: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
75c0: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
75d0: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
75e0: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
75f0: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
7600: 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e  (zPtr));.  fprin
7610: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
7620: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
7630: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
7640: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
7650: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
7660: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
7670: 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51  p->p5,.#ifdef SQ
7680: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
7690: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f   pOp->zComment ?
76a0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a   pOp->zComment :
76b0: 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   "".#else.      
76c0: 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  "".#endif.  );. 
76d0: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
76e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
76f0: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
7700: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
7710: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
7720: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7730: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
7740: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
7750: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a  .    Mem *pEnd;.
7760: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
7770: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
7780: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
7790: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
77a0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
77b0: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
77c0: 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b      for(pEnd=&p[
77d0: 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  N]; p<pEnd; p++)
77e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
77f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
7800: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
7810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7820: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e     }.    for(pEn
7830: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b  d=&p[N]; p<pEnd;
7840: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   p++){.      ass
7850: 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45  ert( (&p[1])==pE
7860: 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70  nd || p[0].db==p
7870: 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20  [1].db );..     
7880: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
7890: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
78a0: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
78b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
78c0: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
78d0: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
78e0: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
78f0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
7900: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
7910: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
7920: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
7930: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
7940: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
7950: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
7960: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
7970: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
7980: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
7990: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
79a0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
79b0: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
79c0: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
79d0: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
79e0: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
79f0: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
7a00: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
7a10: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
7a20: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
7a30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
7a40: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
7a50: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
7a60: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
7a70: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
7a80: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
7a90: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
7aa0: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
7ab0: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
7ac0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
7ad0: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
7ae0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
7af0: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
7b00: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
7b10: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
7b20: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
7b30: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
7b40: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
7b50: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
7b60: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
7b70: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
7b80: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
7b90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7ba0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
7bb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7bc0: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
7bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7be0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
7bf0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
7c00: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
7c10: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
7c20: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76  >flags = MEM_Inv
7c30: 61 6c 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alid;.    }.    
7c40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c50: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
7c60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
7c70: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
7c80: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
7c90: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
7ca0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
7cb0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
7cc0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
7cd0: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
7ce0: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
7cf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7d00: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
7d10: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
7d20: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
7d30: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
7d40: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
7d50: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
7d60: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
7d70: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
7d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7d90: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
7da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
7db0: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
7dc0: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
7dd0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
7de0: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
7df0: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
7e00: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
7e10: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
7e20: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
7e30: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
7e40: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
7e50: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
7e60: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
7e70: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
7e80: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
7e90: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
7ea0: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
7eb0: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
7ec0: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
7ed0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
7ee0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
7ef0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
7f00: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
7f10: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
7f20: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
7f30: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
7f40: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
7f50: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
7f60: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
7f70: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
7f80: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
7f90: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
7fa0: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
7fb0: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
7fc0: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
7fd0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
7fe0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
7ff0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
8000: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
8010: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
8020: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
8030: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
8040: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
8050: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
8060: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
8070: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
8080: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
8090: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
80a0: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
80b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
80c0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
80d0: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
8100: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
8110: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
8120: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
8150: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
8160: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
8170: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8190: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
81a0: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
81b0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81d0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
81e0: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
81f0: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
8200: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8220: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
8230: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
8240: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8270: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
8280: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82a0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
82b0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
82c0: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
82d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
82e0: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
82f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
8300: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
8310: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
8320: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
8330: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8340: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
8350: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
8360: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
8370: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
8380: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
8390: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
83a0: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
83b0: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
83c0: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
83d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
83e0: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
83f0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
8400: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
8410: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
8420: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
8430: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
8440: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
8450: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
8460: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
8470: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
8480: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
8490: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
84a0: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
84b0: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
84c0: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
84d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
84e0: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
84f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8500: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
8510: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
8520: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
8530: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8540: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
8550: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
8560: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
8570: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
8580: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
8590: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
85a0: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
85b0: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
85c0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
85d0: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
85e0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
85f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
8600: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
8610: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
8620: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
8630: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
8640: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
8650: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
8660: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
8670: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
8680: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
8690: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
86a0: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
86b0: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
86c0: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
86d0: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
86e0: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
86f0: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
8700: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
8710: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
8720: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
8730: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
8740: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
8750: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
8760: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
8770: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
8780: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
8790: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
87a0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
87b0: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
87c0: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
87d0: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
87e0: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
87f0: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
8800: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
8810: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
8820: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
8830: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
8840: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
8850: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
8860: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
8870: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8880: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
8890: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
88a0: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
88b0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
88c0: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
88d0: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
88e0: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
88f0: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
8900: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
8910: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
8920: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
8930: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
8940: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
8950: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
8960: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
8970: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
8980: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
8990: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
89a0: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
89b0: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
89c0: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
89d0: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
89e0: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
89f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
8a00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
8a10: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
8a20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
8a30: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
8a40: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
8a50: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
8a60: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
8a70: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
8a80: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
8a90: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
8aa0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
8ab0: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
8ac0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
8ad0: 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  z;.    Op *pOp;.
8ae0: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
8af0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
8b00: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
8b10: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
8b20: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
8b30: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
8b40: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
8b50: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
8b60: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
8b70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b80: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
8b90: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
8ba0: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
8bb0: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
8bc0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
8bd0: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
8be0: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
8bf0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
8c00: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
8c10: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
8c20: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
8c30: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
8c40: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
8c50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8c60: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
8c70: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
8c80: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
8c90: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
8ca0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8cb0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
8cc0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
8cd0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d  NTEGER;.      pM
8ce0: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8d10: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
8d20: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
8d30: 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66    .      pMem->f
8d40: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
8d50: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
8d60: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
8d70: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
8d80: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
8d90: 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f  ->opcode);  /* O
8da0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
8db0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
8dc0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
8dd0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
8de0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
8df0: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
8e00: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
8e10: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
8e20: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
8e30: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
8e40: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
8e50: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
8e60: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
8e70: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
8e80: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
8e90: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
8ea0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
8eb0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
8ec0: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
8ed0: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
8ee0: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
8ef0: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
8f00: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
8f10: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
8f20: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
8f30: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
8f40: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
8f50: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
8f60: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
8f70: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
8f80: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
8f90: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
8fa0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
8fb0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
8fc0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8fd0: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
8fe0: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
8ff0: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
9000: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
9010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9020: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
9030: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
9040: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
9050: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
9060: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
9070: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
9080: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
9090: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
90a0: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
90b0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
90c0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
90d0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
90e0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
90f0: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
9100: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
9110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9120: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
9130: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
9140: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
9150: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
9180: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9190: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
91a0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
91b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
91c0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
91d0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
9200: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
9210: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
9220: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
9230: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9240: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
9250: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
9260: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
9270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9280: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  3 */.    pMem->t
9290: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
92a0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
92b0: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
92c0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
92d0: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
92e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
92f0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9300: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
9310: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
9320: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
9330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
9340: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79  ->flags = MEM_Dy
9350: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  n|MEM_Str|MEM_Te
9360: 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70  rm;.    z = disp
9370: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
9380: 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28  >z, 32);.    if(
9390: 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20   z!=pMem->z ){. 
93a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
93b0: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
93c0: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  z, -1, SQLITE_UT
93d0: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
93e0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
93f0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
9400: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
9410: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9420: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
9430: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
9440: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
9450: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9460: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9470: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
9480: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9490: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
94a0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
94b0: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
94c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
94d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
94e0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
94f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
9500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9510: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9520: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45  M_Dyn|MEM_Str|ME
9530: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
9540: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
9550: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9560: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
9570: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
9580: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
9590: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
95a0: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
95b0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
95c0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
95d0: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65  pMem++;.  .#ifde
95e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
95f0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43       if( pOp->zC
9600: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
9610: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9620: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9630: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
9640: 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  z = pOp->zCommen
9650: 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  t;.        pMem-
9660: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
9670: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
9680: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
9690: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
96a0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
96b0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
96c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
96d0: 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
96e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
96f0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9710: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
9720: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
9730: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ype = SQLITE_NUL
9740: 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  L;.      }.    }
9750: 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ..    p->nResCol
9760: 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e  umn = 8 - 4*(p->
9770: 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20  explain-1);.    
9780: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
9790: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20  &p->aMem[1];.   
97a0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
97b0: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
97c0: 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72  ITE_ROW;.  }.  r
97d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
97e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
97f0: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
9800: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9810: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
9820: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
9830: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
9840: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
9850: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9860: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
9870: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
9880: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
9890: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e  Op *pOp;.  if( n
98a0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
98b0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
98c0: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
98d0: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
98e0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
98f0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9900: 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b   *z = pOp->p4.z;
9910: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
9920: 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29  te3Isspace(*z) )
9930: 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66   z++;.    printf
9940: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
9950: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
9960: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9970: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9980: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
9990: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
99a0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
99b0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
99c0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
99d0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
99e0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
99f0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
9a00: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
9a10: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
9a20: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
9a30: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
9a40: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
9a50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
9a60: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
9a70: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
9a80: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
9a90: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
9aa0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
9ab0: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
9ac0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9ad0: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
9ae0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
9af0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
9b00: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
9b10: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
9b20: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
9b30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9b40: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
9b50: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
9b60: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
9b70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
9b80: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
9b90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9ba0: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
9bb0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
9bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
9bd0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
9be0: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
9bf0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
9c00: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
9c10: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
9c20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
9c30: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ACE */../*.** Al
9c40: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f  locate space fro
9c50: 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62  m a fixed size b
9c60: 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e  uffer and return
9c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
9c80: 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66   that space.  If
9c90: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
9ca0: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
9cb0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
9cc0: 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61  *.** The pBuf pa
9cd0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69  rameter is the i
9ce0: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
9cf0: 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20  a pointer which 
9d00: 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20  will.** receive 
9d10: 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  the new memory. 
9d20: 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c   pBuf is normall
9d30: 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66  y NULL.  If pBuf
9d40: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c   is not.** NULL,
9d50: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d   it means that m
9d60: 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20  emory space has 
9d70: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
9d80: 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a  ocated and that.
9d90: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9da0: 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63  should not alloc
9db0: 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f  ate any new memo
9dc0: 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69  ry.  When pBuf i
9dd0: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69  s not.** NULL si
9de0: 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66  mply return pBuf
9df0: 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65  .  Only allocate
9e00: 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63   new memory spac
9e10: 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69  e when pBuf.** i
9e20: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42  s NULL..**.** nB
9e30: 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  yte is the numbe
9e40: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
9e50: 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  ace needed..**.*
9e60: 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73  * *ppFrom points
9e70: 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70   to available sp
9e80: 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69  ace and pEnd poi
9e90: 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  nts to the end o
9ea0: 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62  f the.** availab
9eb0: 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20  le space.  When 
9ec0: 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  space is allocat
9ed0: 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61  ed, *ppFrom is a
9ee0: 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20  dvanced past.** 
9ef0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61  the end of the a
9f00: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a  llocated space..
9f10: 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73  **.** *pnByte is
9f20: 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68   a counter of th
9f30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
9f40: 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20  s of space that 
9f50: 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74  have failed.** t
9f60: 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20  o allocate.  If 
9f70: 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69  there is insuffi
9f80: 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a  cient space in *
9f90: 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66  ppFrom to satisf
9fa0: 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  y the.** request
9fb0: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
9fc0: 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20   *pnByte by the 
9fd0: 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65  amount of the re
9fe0: 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  quest..*/.static
9ff0: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
a000: 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  e(.  void *pBuf,
a010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
a020: 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  re return pointe
a030: 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  r will be stored
a040: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
a050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a060: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
a070: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75   allocate */.  u
a080: 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20  8 **ppFrom,     
a090: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41      /* IN/OUT: A
a0a0: 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70  llocate from *pp
a0b0: 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45  From */.  u8 *pE
a0c0: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
a0d0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
a0e0: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
a0f0: 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66   of *ppFrom buff
a100: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42  er */.  int *pnB
a110: 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  yte          /* 
a120: 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  If allocation ca
a130: 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e  nnot be made, in
a140: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
a150: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
a160: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
a170: 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b  MENT(*ppFrom) );
a180: 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65  .  if( pBuf ) re
a190: 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79  turn pBuf;.  nBy
a1a0: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
a1b0: 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46  e);.  if( &(*ppF
a1c0: 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70  rom)[nByte] <= p
a1d0: 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20  End ){.    pBuf 
a1e0: 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d  = (void*)*ppFrom
a1f0: 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d  ;.    *ppFrom +=
a200: 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b   nByte;.  }else{
a210: 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20  .    *pnByte += 
a220: 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
a230: 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn pBuf;.}../*.
a240: 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44  ** Rewind the VD
a250: 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  BE back to the b
a260: 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70  eginning in prep
a270: 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72  aration for.** r
a280: 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f  unning it..*/.vo
a290: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
a2a0: 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23  wind(Vdbe *p){.#
a2b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a2c0: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
a2d0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
a2e0: 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69  ).  int i;.#endi
a2f0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  f.  assert( p!=0
a300: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
a310: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
a320: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
a330: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
a340: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
a350: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
a360: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
a370: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
a380: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
a390: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
a3a0: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
a3b0: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
a3c0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
a3d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a3e0: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b  DEBUG.  for(i=1;
a3f0: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
a400: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
a410: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
a420: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
a430: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
a440: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
a450: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
a460: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
a470: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a480: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
a490: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
a4a0: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
a4b0: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
a4c0: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
a4d0: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
a4e0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
a4f0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
a500: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
a510: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
a520: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
a530: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
a540: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
a550: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
a560: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
a570: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
a580: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
a590: 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
a5a0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
a5b0: 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
a5c0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
a5d0: 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
a5e0: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
a5f0: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
a600: 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64   stack space and
a610: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
a620: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
a630: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
a640: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
a650: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
a660: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
a670: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
a680: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
a690: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
a6a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
a6b0: 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20  be called exact 
a6c0: 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76  once on a each v
a6d0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
a6e0: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
a6f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a700: 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
a710: 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69  "packaged" and i
a720: 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75  s ready.** to ru
a730: 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  n.  After this r
a740: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a750: 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74  , futher calls t
a760: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
a770: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
a780: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
a790: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
a7a0: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
a7b0: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
a7c0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
a7d0: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
a7e0: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
a7f0: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
a800: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
a810: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
a820: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
a830: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
a840: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
a850: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
a860: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
a870: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
a880: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
a890: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
a8a0: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
a8b0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
a8c0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
a8d0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
a8e0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
a910: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
a920: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
a930: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
a940: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
a950: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a970: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
a980: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
a990: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a9b0: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
a9c0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
a9d0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
a9e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a9f0: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
aa00: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
aa10: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa30: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
aa40: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
aa50: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
aa80: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
aa90: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rams */.  int nO
aaa0: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nce;            
aab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
aac0: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e  er of OP_Once in
aad0: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
aae0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ab10: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
ab40: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
ab50: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  ation */.  u8 *z
ab60: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
ab70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
ab80: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c  st byte past all
ab90: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
aba0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
abd0: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65  tra memory is ne
abe0: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eded */..  asser
abf0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
ac00: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
ac10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
ac20: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
ac30: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
ac40: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
ac50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
ac60: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
ac70: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
ac80: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
ac90: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
aca0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
acb0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
acc0: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
acd0: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
ace0: 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65    nOnce = pParse
acf0: 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e  ->nOnce;.  if( n
ad00: 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20  Once==0 ) nOnce 
ad10: 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61  = 1; /* Ensure a
ad20: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65  t least one byte
ad30: 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67   in p->aOnceFlag
ad40: 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f  [] */.  .  /* Fo
ad50: 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65  r each cursor re
ad60: 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c  quired, also all
ad70: 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63  ocate a memory c
ad80: 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a  ell. Memory.  **
ad90: 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e   cells (nMem+1-n
ada0: 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69  Cursor)..nMem, i
adb0: 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e  nclusive, will n
adc0: 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a  ever be used by.
add0: 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72    ** the vdbe pr
ade0: 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74  ogram. Instead t
adf0: 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20  hey are used to 
ae00: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
ae10: 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73  or.  ** VdbeCurs
ae20: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75  or/BtCursor stru
ae30: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62  ctures. The blob
ae40: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
ae50: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a  iated with .  **
ae60: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f   cursor 0 is sto
ae70: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  red in memory ce
ae80: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20  ll nMem. Memory 
ae90: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20  cell (nMem-1).  
aea0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c  ** stores the bl
aeb0: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
aec0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
aed0: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a  sor 1, etc..  **
aee0: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
aef0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
af00: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
af10: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20   nCursor;..  /* 
af20: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
af30: 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  or memory regist
af40: 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c  ers, SQL variabl
af50: 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73  es, VDBE cursors
af60: 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72   and .  ** an ar
af70: 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53  ray to marshal S
af80: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  QL function argu
af90: 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20  ments in..  */. 
afa0: 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d   zCsr = (u8*)&p-
afb0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20  >aOp[p->nOp];   
afc0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
afd0: 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  aliable for allo
afe0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64  cation */.  zEnd
aff0: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b   = (u8*)&p->aOp[
b000: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f  p->nOpAlloc];  /
b010: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
b020: 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20  t end of zCsr[] 
b030: 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  */..  resolveP2V
b040: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
b050: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
b060: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
b070: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
b080: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
b090: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
b0a0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
b0b0: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
b0c0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
b0d0: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
b0e0: 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a   zEnd-zCsr);.  z
b0f0: 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28  Csr += (zCsr - (
b100: 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65  u8*)0)&7;.  asse
b110: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
b120: 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29  LIGNMENT(zCsr) )
b130: 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
b140: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
b150: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
b160: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
b170: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
b180: 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a  cated in two.  *
b190: 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68  * passes.  On th
b1a0: 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65  e first pass, we
b1b0: 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e   try to reuse un
b1c0: 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68  used space at th
b1d0: 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
b1e0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
b1f0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
b200: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
b210: 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
b220: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
b230: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
b240: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
b250: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
b260: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
b270: 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69   in the rest usi
b280: 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63  ng a fresh alloc
b290: 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
b2a0: 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
b2b0: 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
b2c0: 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
b2d0: 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
b2e0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
b2f0: 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74  eftover space at
b300: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b310: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e  opcode array can
b320: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
b330: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
b340: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
b350: 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72  held by a prepar
b360: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
b370: 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42  */.  do {.    nB
b380: 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  yte = 0;.    p->
b390: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
b3a0: 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  e(p->aMem, nMem*
b3b0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
b3c0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b3d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
b3e0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
b3f0: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
b400: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
b410: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b420: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
b430: 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c  cSpace(p->apArg,
b440: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
b450: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
b460: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
b470: 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  >azVar = allocSp
b480: 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56  ace(p->azVar, nV
b490: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
b4a0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
b4b0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
b4c0: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
b4d0: 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  e(p->apCsr, nCur
b4e0: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
b4f0: 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20  ursor*),.       
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20     &zCsr, zEnd, 
b520: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b530: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f  aOnceFlag = allo
b540: 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46  cSpace(p->aOnceF
b550: 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73  lag, nOnce, &zCs
b560: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b570: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
b580: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65  ){.      p->pFre
b590: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
b5a0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
b5b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  e);.    }.    zC
b5c0: 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20  sr = p->pFree;. 
b5d0: 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b     zEnd = &zCsr[
b5e0: 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65  nByte];.  }while
b5f0: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
b600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b610: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
b620: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
b630: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
b640: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
b650: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
b660: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
b670: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
b680: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
b690: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
b6a0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
b6b0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
b6c0: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
b6d0: 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b   if( p->azVar ){
b6e0: 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20  .    p->nzVar = 
b6f0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20  pParse->nzVar;. 
b700: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56     memcpy(p->azV
b710: 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  ar, pParse->azVa
b720: 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65  r, p->nzVar*size
b730: 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29  of(p->azVar[0]))
b740: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  ;.    memset(pPa
b750: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70  rse->azVar, 0, p
b760: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a  Parse->nzVar*siz
b770: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  eof(pParse->azVa
b780: 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  r[0]));.  }.  if
b790: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
b7a0: 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20   p->aMem--;     
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20   /* aMem[] goes 
b7d0: 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a  from 1..nMem */.
b7e0: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
b7f0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
b800: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
b810: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
b820: 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  */.    for(n=1; 
b830: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
b840: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
b850: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61  flags = MEM_Inva
b860: 6c 69 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  lid;.      p->aM
b870: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
b880: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78     }.  }.  p->ex
b890: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
b8a0: 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74  explain;.  sqlit
b8b0: 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
b8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
b8d0: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
b8e0: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
b8f0: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
b900: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
b910: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
b920: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b930: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
b940: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
b950: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
b960: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b970: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
b980: 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70  dbeSorterClose(p
b990: 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66  ->db, pCx);.  if
b9a0: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
b9b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
b9c0: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
b9d0: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
b9e0: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
b9f0: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
ba00: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
ba10: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
ba20: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
ba30: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
ba40: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
ba50: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ba60: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
ba70: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
ba80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ba90: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
baa0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
bab0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
bac0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
bad0: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
bae0: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
baf0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
bb00: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
bb10: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
bb20: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
bb30: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f  hod = 1;.    pMo
bb40: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
bb50: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  abCursor);.    p
bb60: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
bb70: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
bb80: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
bb90: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
bba0: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
bbb0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
bbc0: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
bbd0: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
bbe0: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
bbf0: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
bc00: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
bc10: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
bc20: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
bc30: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
bc40: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
bc50: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
bc60: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
bc70: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
bc80: 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   v->aOnceFlag = 
bc90: 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61  pFrame->aOnceFla
bca0: 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61  g;.  v->nOnceFla
bcb0: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63  g = pFrame->nOnc
bcc0: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20  eFlag;.  v->aOp 
bcd0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20  = pFrame->aOp;. 
bce0: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65   v->nOp = pFrame
bcf0: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d  ->nOp;.  v->aMem
bd00: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b   = pFrame->aMem;
bd10: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  v->nMem = pFr
bd20: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->nMem;.  v->
bd30: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e  apCsr = pFrame->
bd40: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72  apCsr;.  v->nCur
bd50: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  sor = pFrame->nC
bd60: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e  ursor;.  v->db->
bd70: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61  lastRowid = pFra
bd80: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  me->lastRowid;. 
bd90: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46   v->nChange = pF
bda0: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  rame->nChange;. 
bdb0: 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e   return pFrame->
bdc0: 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  pc;.}../*.** Clo
bdd0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  se all cursors..
bde0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61  **.** Also relea
bdf0: 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d  se any dynamic m
be00: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
be10: 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65  e VM in the Vdbe
be20: 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a  .aMem memory .**
be30: 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69   cell array. Thi
be40: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61  s is necessary a
be50: 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  s the memory cel
be60: 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74  l array may cont
be70: 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20  ain.** pointers 
be80: 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  to VdbeFrame obj
be90: 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ects, which may 
bea0: 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20  in turn contain 
beb0: 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f  pointers to.** o
bec0: 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  pen cursors..*/.
bed0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
bee0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65  eAllCursors(Vdbe
bef0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
bf00: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
bf10: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
bf20: 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
bf30: 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
bf40: 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
bf50: 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
bf60: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
bf70: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
bf80: 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  pFrame);.  }.  p
bf90: 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
bfa0: 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a  p->nFrame = 0;..
bfb0: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
bfc0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
bfd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
bfe0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Cursor; i++){.  
bff0: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a      VdbeCursor *
c000: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
c010: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29  ;.      if( pC )
c020: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c030: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
c040: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20  p, pC);.        
c050: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
c060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c070: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d   }.  if( p->aMem
c080: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
c090: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d  emArray(&p->aMem
c0a0: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  [1], p->nMem);. 
c0b0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
c0c0: 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  DelFrame ){.    
c0d0: 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20  VdbeFrame *pDel 
c0e0: 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  = p->pDelFrame;.
c0f0: 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65      p->pDelFrame
c100: 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74   = pDel->pParent
c110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c120: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65  eFrameDelete(pDe
c130: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  l);.  }..  /* De
c140: 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61  lete any auxdata
c150: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64   allocations mad
c160: 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20  e by the VM */. 
c170: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
c180: 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c  teAuxData(p, -1,
c190: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
c1a0: 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
c1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
c1c0: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
c1d0: 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  execution..**.**
c1e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
c1f0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
c200: 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f   close any curso
c210: 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f  rs, lists, and/o
c220: 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61  r.** sorters tha
c230: 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e  t were left open
c240: 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74  .  It also delet
c250: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
c260: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e  .** variables in
c270: 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61   the aVar[] arra
c280: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
c290: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
c2a0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
c2b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64  b = p->db;..#ifd
c2c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
c2d0: 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
c2e0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
c2f0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
c300: 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
c310: 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
c320: 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
c330: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
c340: 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
c350: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c360: 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d  ->apCsr ) for(i=
c370: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
c380: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
c390: 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
c3a0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
c3b0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
c3c0: 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  =p->nMem; i++) a
c3d0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
c3e0: 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76  ].flags==MEM_Inv
c3f0: 61 6c 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  alid );.  }.#end
c400: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
c410: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
c420: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
c430: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
c440: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
c450: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
c460: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
c470: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
c480: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
c490: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
c4a0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
c4b0: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
c4c0: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
c4d0: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
c4e0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
c4f0: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
c500: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
c510: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
c520: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
c530: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
c540: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
c550: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
c560: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
c570: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
c580: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
c590: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
c5a0: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
c5b0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
c5c0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
c5d0: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
c5e0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
c5f0: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
c600: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
c610: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
c620: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
c630: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
c640: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
c650: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
c660: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
c670: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
c680: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
c690: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
c6a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
c6b0: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
c6c0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
c6d0: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
c6e0: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
c6f0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
c700: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
c710: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
c720: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
c730: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
c740: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
c750: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
c760: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
c770: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
c780: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
c790: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
c7a0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
c7b0: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
c7c0: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
c7d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c7e0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
c7f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
c800: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
c810: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
c820: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
c830: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
c840: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
c850: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
c860: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
c870: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
c880: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
c890: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
c8a0: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
c8b0: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
c8c0: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
c8d0: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
c8e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
c8f0: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
c920: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
c930: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
c960: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
c970: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
c980: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c9a0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
c9b0: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
c9c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c9d0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
c9e0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
c9f0: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
ca00: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
ca10: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
ca20: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
ca30: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
ca40: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
ca50: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
ca60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
ca70: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
ca80: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
ca90: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
caa0: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
cab0: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
cac0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cad0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
cae0: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
caf0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
cb00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cb10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
cb20: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
cb30: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
cb40: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
cb50: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
cb60: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
cb70: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
cb80: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
cb90: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
cba0: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
cbb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
cbc0: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
cbd0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
cbe0: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
cbf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cc00: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
cc10: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
cc20: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
cc30: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
cc40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
cc50: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
cc60: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
cc70: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
cc80: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
cc90: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
cca0: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
ccb0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
ccc0: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
ccd0: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
cce0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
ccf0: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
cd00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
cd10: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
cd20: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
cd30: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
cd40: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
cd50: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
cd60: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
cd70: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
cd80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
cd90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
cda0: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
cdb0: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
cdc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
cdd0: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
cde0: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
cdf0: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
ce00: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
ce10: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
ce20: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
ce30: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
ce40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ce50: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
ce60: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
ce70: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
ce80: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
ce90: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
cea0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
ceb0: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
cec0: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
ced0: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
cee0: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
cef0: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
cf00: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
cf10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
cf20: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
cf30: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
cf40: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
cf50: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
cf60: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
cf70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cf80: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
cf90: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
cfa0: 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  , &p->zErrMsg);.
cfb0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
cfc0: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
cfd0: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
cfe0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
cff0: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
d000: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
d010: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
d020: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
d030: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
d040: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
d050: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
d060: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
d070: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
d080: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
d090: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
d0a0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
d0b0: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
d0c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
d0d0: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
d0e0: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
d0f0: 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
d100: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
d110: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
d120: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
d130: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
d140: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
d150: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
d160: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
d170: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
d180: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
d190: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
d1a0: 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s++;.      sqlit
d1b0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
d1c0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
d1d0: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
d1e0: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
d1f0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
d200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
d210: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
d220: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
d230: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d240: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d250: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
d260: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
d270: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
d280: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
d290: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
d2a0: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
d2b0: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
d2c0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
d2d0: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
d2e0: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
d2f0: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
d300: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
d310: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
d320: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
d330: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d340: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
d350: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
d360: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
d370: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
d380: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
d390: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
d3a0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
d3b0: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
d3c0: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
d3d0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
d3e0: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
d3f0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
d400: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
d410: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
d420: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
d430: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
d440: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
d450: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
d460: 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
d470: 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
d480: 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
d490: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
d4a0: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
d4b0: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
d4c0: 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
d4d0: 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
d4e0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
d4f0: 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
d500: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
d510: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
d520: 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
d530: 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
d540: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
d550: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
d560: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
d570: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
d580: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
d590: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
d5a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
d5b0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
d5c0: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
d5d0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
d5e0: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
d5f0: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
d600: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
d610: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
d620: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
d630: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
d640: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
d650: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
d660: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
d670: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
d680: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
d690: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
d6a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
d6b0: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
d6c0: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
d6d0: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
d6e0: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
d6f0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
d700: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
d710: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
d720: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d730: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
d740: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
d750: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
d760: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
d770: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
d780: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
d790: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
d7a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d7b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d7c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d7d0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
d7e0: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
d7f0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
d800: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
d810: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
d820: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
d830: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
d840: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
d850: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d860: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
d870: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
d880: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
d890: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
d8a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d8b0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
d8c0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
d8d0: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
d8e0: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
d8f0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
d900: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
d910: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
d920: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
d930: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
d940: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
d950: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
d960: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
d970: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
d980: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
d990: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
d9a0: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
d9b0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
d9c0: 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f  .    int retryCo
d9d0: 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  unt = 0;.    int
d9e0: 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20   nMainFile;..   
d9f0: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
da00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
da10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61   name */.    nMa
da20: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
da30: 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69  Strlen30(zMainFi
da40: 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  le);.    zMaster
da50: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
da60: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58  f(db, "%s-mjXXXX
da70: 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69  XX9XXz", zMainFi
da80: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61  le);.    if( zMa
da90: 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  ster==0 ) return
daa0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
dab0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
dac0: 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
dad0: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20   if( retryCount 
dae0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
daf0: 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b  etryCount>100 ){
db00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
db10: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
db20: 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20  LL, "MJ delete: 
db30: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
db40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
db50: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
db60: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
db70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
db80: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
db90: 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a  etryCount==1 ){.
dba0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dbb0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
dbc0: 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20  L, "MJ collide: 
dbd0: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
dbe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dbf0: 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e  .      retryCoun
dc00: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
dc10: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
dc20: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
dc30: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
dc40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
dc50: 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d  (13, &zMaster[nM
dc60: 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30  ainFile], "-mj%0
dc70: 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20  6X9%02X",.      
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f           (iRando
dca0: 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20  m>>8)&0xffffff, 
dcb0: 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20  iRandom&0xff);. 
dcc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69       /* The anti
dcd0: 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72  penultimate char
dce0: 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73  acter of the mas
dcf0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
dd00: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
dd10: 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e  e "9" to avoid n
dd20: 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ame collisions w
dd30: 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69  hen using 8+3 fi
dd40: 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  lenames. */.    
dd50: 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65    assert( zMaste
dd60: 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  r[sqlite3Strlen3
dd70: 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27  0(zMaster)-3]=='
dd80: 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  9' );.      sqli
dd90: 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a  te3FileSuffix3(z
dda0: 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65  MainFile, zMaste
ddb0: 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
ddc0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
ddd0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
dde0: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
ddf0: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
de00: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
de10: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
de20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
de30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
de40: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
de50: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
de60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de70: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
de80: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
de90: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
dea0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
deb0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
dec0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
ded0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
dee0: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
def0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
df00: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
df10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
df20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
df30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
df40: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
df50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
df60: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
df70: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
df80: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
df90: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
dfa0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
dfb0: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
dfc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
dfd0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
dfe0: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
dff0: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
e000: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
e010: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e020: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
e030: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
e040: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
e050: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
e060: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
e070: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
e080: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
e090: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
e0a0: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
e0b0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
e0c0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e0d0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
e0e0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
e0f0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
e100: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
e110: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
e120: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
e130: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
e140: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
e150: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
e160: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
e170: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30      if( zFile==0
e180: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
e190: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
e1a0: 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d  re TEMP and :mem
e1b0: 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
e1c0: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
e1d0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
e1e0: 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[0]!=0 );.     
e1f0: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
e200: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
e210: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
e220: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
e230: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
e240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e250: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
e260: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
e270: 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
e280: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
e290: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
e2a0: 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
e2b0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
e2c0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
e2d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e2e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e2f0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
e300: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
e310: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e320: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
e330: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
e340: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e350: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e360: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e380: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
e390: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
e3a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
e3b0: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
e3c0: 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
e3d0: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
e3e0: 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
e3f0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
e400: 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
e410: 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
e420: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
e430: 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
e440: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
e450: 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
e460: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
e470: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
e480: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
e490: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
e4a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
e4b0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
e4c0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
e4d0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
e4e0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
e4f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e500: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e510: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
e520: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
e530: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
e540: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
e550: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
e560: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
e570: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
e580: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e590: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
e5a0: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
e5b0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
e5c0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
e5d0: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
e5e0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
e5f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
e600: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
e610: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
e620: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
e630: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
e640: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
e650: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
e660: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
e670: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
e680: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
e690: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
e6a0: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
e6b0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
e6c0: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
e6d0: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
e6e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
e6f0: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
e700: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
e710: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
e720: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
e730: 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
e740: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
e750: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
e760: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
e770: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e780: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e790: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
e7a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e7b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
e7c0: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
e7d0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
e7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e7f0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
e800: 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
e810: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
e820: 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
e830: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e850: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
e860: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
e870: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
e880: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
e890: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e8a0: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
e8b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
e8c0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
e8d0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
e8e0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
e8f0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
e900: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
e910: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
e920: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
e930: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
e940: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e950: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
e960: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
e970: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e980: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
e990: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
e9a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e9b0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
e9c0: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
e9d0: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
e9e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
e9f0: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
ea00: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
ea10: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
ea20: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
ea30: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
ea40: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
ea50: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
ea60: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
ea70: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
ea80: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
ea90: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
eaa0: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
eab0: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
eac0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
ead0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
eae0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
eaf0: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
eb00: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
eb10: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
eb20: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
eb30: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
eb40: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
eb50: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
eb60: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
eb70: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
eb80: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
eb90: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
eba0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
ebb0: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
ebc0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ebd0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
ebe0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ebf0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
ec00: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
ec10: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ec20: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
ec30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ec40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ec50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ec60: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
ec70: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
ec80: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
ec90: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
eca0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
ecb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
ecc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
ecd0: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
ece0: 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
ecf0: 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
ed00: 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
ed10: 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
ed20: 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
ed30: 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
ed40: 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
ed50: 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
ed60: 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
ed70: 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
ed80: 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
ed90: 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
eda0: 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
edb0: 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
edc0: 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
edd0: 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
ede0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
edf0: 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
ee00: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
ee10: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
ee20: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
ee30: 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
ee40: 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
ee50: 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
ee60: 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
ee70: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
ee80: 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
ee90: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
eea0: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
eeb0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
eec0: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
eed0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
eee0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
eef0: 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57  readOnly==0 ) nW
ef00: 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  rite++;.      if
ef10: 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
ef20: 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a   nRead++;.    }.
ef30: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
ef40: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ef50: 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63  cnt==db->nVdbeAc
ef60: 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tive );.  assert
ef70: 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56  ( nWrite==db->nV
ef80: 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73  dbeWrite );.  as
ef90: 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d  sert( nRead==db-
efa0: 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a  >nVdbeRead );.}.
efb0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
efc0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
efd0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
efe0: 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61  * If the Vdbe pa
eff0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
f000: 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65  t argument opene
f010: 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  d a statement-tr
f020: 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c  ansaction,.** cl
f030: 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75  ose it now. Argu
f040: 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65  ment eOp must be
f050: 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
f060: 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a  T_ROLLBACK or.**
f070: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f080: 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  SE. If it is SAV
f090: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
f0a0: 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
f0b0: 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
f0c0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
f0d0: 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56  k. If eOp is SAV
f0e0: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
f0f0: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61  then the .** sta
f100: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f110: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
f120: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
f130: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
f140: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
f150: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
f160: 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
f170: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
f180: 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
f190: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
f1a0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ent(Vdbe *p, int
f1b0: 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33   eOp){.  sqlite3
f1c0: 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e   *const db = p->
f1d0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
f1e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
f1f0: 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  If p->iStatement
f200: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
f210: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
f220: 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a   Vdbe opened a .
f230: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
f240: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
f250: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
f260: 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20   here. The only 
f270: 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  exception.  ** i
f280: 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72  s that an IO err
f290: 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75  or may have occu
f2a0: 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e  rred, causing an
f2b0: 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
f2c0: 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69  ack..  ** In thi
f2d0: 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61  s case (db->nSta
f2e0: 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20  tement==0), and 
f2f0: 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
f300: 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69   to do..  */.  i
f310: 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  f( db->nStatemen
f320: 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
f330: 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nt ){.    int i;
f340: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
f350: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69  Savepoint = p->i
f360: 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20  Statement-1;..  
f370: 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
f380: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f390: 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
f3a0: 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
f3b0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
f3c0: 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
f3d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
f3e0: 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
f3f0: 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
f400: 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20  vepoint) );..   
f410: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
f420: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
f430: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
f440: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72  TE_OK;.      Btr
f450: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f460: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f470: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
f480: 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
f490: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
f4a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
f4b0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
f4c0: 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
f4d0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
f4e0: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f500: 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
f510: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f520: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
f530: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
f540: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f550: 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
f560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f570: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f580: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f590: 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
f5a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f5b0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61    }.    db->nSta
f5c0: 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d  tement--;.    p-
f5d0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
f5e0: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
f5f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f600: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f610: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f620: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f630: 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
f640: 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
f650: 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
f660: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
f670: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f680: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f690: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f6a0: 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
f6b0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f6c0: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
f6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f6e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
f6f0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f700: 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
f710: 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
f720: 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
f730: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
f740: 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
f750: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
f760: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
f770: 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
f780: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
f790: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
f7a0: 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
f7b0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
f7c0: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
f7d0: 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
f7e0: 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
f7f0: 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62  efCons;.      db
f800: 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
f810: 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
f820: 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  ImmCons;.    }. 
f830: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
f840: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
f850: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f860: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
f870: 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
f880: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
f890: 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
f8a0: 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
f8b0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
f8c0: 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
f8d0: 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
f8e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
f8f0: 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
f900: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
f910: 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
f920: 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
f930: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
f940: 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
f950: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
f960: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
f970: 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
f980: 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
f990: 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
f9a0: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
f9b0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
f9c0: 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
f9d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
f9e0: 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
f9f0: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
fa00: 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
fa10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
fa20: 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
fa30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
fa40: 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
fa50: 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
fa60: 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
fa70: 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
fa80: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
fa90: 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
faa0: 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
fab0: 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
fac0: 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
fad0: 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
fae0: 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
faf0: 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
fb00: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
fb10: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
fb20: 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
fb30: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
fb40: 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
fb50: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
fb60: 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65  rrMsg, db, "fore
fb70: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
fb80: 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
fb90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
fba0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
fbb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fbc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
fbd0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
fbe0: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
fbf0: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
fc00: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
fc10: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
fc20: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
fc30: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
fc40: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
fc50: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
fc60: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
fc70: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
fc80: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
fc90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fca0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
fcb0: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
fcc0: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
fcd0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
fce0: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
fcf0: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
fd00: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
fd10: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
fd20: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
fd30: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
fd40: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
fd50: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fd60: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
fd70: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
fd80: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
fd90: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
fda0: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
fdb0: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
fdc0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
fdd0: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
fde0: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
fdf0: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
fe00: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
fe10: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
fe20: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
fe30: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
fe40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
fe60: 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
fe70: 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
fe80: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
fe90: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
fea0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
feb0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
fec0: 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
fed0: 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
fee0: 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
fef0: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
ff00: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
ff10: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
ff20: 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
ff30: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
ff40: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
ff50: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
ff60: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
ff70: 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
ff80: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
ff90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
ffa0: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
ffb0: 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
ffc0: 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
ffd0: 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
ffe0: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
fff0: 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
10000 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
10010 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
10020 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
10030 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
10040 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
10050 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
10060 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
10070 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
10080 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
10090 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
100a0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
100b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
100c0 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
100d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
100e0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
100f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10100 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65  }.  if( p->aOnce
10110 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d  Flag ) memset(p-
10120 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70  >aOnceFlag, 0, p
10130 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20  ->nOnceFlag);.  
10140 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
10150 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
10160 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
10170 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
10180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10190 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
101a0 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
101b0 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
101c0 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
101d0 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
101e0 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
101f0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
10200 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
10210 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
10220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
10230 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
10240 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
10250 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
10260 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
10270 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
10280 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
10290 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
102a0 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
102b0 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
102c0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
102d0 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
102e0 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
102f0 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
10300 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
10310 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
10320 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
10330 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
10340 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
10350 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
10360 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
10370 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
10380 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
10390 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
103a0 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73  CKED );  /* This
103b0 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72   error no longer
103c0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
103d0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
103e0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
103f0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
10400 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
10410 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
10420 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
10430 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
10440 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
10450 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
10460 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10470 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
10480 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
10490 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
104a0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
104b0 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
104c0 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
104d0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
104e0 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
104f0 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
10500 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
10510 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
10520 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
10530 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
10540 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
10550 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
10560 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
10570 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
10580 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
10590 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
105a0 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
105b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
105c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
105d0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
105e0 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
105f0 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
10600 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
10610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
10620 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
10630 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
10640 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
10650 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
10660 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
10670 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
10680 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
10690 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
106a0 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
106b0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
106c0 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
106d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
106e0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
106f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10700 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
10710 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
10720 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
10730 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
10740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
10750 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
10760 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
10770 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
10780 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
10790 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
107a0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
107b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
107c0 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
107d0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
107e0 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
107f0 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
10800 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
10810 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
10820 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
10830 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
10840 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
10850 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
10860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10870 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
10880 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
10890 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
108a0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
108b0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
108c0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
108d0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
108e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
108f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
10900 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
10910 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
10920 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
10930 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
10950 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
10960 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
10970 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
10980 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
10990 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
109a0 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
109b0 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
109c0 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
109d0 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
109e0 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
109f0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
10a00 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
10a10 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
10a20 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
10a30 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
10a40 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
10a50 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
10a60 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
10a70 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
10a80 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
10a90 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
10aa0 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
10ab0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
10ac0 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
10ad0 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
10ae0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
10af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
10b00 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
10b10 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
10b20 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
10b30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10b40 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
10b50 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
10b60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10b70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
10b80 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
10b90 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
10ba0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10bb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
10bc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10bd0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
10be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10bf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
10c00 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
10c10 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
10c20 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
10c30 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
10c40 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
10c50 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
10c60 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
10c70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
10c80 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
10c90 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
10ca0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
10cb0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
10cc0 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
10cd0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
10ce0 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
10cf0 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
10d00 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
10d10 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
10d20 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
10d30 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
10d40 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
10d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
10d70 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
10d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10d90 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
10da0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
10db0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
10dc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
10df0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
10e00 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
10e10 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
10e20 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  _OK);.        }e
10e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
10e40 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
10e50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10e60 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
10e70 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
10e80 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
10e90 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
10ea0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  s;.          sql
10eb0 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
10ec0 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
10ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
10ef0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10f00 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
10f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
10f20 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
10f30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
10f40 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
10f50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
10f60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
10f70 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
10f80 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
10f90 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10fa0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
10fb0 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
10fc0 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
10fd0 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
10fe0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
10ff0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
11000 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
11010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11020 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11030 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11040 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
11050 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11060 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
11070 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
11080 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
11090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
110a0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
110b0 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
110c0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
110d0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
110e0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
110f0 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
11100 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
11110 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
11120 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
11130 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
11140 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
11150 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
11160 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
11170 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
11180 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
11190 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
111a0 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
111b0 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
111c0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
111d0 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
111e0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
111f0 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
11200 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
11210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
11220 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
11230 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
11240 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
11250 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
11260 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
11270 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
11280 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11290 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
112a0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
112b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
112c0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
112d0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
112e0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
112f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11300 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
11310 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
11320 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
11330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
11340 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
11350 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
11360 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
11370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
11380 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
11390 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
113a0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
113b0 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  nd no statement 
113c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
113d0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c  ** has been roll
113e0 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20  ed back, update 
113f0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
11400 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63  nection change-c
11410 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
11420 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
11430 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20  eCntOn ){.      
11440 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
11450 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  !=SAVEPOINT_ROLL
11460 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
11470 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
11480 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
11490 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
114a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
114b0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
114c0 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
114d0 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
114e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ge = 0;.    }.. 
114f0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
11500 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
11510 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
11520 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  p);.  }..  /* We
11530 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
11540 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
11550 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
11560 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
11570 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
11580 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64  0 ){.    db->nVd
11590 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20  beActive--;.    
115a0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
115b0 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74   ) db->nVdbeWrit
115c0 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e--;.    if( p->
115d0 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e  bIsReader ) db->
115e0 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20  nVdbeRead--;.   
115f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
11600 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56  beActive>=db->nV
11610 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61  dbeRead );.    a
11620 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
11630 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57  Read>=db->nVdbeW
11640 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65  rite );.    asse
11650 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  rt( db->nVdbeWri
11660 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  te>=0 );.  }.  p
11670 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
11680 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
11690 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
116a0 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  db);.  if( p->db
116b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
116c0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
116d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
116e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
116f0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
11700 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
11710 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
11720 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
11730 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
11740 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
11750 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
11760 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
11770 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
11780 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
11790 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
117a0 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
117b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
117c0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
117d0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
117e0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
117f0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
11800 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
11810 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
11820 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
11830 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
11840 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
11850 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
11860 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
11870 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
11880 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
11890 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
118a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
118b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
118c0 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
118d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
118e0 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
118f0 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
11900 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
11910 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
11920 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
11930 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
11940 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
11950 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
11960 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
11970 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
11980 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
11990 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
119a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
119b0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
119c0 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
119d0 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
119e0 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
119f0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
11a00 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
11a10 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
11a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
11a30 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
11a40 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
11a50 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
11a60 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
11a70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11a80 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
11a90 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
11aa0 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
11ab0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11ac0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
11ad0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
11ae0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
11af0 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c     u8 mallocFail
11b00 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
11b10 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74  ailed;.    sqlit
11b20 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
11b30 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
11b40 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
11b50 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
11b60 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
11b70 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
11b80 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
11b90 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
11ba0 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61  oc();.    db->ma
11bb0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
11bc0 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64  locFailed;.    d
11bd0 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
11be0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
11bf0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
11c00 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  c, 0);.  }.  ret
11c10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
11c20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11c30 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20  SQLLOG./*.** If 
11c40 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  an SQLITE_CONFIG
11c50 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20  _SQLLOG hook is 
11c60 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74  registered and t
11c70 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72  he VM has been r
11c80 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69  un, .** invoke i
11c90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11ca0 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  d vdbeInvokeSqll
11cb0 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69  og(Vdbe *v){.  i
11cc0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
11cd0 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26  Config.xSqllog &
11ce0 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & v->rc==SQLITE_
11cf0 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26  OK && v->zSql &&
11d00 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   v->pc>=0 ){.   
11d10 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64   char *zExpanded
11d20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
11d30 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53  pandSql(v, v->zS
11d40 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ql);.    assert(
11d50 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73   v->db->init.bus
11d60 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
11d70 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20  zExpanded ){.   
11d80 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
11d90 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a  Config.xSqllog(.
11da0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11db0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
11dc0 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c  qllogArg, v->db,
11dd0 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20   zExpanded, 1.  
11de0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
11df0 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
11e00 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20  , zExpanded);.  
11e10 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
11e20 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76  # define vdbeInv
11e30 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e  okeSqllog(x).#en
11e40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  dif../*.** Clean
11e50 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
11e60 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
11e70 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11e80 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
11e90 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
11ea0 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
11eb0 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
11ec0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
11ed0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
11ee0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11ef0 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
11f00 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
11f10 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
11f20 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
11f30 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
11f40 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
11f50 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
11f60 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
11f70 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11f80 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
11f90 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
11fa0 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
11fb0 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
11fc0 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
11fd0 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
11fe0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
11ff0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
12000 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
12010 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
12020 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
12030 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
12040 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
12050 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
12060 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
12070 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
12080 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
12090 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
120a0 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
120b0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
120c0 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
120d0 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
120e0 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
120f0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
12100 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
12110 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
12120 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
12130 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
12140 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
12150 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
12160 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
12170 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
12180 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
12190 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
121a0 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
121b0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
121c0 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
121d0 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
121e0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
121f0 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f   ){.    vdbeInvo
12200 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20  keSqllog(p);.   
12210 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
12220 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20  sferError(p);.  
12230 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12240 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
12250 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
12260 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
12270 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
12280 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
12290 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
122a0 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
122b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
122c0 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
122d0 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
122e0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
122f0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
12300 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
12310 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
12320 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
12330 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
12340 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
12350 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
12360 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
12370 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
12380 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
12390 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
123a0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
123b0 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
123c0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
123d0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
123e0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
123f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12400 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
12410 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
12420 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
12430 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
12440 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
12450 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
12460 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
12470 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
12480 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
12490 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
124a0 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
124b0 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
124c0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
124d0 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
124e0 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
124f0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
12500 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
12510 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
12520 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12530 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
12540 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
12550 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
12560 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
12570 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
12580 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
12590 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
125a0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
125b0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
125c0 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
125d0 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
125e0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
125f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
12600 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
12610 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
12620 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
12630 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
12640 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
12650 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
12660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
12670 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
12680 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
12690 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
126a0 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
126b0 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
126c0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
126d0 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
126e0 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
126f0 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
12700 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
12710 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
12720 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
12730 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
12740 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
12750 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
12760 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
12770 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
12780 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
12790 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
127a0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
127b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
127c0 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
127d0 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
127e0 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
127f0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
12800 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12810 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
12820 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
12830 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
12840 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
12850 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
12860 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
12880 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
12890 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
128a0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
128b0 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
128c0 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
128d0 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
128e0 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
128f0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
12900 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
12910 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
12920 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
12930 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
12940 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
12950 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
12960 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
12970 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
12980 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
12990 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
129a0 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
129b0 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
129c0 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
129d0 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
129e0 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
129f0 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
12a00 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
12a10 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
12a20 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
12a30 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
12a40 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
12a50 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
12a60 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
12a70 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
12a80 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
12a90 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
12aa0 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
12ab0 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
12ac0 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
12ad0 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
12ae0 63 6f 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69  corrsponds to bi
12af0 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
12b00 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12b10 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
12b20 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70   *pVdbe, int iOp
12b30 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41  , int mask){.  A
12b40 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70  uxData **pp = &p
12b50 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  Vdbe->pAuxData;.
12b60 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
12b70 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
12b80 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
12b90 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
12ba0 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70   (pAux->iOp==iOp
12bb0 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e   && (pAux->iArg>
12bc0 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 28  31 || !(mask & (
12bd0 28 75 33 32 29 31 3c 3c 70 41 75 78 2d 3e 69 41  (u32)1<<pAux->iA
12be0 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
12bf0 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
12c00 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
12c10 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
12c20 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
12c30 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
12c40 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
12c50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12c60 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78  (pVdbe->db, pAux
12c70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12c80 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
12c90 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
12ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
12cb0 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
12cc0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
12cd0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
12ce0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
12cf0 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
12d00 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
12d10 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
12d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
12d30 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
12d40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
12d50 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12d60 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
12d70 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
12d80 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
12d90 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
12da0 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
12db0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
12dc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12dd0 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
12de0 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
12df0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
12e00 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
12e10 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
12e20 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
12e30 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
12e40 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
12e50 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
12e60 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
12e70 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
12e80 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
12e90 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
12ea0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
12eb0 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
12ec0 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
12ed0 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
12ee0 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
12ef0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
12f00 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
12f10 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
12f20 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
12f30 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
12f40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12f50 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
12f60 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
12f70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
12f80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12f90 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
12fa0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
12fb0 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
12fc0 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
12fd0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
12fe0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  bel);.  sqlite3D
12ff0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
13000 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
13010 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
13020 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
13030 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
13040 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ee);.#if defined
13050 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
13060 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73  REE_EXPLAIN).  s
13070 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
13080 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   p->zExplain);. 
13090 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
130a0 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b  b, p->pExplain);
130b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
130c0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
130d0 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
130e0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
130f0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
13100 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
13110 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
13120 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
13130 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
13140 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13150 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
13160 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
13170 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
13180 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
13190 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
131a0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
131b0 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
131c0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
131d0 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
131e0 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
131f0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
13200 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
13210 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
13220 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
13230 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
13240 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
13250 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
13260 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
13270 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
13280 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
13290 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
132a0 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
132b0 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
132c0 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
132d0 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
132e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
132f0 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
13300 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
13310 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
13320 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
13330 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
13340 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
13350 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
13360 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
13370 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
13380 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
13390 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
133a0 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
133b0 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
133c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
133d0 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
133e0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
133f0 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
13400 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
13410 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
13420 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
13430 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
13440 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
13450 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
13460 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
13470 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
13480 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
13490 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
134a0 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
134b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
134c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
134d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
134e0 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
134f0 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
13500 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
13510 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
13520 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
13530 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
13540 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
13550 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
13560 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
13570 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
13580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
13590 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
135a0 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
135b0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
135c0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
135d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
135e0 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
135f0 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
13600 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20  Target;.    if( 
13610 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
13620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
13630 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  KPT;.    p->rowi
13640 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
13650 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13660 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
13670 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
13680 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  dif.    p->defer
13690 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
136a0 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
136b0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
136c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57  .  }else if( ALW
136d0 41 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  AYS(p->pCursor) 
136e0 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f  ){.    int hasMo
136f0 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ved;.    int rc 
13700 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
13710 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
13720 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76  pCursor, &hasMov
13730 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ed);.    if( rc 
13740 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13750 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b   if( hasMoved ){
13760 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53  .      p->cacheS
13770 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
13780 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75  ALE;.      p->nu
13790 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  llRow = 1;.    }
137a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
137b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
137c0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
137d0 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
137e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
137f0 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
13800 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13810 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
13820 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
13830 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13840 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
13850 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
13860 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
13870 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
13880 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
13890 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
138a0 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
138b0 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
138c0 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
138d0 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
138e0 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
138f0 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
13900 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
13910 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
13920 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
13930 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
13940 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
13950 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
13960 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
13970 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
13980 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
13990 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
139a0 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
139b0 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
139c0 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
139d0 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
139e0 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
139f0 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
13a00 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
13a10 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
13a20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
13a30 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
13a40 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
13a50 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
13a60 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
13a70 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
13a80 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
13a90 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ob separately..*
13aa0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
13ab0 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
13ac0 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
13ad0 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
13ae0 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
13af0 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
13b00 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
13b10 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
13b20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
13b30 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
13b40 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
13b50 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
13b80 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
13bb0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13bc0 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
13be0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
13bf0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
13c00 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
13c10 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
13c20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
13c30 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
13c60 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13c70 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
13c90 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13ca0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13cb0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
13cc0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
13cd0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
13ce0 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
13d10 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
13d20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
13d30 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
13d40 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
13d50 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
13d80 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
13d90 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
13da0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
13dd0 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
13de0 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
13df0 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
13e00 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
13e10 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
13e20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
13e30 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
13e40 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
13e50 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
13e60 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
13e70 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
13e80 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
13e90 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
13ea0 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
13eb0 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
13ec0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
13ed0 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
13ee0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
13ef0 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
13f00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
13f10 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
13f20 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
13f30 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
13f40 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e  Mem->flags;.  in
13f50 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  t n;..  if( flag
13f60 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
13f70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
13f80 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
13f90 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
13fa0 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
13fb0 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
13fc0 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
13fd0 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
13fe0 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
13ff0 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d  x00008000)<<32)-
14000 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
14010 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
14020 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30  4 u;.    if( i<0
14030 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c   ){.      if( i<
14040 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72  (-MAX_6BYTE) ) r
14050 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f  eturn 6;.      /
14060 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20  * Previous test 
14070 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d  prevents:  u = -
14080 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  (-92233720368547
14090 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20  75808) */.      
140a0 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73  u = -i;.    }els
140b0 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
140c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
140d0 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65  =127 ){.      re
140e0 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26  turn ((i&1)==i &
140f0 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
14100 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31  ) ? 8+(u32)u : 1
14110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14120 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
14130 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
14140 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
14150 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
14160 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
14170 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
14180 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
14190 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
141a0 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
141b0 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
141c0 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
141d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
141e0 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
141f0 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
14200 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
14210 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e  );.  n = pMem->n
14220 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
14230 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
14240 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
14250 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ro;.  }.  assert
14260 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( n>=0 );.  retu
14270 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
14280 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
14290 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
142a0 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
142b0 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
142c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
142d0 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
142e0 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
142f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14300 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
14310 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
14320 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
14330 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
14340 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
14350 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
14360 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
14370 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
14380 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
14390 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
143a0 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
143b0 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
143c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
143d0 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
143e0 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
143f0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
14400 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
14410 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
14420 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
14430 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
14440 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
14450 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
14460 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
14470 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
14480 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
14490 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
144a0 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
144b0 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
144c0 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
144d0 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
144e0 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
144f0 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
14500 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
14510 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
14520 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
14530 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
14540 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
14550 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
14560 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
14570 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
14580 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
14590 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
145a0 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
145b0 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
145c0 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
145d0 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
145e0 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
145f0 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
14600 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
14610 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
14620 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
14630 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
14640 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
14650 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
14660 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
14670 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
14680 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
14690 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
146a0 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
146b0 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
146c0 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
146d0 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
146e0 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
146f0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
14700 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
14710 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
14720 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
14730 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
14740 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
14750 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
14760 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
14770 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
14780 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
14790 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
147a0 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
147b0 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
147c0 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
147d0 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
147e0 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
147f0 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
14800 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
14810 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
14820 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
14830 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
14840 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
14850 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
14860 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
14870 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
14880 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
14890 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
148a0 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
148b0 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
148c0 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
148d0 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
148e0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
148f0 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
14900 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
14910 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
14920 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
14930 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
14940 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
14950 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
14960 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
14970 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
14980 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
14990 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
149a0 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
149b0 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
149c0 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
149d0 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
149e0 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
149f0 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
14a00 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
14a10 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
14a20 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
14a30 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
14a40 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
14a50 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
14a60 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
14a70 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
14a80 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
14a90 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
14aa0 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
14ab0 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
14ac0 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
14ad0 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
14ae0 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
14af0 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
14b00 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
14b10 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
14b20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
14b30 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
14b40 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
14b50 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
14b60 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
14b70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
14b80 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
14b90 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
14ba0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
14bb0 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
14bc0 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
14bd0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
14be0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
14bf0 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
14c00 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
14c10 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14c20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
14c30 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
14c40 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
14c50 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
14c60 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79   nBuf must alway
14c70 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e  s be.** large en
14c80 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
14c90 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20   entire field.  
14ca0 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66  Except, if the f
14cb0 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f  ield is.** a blo
14cc0 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69  b with a zero-fi
14cd0 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20  lled tail, then 
14ce0 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a  buf[] might be j
14cf0 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a  ust the right.**
14d00 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76   size to hold ev
14d10 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20  erything except 
14d20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c  for the zero-fil
14d30 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75  led tail.  If bu
14d40 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62  f[].** is only b
14d50 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
14d60 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70  d the non-zero p
14d70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79  refix, then only
14d80 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70   write that.** p
14d90 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d  refix into buf[]
14da0 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20  .  But if buf[] 
14db0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
14dc0 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65  to hold both the
14dd0 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74  .** prefix and t
14de0 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69  he tail then wri
14df0 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e  te the prefix an
14e00 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74  d set the tail t
14e10 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a  o all.** zeros..
14e20 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
14e30 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
14e40 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
14e50 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
14e60 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
14e70 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
14e80 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
14e90 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
14ea0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
14eb0 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
14ec0 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
14ed0 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
14ee0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
14ef0 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
14f00 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a   int nBuf, Mem *
14f10 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
14f20 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65  ormat){.  u32 se
14f30 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69  rial_type = sqli
14f40 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14f50 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72  e(pMem, file_for
14f60 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  mat);.  u32 len;
14f70 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
14f80 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
14f90 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
14fa0 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
14fb0 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
14fc0 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
14fd0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
14fe0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14ff0 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
15000 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a  eof(pMem->r) );.
15010 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
15020 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f   &pMem->r, sizeo
15030 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
15040 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
15050 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
15060 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
15070 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
15080 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
15090 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
150a0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
150b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e  .    assert( len
150c0 3c 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20  <=(u32)nBuf );. 
150d0 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
150e0 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
150f0 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
15100 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
15110 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
15120 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
15130 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
15140 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
15150 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
15160 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
15170 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
15180 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
15190 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
151a0 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
151b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
151c0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
151d0 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pe) );.    asser
151e0 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66  t( pMem->n<=nBuf
151f0 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
15200 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
15210 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
15220 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  len);.    if( pM
15230 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
15240 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65  Zero ){.      le
15250 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
15260 72 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ro;.      assert
15270 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20  ( nBuf>=0 );.   
15280 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33     if( len > (u3
15290 32 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  2)nBuf ){.      
152a0 20 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75    len = (u32)nBu
152b0 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
152c0 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
152d0 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
152e0 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
152f0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
15300 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
15310 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
15320 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
15330 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
15340 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
15350 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
15360 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
15370 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
15380 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
15390 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
153a0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
153b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
153c0 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  d..*/ .u32 sqlit
153d0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
153e0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
153f0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
15400 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
15410 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
15420 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
15430 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
15440 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
15450 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
15460 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
15490 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
154a0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
154b0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
154c0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
154d0 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
154e0 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
154f0 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
15500 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
15510 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
15520 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
15530 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
15540 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15550 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
15560 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15570 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
15580 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
15590 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
155a0 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
155b0 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
155c0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
155d0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
155e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
155f0 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
15600 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
15610 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
15620 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
15630 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
15640 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
15650 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15660 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15670 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
15680 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
15690 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
156a0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
156b0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
156c0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
156d0 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
156e0 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
156f0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
15700 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15710 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
15720 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
15730 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
15740 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15750 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
15760 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
15770 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
15780 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
15790 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
157a0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
157b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
157c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
157d0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
157e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
157f0 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
15800 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
15810 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
15820 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
15830 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
15840 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
15850 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
15860 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
15870 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
15880 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
15890 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
158a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
158b0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
158c0 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
158d0 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
158e0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
158f0 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
15900 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
15910 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
15920 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
15930 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
15940 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
15950 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
15960 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
15970 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
15980 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
15990 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
159a0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
159b0 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
159c0 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
159d0 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
159e0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
159f0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
15a00 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
15a10 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
15a20 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
15a30 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
15a40 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
15a50 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
15a60 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
15a70 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
15a80 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
15a90 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
15aa0 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
15ab0 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
15ac0 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
15ad0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
15ae0 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
15af0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
15b00 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
15b10 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
15b20 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
15b30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
15b40 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
15b50 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
15b60 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
15b70 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
15b80 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
15b90 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
15ba0 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
15bb0 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
15bc0 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
15bd0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
15be0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
15bf0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
15c00 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
15c10 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15c20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
15c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
15c40 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
15c50 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
15c60 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
15c70 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
15c80 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
15c90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
15ca0 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
15cb0 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
15cc0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
15cd0 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72  te3IsNaN(pMem->r
15ce0 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
15cf0 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
15d00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
15d10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15d20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
15d30 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
15d40 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
15d50 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
15d60 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
15d70 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
15d80 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15d90 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
15da0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
15db0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33  ault: {.      u3
15dc0 32 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  2 len = (serial_
15dd0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
15de0 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
15df0 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
15e00 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
15e10 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
15e20 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
15e30 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
15e40 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
15e50 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
15e60 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
15e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15e80 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15e90 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
15ea0 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
15eb0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
15ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15ed0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
15ee0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
15ef0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
15f00 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
15f10 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64   for an Unpacked
15f20 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
15f30 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ure large enough
15f40 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
15f50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
15f60 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a  rdUnpack() if.**
15f70 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15f80 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
15f90 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75   to KeyInfo stru
15fa0 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a  cture pKeyInfo..
15fb0 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20  **.** The space 
15fc0 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61  is either alloca
15fd0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
15fe0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f  3DbMallocRaw() o
15ff0 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  r from within.**
16000 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62   the unaligned b
16010 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61  uffer passed via
16020 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   the second and 
16030 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20  third arguments 
16040 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73  (presumably.** s
16050 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20  tack space). If 
16060 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
16070 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
16080 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61  to a pointer tha
16090 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65  t should.** be e
160a0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
160b0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
160c0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
160d0 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  e(). Or, if the 
160e0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  .** allocation c
160f0 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53  omes from the pS
16100 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66  pace/szSpace buf
16110 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20  fer, *ppFree is 
16120 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62  set to NULL.** b
16130 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16140 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
16150 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
16160 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
16170 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  .*/.UnpackedReco
16180 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  rd *sqlite3VdbeA
16190 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
161a0 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  rd(.  KeyInfo *p
161b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
161c0 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70        /* Descrip
161d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f  tion of the reco
161e0 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  rd */.  char *pS
161f0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
16200 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69          /* Unali
16210 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c  gned space avail
16220 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  able */.  int sz
16230 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
16240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16250 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e  e of pSpace[] in
16260 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
16270 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20   **ppFree       
16280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16290 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c  UT: Caller shoul
162a0 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e  d free this poin
162b0 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61  ter */.){.  Unpa
162c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20  ckedRecord *p;  
162d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
162e0 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
162f0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
16300 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t nOff;         
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16320 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63   Increment pSpac
16330 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69  e by nOff to ali
16340 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  gn it */.  int n
16350 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
16360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16370 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
16380 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f  quired for *p */
16390 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74  ..  /* We want t
163a0 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
163b0 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
163c0 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
163d0 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
163e0 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
163f0 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
16400 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
16410 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
16420 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
16430 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
16440 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
16450 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
16460 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
16470 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
16480 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
16490 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
164a0 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20  )) & 7;.  nByte 
164b0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
164c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
164d0 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
164e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
164f0 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  +1);.  if( nByte
16500 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b  >szSpace+nOff ){
16510 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
16520 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74  edRecord *)sqlit
16530 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b  e3DbMallocRaw(pK
16540 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74  eyInfo->db, nByt
16550 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  e);.    *ppFree 
16560 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20  = (char *)p;.   
16570 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
16580 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
16590 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
165a0 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f  cord*)&pSpace[nO
165b0 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  ff];.    *ppFree
165c0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e   = 0;.  }..  p->
165d0 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28  aMem = (Mem*)&((
165e0 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28  char*)p)[ROUND8(
165f0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
16600 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65  ecord))];.  asse
16610 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
16620 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
16630 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
16640 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
16650 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
16660 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72  >nField + 1;.  r
16670 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
16680 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79  * Given the nKey
16690 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f  -byte encoding o
166a0 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b  f a record in pK
166b0 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74  ey[], populate t
166c0 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52  he .** UnpackedR
166d0 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
166e0 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
166f0 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
16700 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e   with the.** con
16710 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63  tents of the dec
16720 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20  oded record..*/ 
16730 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16740 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20  eRecordUnpack(. 
16750 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16760 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  fo,     /* Infor
16770 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
16780 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a   record format *
16790 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20  /.  int nKey,   
167a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
167b0 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79  ze of the binary
167c0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
167d0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
167e0 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72      /* The binar
167f0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e  y record */.  Un
16800 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20  packedRecord *p 
16810 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
16820 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
16830 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
16840 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  . */.){.  const 
16850 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
16860 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
16870 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
16880 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75  y;.  int d; .  u
16890 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  32 idx;         
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
168b0 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79  * Offset in aKey
168c0 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  [] to read from 
168d0 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20  */.  u16 u;     
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168f0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
16900 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
16910 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
16920 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *pMem = p->a
16930 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73  Mem;..  p->flags
16940 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
16950 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
16960 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20  MENT(pMem) );.  
16970 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
16980 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
16990 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75    d = szHdr;.  u
169a0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
169b0 64 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d  dx<szHdr && u<p-
169c0 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b  >nField && d<=nK
169d0 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
169e0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
169f0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
16a00 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
16a10 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
16a20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
16a30 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
16a40 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
16a50 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
16a60 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
16a70 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
16a80 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
16a90 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
16aa0 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61  */.    pMem->zMa
16ab0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20  lloc = 0;.    d 
16ac0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
16ad0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
16ae0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
16af0 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
16b00 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20  ;.    u++;.  }. 
16b10 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
16b20 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
16b30 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
16b40 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = u;.}../*.** Th
16b50 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
16b60 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
16b70 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
16b80 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
16b90 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
16ba0 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
16bb0 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
16bc0 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
16bd0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
16be0 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
16bf0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
16c00 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
16c10 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
16c20 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
16c30 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
16c40 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
16c50 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
16c60 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
16c70 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
16c80 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
16c90 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
16ca0 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
16cb0 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
16cc0 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
16cd0 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
16ce0 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
16cf0 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
16d00 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16d10 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65  f fields..** The
16d20 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20   key with fewer 
16d30 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c  fields is usuall
16d40 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20  y compares less 
16d50 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e  than the .** lon
16d60 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65  ger key.  Howeve
16d70 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
16d80 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20  D_INCRKEY flags 
16d90 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74  in pPKey2 is set
16da0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d  .** and the comm
16db0 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20  on prefixes are 
16dc0 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31  equal, then key1
16dd0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65   is less than ke
16de0 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65  y2..** Or if the
16df0 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f   UNPACKED_MATCH_
16e00 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73  PREFIX flag is s
16e10 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69  et and the prefi
16e20 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  xes are.** equal
16e30 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20  , then the keys 
16e40 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
16e50 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a  o be equal and.*
16e60 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f  * the parts beyo
16e70 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
16e80 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64  efix are ignored
16e90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16ea0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
16eb0 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
16ec0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
16ed0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
16ee0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
16ef0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
16f00 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
16f10 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
16f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
16f30 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
16f40 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
16f50 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
16f60 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
16f70 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
16f80 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
16f90 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
16fa0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
16fb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
16fc0 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
16fd0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
16fe0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
16ff0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
17000 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
17010 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
17020 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
17030 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
17040 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
17050 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
17060 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
17070 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
17080 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
17090 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
170a0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
170b0 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
170c0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
170d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
170e0 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
170f0 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c  _ONLY( mem1.zMal
17100 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
17110 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
17120 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
17130 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
17140 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
17150 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
17160 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
17170 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
17180 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
17190 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
171a0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
171b0 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
171c0 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
171d0 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
171e0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
171f0 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
17200 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
17210 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
17220 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
17230 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
17240 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
17250 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
17260 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
17270 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
17280 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
17290 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
172a0 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
172b0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
172c0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
172d0 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
172e0 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
172f0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
17300 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
17310 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
17320 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
17330 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
17340 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
17350 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
17360 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31  1, szHdr1);.  d1
17370 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
17380 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
17390 46 69 65 6c 64 2b 31 3e 3d 70 50 4b 65 79 32 2d  Field+1>=pPKey2-
173a0 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 61 73 73  >nField );.  ass
173b0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
173c0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
173d0 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
173e0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
173f0 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
17400 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
17410 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
17420 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
17430 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
17440 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
17450 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
17460 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
17470 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
17480 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
17490 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
174a0 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
174b0 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
174c0 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
174d0 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
174e0 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
174f0 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
17500 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
17510 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
17520 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
17530 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
17540 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
17550 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
17560 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
17570 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
17580 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
17590 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
175a0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
175b0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
175c0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
175d0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
175e0 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
175f0 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
17600 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
17610 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17620 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
17630 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
17640 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
17650 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17660 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
17670 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
17680 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
17690 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
176a0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
176b0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
176c0 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
176d0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
176e0 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
176f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
17700 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
17710 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
17720 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
17730 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
17740 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
17750 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
17760 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
17770 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
17780 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
17790 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
177a0 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
177b0 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
177c0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
177d0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
177e0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
177f0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
17800 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66      .      /* If
17810 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
17820 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  CH flag is set a
17830 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  nd all fields ex
17840 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  cept the final. 
17850 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69       ** rowid fi
17860 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20  eld were equal, 
17870 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50  then clear the P
17880 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
17890 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20  g and set .     
178a0 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69   ** pPKey2->rowi
178b0 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  d to the value o
178c0 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  f the rowid fiel
178d0 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65  d in (pKey1, nKe
178e0 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  y1)..      ** Th
178f0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
17900 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70  e OP_IsUnique op
17910 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  code..      */. 
17920 20 20 20 20 20 69 66 28 20 28 70 50 4b 65 79 32       if( (pPKey2
17930 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
17940 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
17950 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d  ) && i==(pPKey2-
17960 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20  >nField-1) ){.  
17970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
17980 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63  x1==szHdr1 && rc
17990 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
179a0 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  rt( mem1.flags &
179b0 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
179c0 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67      pPKey2->flag
179d0 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50  s &= ~UNPACKED_P
179e0 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
179f0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f        pPKey2->ro
17a00 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a  wid = mem1.u.i;.
17a10 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
17a20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17a30 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
17a40 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
17a50 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
17a60 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
17a70 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
17a80 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
17a90 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
17aa0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
17ab0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
17ac0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
17ad0 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
17ae0 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
17af0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
17b00 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
17b10 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
17b20 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
17b30 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
17b40 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
17b50 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
17b60 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
17b70 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
17b80 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
17b90 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
17ba0 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
17bb0 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67  NCRKEY.  ** flag
17bc0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72   is set, then br
17bd0 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74  eak the tie by t
17be0 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20  reating key2 as 
17bf0 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20  larger..  ** If 
17c00 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
17c10 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
17c20 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
17c30 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
17c40 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ixes.  ** are co
17c50 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
17c60 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
17c70 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
17c80 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61   is the .  ** la
17c90 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70  rger.  As it hap
17ca0 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32  pens, the pPKey2
17cb0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
17cc0 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20  the longer.  ** 
17cd0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
17ce0 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
17cf0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
17d00 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
17d10 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
17d20 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
17d30 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
17d40 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
17d50 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
17d60 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
17d70 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30    /* Leave rc==0
17d80 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
17d90 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20  idx1<szHdr1 ){. 
17da0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
17db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
17dc0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
17dd0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
17de0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
17df0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
17e00 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
17e10 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
17e20 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
17e30 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
17e40 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
17e50 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
17e60 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
17e70 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
17e80 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
17e90 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
17ea0 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
17eb0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
17ec0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
17ed0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
17ee0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
17ef0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
17f00 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
17f10 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
17f20 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
17f30 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
17f40 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
17f50 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
17f60 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
17f70 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
17f80 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
17f90 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
17fa0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
17fb0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
17fc0 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
17fd0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
17fe0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
17ff0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
18000 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
18010 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
18020 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
18030 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18040 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
18050 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
18060 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
18070 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
18080 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
18090 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
180a0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
180b0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
180c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
180d0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
180e0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
180f0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
18100 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
18110 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
18120 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
18130 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
18140 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
18150 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
18160 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18170 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
18180 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
18190 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
181a0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
181b0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
181c0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
181d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
181e0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
181f0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
18200 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
18210 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
18220 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
18230 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
18240 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
18250 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
18260 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
18270 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18280 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ry */.  memset(&
18290 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
182a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
182b0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
182c0 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e  (pCur, 0, (int)n
182d0 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
182e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
182f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18300 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
18310 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
18320 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
18330 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
18340 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
18350 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
18360 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
18370 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
18380 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
18390 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
183a0 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
183b0 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
183c0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
183d0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
183e0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
183f0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
18400 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
18410 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
18420 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
18430 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
18440 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
18450 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
18460 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
18470 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
18480 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
18490 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
184a0 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
184b0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
184c0 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
184d0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
184e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
184f0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
18500 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18510 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
18520 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18530 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
18540 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
18550 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18560 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
18570 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
18580 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
18590 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
185a0 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
185b0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
185c0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
185d0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
185e0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
185f0 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
18600 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
18610 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
18620 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
18630 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
18640 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
18650 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
18660 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
18670 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
18680 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
18690 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
186a0 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
186b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
186c0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
186d0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
186e0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
186f0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
18700 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
18710 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18720 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18730 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
18740 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
18750 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
18760 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
18770 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
18780 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
18790 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
187a0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
187b0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
187c0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
187d0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
187e0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
187f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
18800 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
18810 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18820 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
18830 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
18840 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
18850 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
18860 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
18870 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
18880 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
18890 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
188a0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
188b0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
188c0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
188d0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
188e0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
188f0 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
18900 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
18910 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
18920 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18930 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
18940 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
18950 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
18960 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
18970 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
18980 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
18990 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
189a0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
189b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
189c0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
189d0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
189e0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
189f0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
18a00 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
18a10 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
18a20 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
18a30 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
18a40 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
18a50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
18a60 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
18a70 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  (.  VdbeCursor *
18a80 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
18a90 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
18aa0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
18ab0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
18ac0 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
18ad0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
18ae0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20  rsion of key to 
18af0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
18b00 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
18b30 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
18b40 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
18b50 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
18b60 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
18b70 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
18b80 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d  pCursor;.  Mem m
18b90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
18ba0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
18bb0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
18bc0 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
18bd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
18be0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
18bf0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
18c00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18c10 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
18c20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
18c30 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
18c40 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
18c50 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
18c60 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
18c70 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
18c80 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
18c90 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
18ca0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
18cb0 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
18cc0 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
18cd0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
18ce0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
18cf0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
18d00 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
18d10 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
18d20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18d30 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
18d40 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
18d50 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
18d60 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
18d70 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
18d80 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
18d90 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
18da0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
18db0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
18dc0 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
18dd0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
18de0 52 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20  REFIX_MATCH );. 
18df0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
18e00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
18e10 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
18e20 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
18e30 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
18e40 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
18e50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18e60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
18e70 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
18e80 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
18e90 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
18ea0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
18eb0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
18ec0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
18ed0 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
18ee0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
18ef0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
18f00 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
18f10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18f20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
18f30 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
18f40 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
18f50 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
18f60 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
18f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
18f80 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
18f90 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
18fa0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
18fb0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
18fc0 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
18fd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18fe0 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
18ff0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
19000 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
19010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
19020 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
19030 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
19040 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
19050 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
19060 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
19070 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
19080 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
19090 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
190a0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
190b0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
190c0 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
190d0 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
190e0 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
190f0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
19100 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
19110 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
19120 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
19130 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
19140 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
19150 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
19160 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
19170 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
19180 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
19190 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
191a0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
191b0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
191c0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
191d0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
191e0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
191f0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
19200 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
19210 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
19220 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
19230 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
19240 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
19250 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19260 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
19270 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
19280 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
19290 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
192a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
192b0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
192c0 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
192d0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
192e0 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
192f0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
19300 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
19310 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
19320 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
19330 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
19340 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
19350 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
19360 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
19370 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
19380 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
19390 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
193a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
193b0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
193c0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
193d0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
193e0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
193f0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19400 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
19410 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
19420 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
19430 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
19440 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
19450 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
19460 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
19470 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
19480 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
19490 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
194a0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
194b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
194c0 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
194d0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
194e0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
194f0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
19500 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
19510 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
19520 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
19530 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
19540 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
19550 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
19560 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19570 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
19580 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b  pe((Mem *)pRet);
19590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
195a0 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
195b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
195c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
195d0 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
195e0 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
195f0 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
19600 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
19610 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
19620 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
19630 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
19640 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
19650 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
19660 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
19670 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19680 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
19690 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
196a0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
196b0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
196c0 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
196d0 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
196e0 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
196f0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
19700 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
19710 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a           r-1));.  }.}.