/ Hex Artifact Content
Login

Artifact 20ec92cdc43374b6537fbd7bc2cf7a28967bbe44:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33  beCreate(sqlite3
0320: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
0330: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  ;.  p = sqlite3D
0340: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
0350: 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a  sizeof(Vdbe) );.
0360: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0370: 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d  urn 0;.  p->db =
0380: 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70   db;.  if( db->p
0390: 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  Vdbe ){.    db->
03a0: 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70  pVdbe->pPrev = p
03b0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74  ;.  }.  p->pNext
03c0: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
03d0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
03e0: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20  db->pVdbe = p;. 
03f0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
0400: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
0410: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
0420: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53  * Remember the S
0430: 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20  QL string for a 
0440: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0450: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
0460: 74 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64  te3VdbeSetSql(Vd
0470: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
0480: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  r *z, int n, int
0490: 20 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20   isPrepareV2){. 
04a0: 20 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61   assert( isPrepa
04b0: 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65  reV2==1 || isPre
04c0: 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69  pareV2==0 );.  i
04d0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
04e0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
04f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0500: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0510: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
0520: 47 29 0a 20 20 69 66 28 20 21 69 73 50 72 65 70  G).  if( !isPrep
0530: 61 72 65 56 32 20 29 20 72 65 74 75 72 6e 3b 0a  areV2 ) return;.
0540: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
0550: 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20   p->zSql==0 );. 
0560: 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74   p->zSql = sqlit
0570: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
0580: 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69  b, z, n);.  p->i
0590: 73 50 72 65 70 61 72 65 56 32 20 3d 20 28 75 38  sPrepareV2 = (u8
05a0: 29 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  )isPrepareV2;.}.
05b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
05c0: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
05d0: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
05e0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
05f0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0600: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0610: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 56 64  mt *pStmt){.  Vd
0620: 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29  be *p = (Vdbe *)
0630: 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  pStmt;.  return 
0640: 28 70 20 26 26 20 70 2d 3e 69 73 50 72 65 70 61  (p && p->isPrepa
0650: 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53 71 6c 20  reV2) ? p->zSql 
0660: 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  : 0;.}../*.** Sw
0670: 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  ap all content b
0680: 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20  etween two VDBE 
0690: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
06a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
06b0: 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64  wap(Vdbe *pA, Vd
06c0: 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20  be *pB){.  Vdbe 
06d0: 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68  tmp, *pTmp;.  ch
06e0: 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65  ar *zTmp;.  asse
06f0: 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e  rt( pA->db==pB->
0700: 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70  db );.  tmp = *p
0710: 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a  A;.  *pA = *pB;.
0720: 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70    *pB = tmp;.  p
0730: 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b  Tmp = pA->pNext;
0740: 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pA->pNext = p
0750: 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e  B->pNext;.  pB->
0760: 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20  pNext = pTmp;.  
0770: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76  pTmp = pA->pPrev
0780: 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20  ;.  pA->pPrev = 
0790: 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d  pB->pPrev;.  pB-
07a0: 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20  >pPrev = pTmp;. 
07b0: 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c   zTmp = pA->zSql
07c0: 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70  ;.  pA->zSql = p
07d0: 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a  B->zSql;.  pB->z
07e0: 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42  Sql = zTmp;.  pB
07f0: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0800: 70 41 2d 3e 69 73 50 72 65 70 61 72 65 56 32 3b  pA->isPrepareV2;
0810: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0820: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75  E_DEBUG./*.** Tu
0830: 72 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72  rn tracing on or
0840: 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   off.*/.void sql
0850: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64  ite3VdbeTrace(Vd
0860: 62 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61  be *p, FILE *tra
0870: 63 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20  ce){.  p->trace 
0880: 3d 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69  = trace;.}.#endi
0890: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  f../*.** Resize 
08a0: 74 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72  the Vdbe.aOp arr
08b0: 61 79 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  ay so that it is
08c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
08d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a   larger than .**
08e0: 20 69 74 20 77 61 73 2e 0a 2a 2a 0a 2a 2a 20 49   it was..**.** I
08f0: 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  f an out-of-memo
0900: 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ry error occurs 
0910: 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74  while resizing t
0920: 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  he array, return
0930: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
0940: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56  . In this case V
0950: 64 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65  dbe.aOp and Vdbe
0960: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
0970: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28   .** unchanged (
0980: 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  this is so that 
0990: 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65  any opcodes alre
09a0: 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  ady allocated ca
09b0: 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74  n be .** correct
09c0: 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61  ly deallocated a
09d0: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65  long with the re
09e0: 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e  st of the Vdbe).
09f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0a00: 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20  rowOpArray(Vdbe 
0a10: 2a 70 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70  *p){.  VdbeOp *p
0a20: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  New;.  int nNew 
0a30: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  = (p->nOpAlloc ?
0a40: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0a50: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65   (int)(1024/size
0a60: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77  of(Op)));.  pNew
0a70: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a80: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  loc(p->db, p->aO
0a90: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
0aa0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ab0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ac0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
0ad0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
0ae0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29  pNew)/sizeof(Op)
0af0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70  ;.    p->aOp = p
0b00: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
0b10: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45  n (pNew ? SQLITE
0b20: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
0b30: 45 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  EM);.}../*.** Ad
0b40: 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74  d a new instruct
0b50: 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ion to the list 
0b60: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  of instructions 
0b70: 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a  current in the.*
0b80: 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20  * VDBE.  Return 
0b90: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0ba0: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
0bb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  on..**.** Parame
0bc0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ters:.**.**    p
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
0be0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44  ointer to the VD
0bf0: 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20  BE.**.**    op  
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
0c10: 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  opcode for this 
0c20: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a  instruction.**.*
0c30: 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20  *    p1, p2, p3 
0c40: 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a       Operands.**
0c50: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
0c60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
0c70: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  bel() function t
0c80: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73  o fix an address
0c90: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69   and.** the sqli
0ca0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0cb0: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68  ) function to ch
0cc0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
0cd0: 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72  f the P4.** oper
0ce0: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
0cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64  te3VdbeAddOp3(Vd
0d00: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0d10: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
0d20: 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b  nt p3){.  int i;
0d30: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
0d40: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  .  i = p->nOp;. 
0d50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
0d60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
0d70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
0d80: 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20  op>0 && op<0xff 
0d90: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41  );.  if( p->nOpA
0da0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69  lloc<=i ){.    i
0db0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
0dc0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0dd0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
0de0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
0df0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
0e00: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
0e10: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
0e20: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0e30: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0e40: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0e50: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0e60: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0e70: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0e80: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
0e90: 5f 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43  _DEBUG.  pOp->zC
0ea0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66  omment = 0;.  if
0eb0: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
0ec0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
0ed0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pTrace ){.    sq
0ee0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
0ef0: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
0f00: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ]);.  }.#endif.#
0f10: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
0f20: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
0f30: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
0f40: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
0f50: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
0f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
0f70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0f80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
0f90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
0fa0: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
0fb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0fc0: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
0fd0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
0fe0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
0ff0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1000: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1030: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1040: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1060: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1070: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1080: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1090: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
10a0: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
10b0: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
10c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10d0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
10e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
10f0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1100: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1120: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1130: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1150: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1160: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1170: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1180: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11a0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
11b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11c0: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
11d0: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
11e0: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
11f0: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
1200: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
1210: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1220: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1230: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1250: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
1260: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
1270: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1280: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50  *.** Add an OP_P
1290: 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64  arseSchema opcod
12a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
12b0: 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66   is broken out f
12c0: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
12d0: 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65  beAddOp4() since
12e0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73   it needs to als
12f0: 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20  o needs to mark 
1300: 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73  all btrees.** as
1310: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65   having been use
1320: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68  d..**.** The zWh
1330: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ere string must 
1340: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
1350: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1360: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69  malloc()..** Thi
1370: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74  s routine will t
1380: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ake ownership of
1390: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
13a0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  emory..*/.void s
13b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
13c0: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20  seSchemaOp(Vdbe 
13d0: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61  *p, int iDb, cha
13e0: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *zWhere){.  in
13f0: 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20  t j;.  int addr 
1400: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1410: 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(p, OP_ParseS
1420: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
1430: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1440: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1450: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
1460: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
1470: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
1480: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
1490: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
14a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
14b0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
14c0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
14d0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
14e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1500: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1510: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1520: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1530: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1550: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1560: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1570: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1580: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1590: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
15a0: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
15b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15d0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
15e0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
15f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1600: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
1610: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
1620: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1630: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1640: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1660: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1670: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1680: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1690: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
16a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
16b0: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
16c0: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
16d0: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
16e0: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
16f0: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1700: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
1710: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
1720: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
1730: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
1740: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
1750: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
1760: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1770: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1780: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1790: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
17a0: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
17b0: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
17c0: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
17d0: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
17e0: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
17f0: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1800: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
1810: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
1820: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
1830: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
1840: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1850: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
1860: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1870: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1880: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1890: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
18a0: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
18b0: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
18c0: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
18d0: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
18e0: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
18f0: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1900: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
1910: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
1920: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1930: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
1940: 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61    int i = p->nLa
1950: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1960: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1970: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
1980: 69 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d  if( (i & (i-1))=
1990: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  =0 ){.    p->aLa
19a0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52  bel = sqlite3DbR
19b0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e  eallocOrFree(p->
19c0: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a  db, p->aLabel, .
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73         (i*2+1)*s
1a00: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
1a10: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1a20: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1a30: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
1a40: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1a50: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
1a60: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
1a70: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
1a80: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
1a90: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
1aa0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
1ab0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
1ac0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
1ad0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1ae0: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
1af0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
1b00: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
1b10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1b20: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1b30: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
1b40: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
1b50: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1b60: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d  ;.  assert( j<p-
1b80: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1b90: 20 6a 3e 3d 30 20 26 26 20 70 2d 3e 61 4c 61 62   j>=0 && p->aLab
1ba0: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1bb0: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
1bc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1bd0: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
1be0: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
1bf0: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
1c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c10: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
1c20: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
1c30: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
1c40: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1c50: 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74  E_DEBUG /* sqlit
1c60: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
1c70: 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a  () logic */../*.
1c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1c90: 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69   type and functi
1ca0: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  on are used to i
1cb0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
1cc0: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e  ll opcodes.** in
1cd0: 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f   a Vdbe main pro
1ce0: 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66  gram and each of
1cf0: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
1d00: 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20  s (triggers) it 
1d10: 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64  may .** invoke d
1d20: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
1d30: 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64  ectly. It should
1d40: 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c   be used as foll
1d50: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20  ows:.**.**   Op 
1d60: 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f  *pOp;.**   VdbeO
1d70: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a  pIter sIter;.**.
1d80: 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74  **   memset(&sIt
1d90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
1da0: 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65  ter));.**   sIte
1db0: 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20  r.v = v;        
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74      // v is of t
1de0: 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20  ype Vdbe* .**   
1df0: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
1e00: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
1e10: 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44  ) ){.**     // D
1e20: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68  o something with
1e30: 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20   pOp.**   }.**  
1e40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
1e50: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
1e60: 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64  b);.** .*/.typed
1e70: 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70  ef struct VdbeOp
1e80: 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b  Iter VdbeOpIter;
1e90: 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74  .struct VdbeOpIt
1ea0: 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  er {.  Vdbe *v; 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65    /* Vdbe to ite
1ed0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1ee0: 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20   opcodes of */. 
1ef0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
1f00: 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  Sub;        /* A
1f10: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
1f20: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  ams */.  int nSu
1f30: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75   entries in apSu
1f60: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72  b */.  int iAddr
1f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f80: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1f90: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
1fa0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1fb0: 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20  int iSub;       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1fd0: 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  = main program, 
1fe0: 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72  1 = first sub-pr
1ff0: 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b  ogram etc. */.};
2000: 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74  .static Op *opIt
2010: 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65  erNext(VdbeOpIte
2020: 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76  r *p){.  Vdbe *v
2030: 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70   = p->v;.  Op *p
2040: 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61  Ret = 0;.  Op *a
2050: 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a  Op;.  int nOp;..
2060: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70    if( p->iSub<=p
2070: 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69  ->nSub ){..    i
2080: 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b  f( p->iSub==0 ){
2090: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e  .      aOp = v->
20a0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
20b0: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c   v->nOp;.    }el
20c0: 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20  se{.      aOp = 
20d0: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
20e0: 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  -1]->aOp;.      
20f0: 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  nOp = p->apSub[p
2100: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a  ->iSub-1]->nOp;.
2110: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2120: 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29  ( p->iAddr<nOp )
2130: 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61  ;..    pRet = &a
2140: 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20  Op[p->iAddr];.  
2150: 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20    p->iAddr++;.  
2160: 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d    if( p->iAddr==
2170: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  nOp ){.      p->
2180: 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d  iSub++;.      p-
2190: 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  >iAddr = 0;.    
21a0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65  }.  .    if( pRe
21b0: 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  t->p4type==P4_SU
21c0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
21d0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
21e0: 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66  ->nSub+1)*sizeof
21f0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
2200: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2210: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
2220: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
2230: 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62      if( p->apSub
2240: 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50  [j]==pRet->p4.pP
2250: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
2260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2270: 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  ( j==p->nSub ){.
2280: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
2290: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
22a0: 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c  locOrFree(v->db,
22b0: 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65   p->apSub, nByte
22c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
22d0: 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20  p->apSub ){.    
22e0: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
22f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2300: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75           p->apSu
2310: 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70  b[p->nSub++] = p
2320: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2330: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2340: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2350: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
2360: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
2370: 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72  the program stor
2380: 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73  ed in the VM ass
2390: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61  ociated with pPa
23a0: 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  rse may.** throw
23b0: 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
23c0: 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65  ion (causing the
23d0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
23e0: 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73  not entire trans
23f0: 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  action.** to be 
2400: 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68  rolled back). Th
2410: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
2420: 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  true if the main
2430: 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a   program or any.
2440: 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  ** sub-programs 
2450: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20  contains any of 
2460: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2470: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  *.**   *  OP_Hal
2480: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  t with P1=SQLITE
2490: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
24a0: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
24b0: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75    *  OP_HaltIfNu
24c0: 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  ll with P1=SQLIT
24d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
24e0: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
24f0: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79     *  OP_Destroy
2500: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64  .**   *  OP_VUpd
2510: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  ate.**   *  OP_V
2520: 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f  Rename.**   *  O
2530: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68  P_FkCounter with
2540: 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74   P2==0 (immediat
2550: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
2560: 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20  nstraint).**.** 
2570: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
2580: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
2590: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
25a0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
25b0: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
25c0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
25d0: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
25e0: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
25f0: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
2600: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
2610: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
2620: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
2630: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
2640: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
2650: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
2660: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
2670: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
2680: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
2690: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
26a0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
26b0: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
26c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
26d0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
26e0: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
26f0: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
2700: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  bort = 0;.  Op *
2710: 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65  pOp;.  VdbeOpIte
2720: 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65  r sIter;.  memse
2730: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2740: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73  eof(sIter));.  s
2750: 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77  Iter.v = v;..  w
2760: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
2770: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
2780: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  !=0 ){.    int o
2790: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
27a0: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  ode;.    if( opc
27b0: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
27c0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
27d0: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
27e0: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66  =OP_VRename .#if
27f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2800: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
2810: 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50    || (opcode==OP
2820: 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f  _FkCounter && pO
2830: 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d  p->p1==0 && pOp-
2840: 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a  >p2==1) .#endif.
2850: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
2860: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
2870: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
2880: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
2890: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
28a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
28b0: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
28c0: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
28d0: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
28e0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
28f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2900: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
2910: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
2920: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
2930: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
2940: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
2950: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2960: 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66  ccurred..  ** If
2970: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2980: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2990: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
29a0: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
29b0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
29c0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
29d0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
29e0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
29f0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2a00: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2a10: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
2a20: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
2a30: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
2a40: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
2a50: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
2a60: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2a70: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2a80: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2a90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2aa0: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2ab0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2ac0: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2ad0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2ae0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2af0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2b00: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2b10: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
2b20: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2b30: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
2b40: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
2b50: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
2b60: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
2b70: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2b80: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2b90: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2bb0: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2bc0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2bd0: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2be0: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2bf0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2c00: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2c10: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2c20: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2c30: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2c40: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2c50: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2c60: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2c70: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2c80: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2c90: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2ca0: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2cb0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2cc0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2cd0: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2cf0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2d00: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2d10: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2d20: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2d30: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2d40: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2d50: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2d60: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2d70: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2d80: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
2d90: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
2da0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
2db0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
2dc0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
2dd0: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
2de0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
2df0: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
2e00: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
2e10: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
2e20: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
2e30: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
2e40: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
2e50: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
2e60: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75        case OP_Fu
2e70: 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61  nction:.      ca
2e80: 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
2e90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
2ea0: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
2eb0: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
2ec0: 70 35 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p5;.        brea
2ed0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2ee0: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
2ef0: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
2f00: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
2f10: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2f20: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
2f30: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
2f40: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
2f50: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
2f60: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
2f70: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
2f80: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
2f90: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2fa0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
2fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2fc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
2fd0: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
2fe0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
2ff0: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
3000: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
3010: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
3020: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
3030: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
3040: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
3050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
3060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3070: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
3080: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
3090: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
30a0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
30b0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
30c0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
30d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30e0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
30f0: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
3100: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
3110: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3120: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
3130: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
3140: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
3150: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
3160: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
3170: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
3180: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3190: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
31a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
31b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
31c0: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
31d0: 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72    case OP_Sorter
31e0: 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  Next: {.        
31f0: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3200: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
3210: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ext;.        pOp
3220: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
3230: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
3240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3250: 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76      case OP_Prev
3260: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
3270: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
3280: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
3290: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
32a0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
32b0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
32c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32d0: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
32e0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
32f0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
3300: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
3310: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
3320: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
3330: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
3340: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
3350: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
3360: 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   );.      pOp->p
3370: 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f  2 = aLabel[-1-pO
3380: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20  p->p2];.    }.  
3390: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
33a0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
33b0: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
33c0: 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e   = 0;.  *pMaxFun
33d0: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
33e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ;.  assert( p->b
33f0: 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 70  IsReader!=0 || p
3400: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3420: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
3430: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
3440: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
3450: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
3460: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3470: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
3480: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3490: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
34a0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
34b0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  >nOp;.}../*.** T
34c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
34d0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
34e0: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
34f0: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
3500: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
3510: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
3520: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3530: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
3540: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
3550: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
3560: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
3570: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
3580: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
3590: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
35a0: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
35b0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
35c0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
35d0: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
35e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
35f0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
3600: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
3610: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
3620: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
3630: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
3640: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
3650: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
3660: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
3670: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
3680: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
3690: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
36a0: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
36b0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
36c0: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
36d0: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
36e0: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
36f0: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
3700: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
3710: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
3720: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3730: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
3740: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
3750: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
3760: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
3770: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
3780: 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61  sert( p->btreeMa
3790: 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f  sk==0 );..  reso
37a0: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
37b0: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
37c0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
37d0: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
37e0: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
37f0: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
3800: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
3810: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
3820: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
3830: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
3840: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
3850: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
3860: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
3870: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
3880: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
3890: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
38a0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
38b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
38c0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
38d0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
38e0: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f  Op + nOp > p->nO
38f0: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
3900: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
3910: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3920: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
3930: 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e   if( ALWAYS(nOp>
3940: 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0) ){.    int i;
3950: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
3960: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
3970: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3980: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
3990: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
39a0: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
39b0: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
39c0: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
39d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
39e0: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
39f0: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
3a00: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
3a10: 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 28     if( p2<0 && (
3a20: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
3a30: 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f  perty[pOut->opco
3a40: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  de] & OPFLG_JUMP
3a50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3a60: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
3a70: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
3a80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3a90: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
3aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3ab0: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
3ac0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
3ad0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3ae0: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
3af0: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
3b00: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
3b10: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b20: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
3b30: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  mment = 0;.     
3b40: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
3b50: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
3b60: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
3b70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3b80: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
3b90: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
3ba0: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
3bb0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
3bc0: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
3bd0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
3be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3bf0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3c00: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
3c10: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3c20: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
3c30: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
3c40: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
3c50: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
3c60: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
3c70: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
3c80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3c90: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
3ca0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
3cb0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
3cc0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
3cd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3ce0: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
3cf0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
3d00: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3d10: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28   p!=0 );.  if( (
3d20: 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64  (u32)p->nOp)>add
3d30: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3d40: 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a  addr].p1 = val;.
3d50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3d60: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3d70: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
3d80: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3d90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3da0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3db0: 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e  seful for settin
3dc0: 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  g a jump destina
3dd0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3de0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3df0: 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  2(Vdbe *p, u32 a
3e00: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3e10: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3e20: 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e  .  if( ((u32)p->
3e30: 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20  nOp)>addr ){.   
3e40: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
3e50: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
3e60: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3e70: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
3e80: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3e90: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3ea0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3eb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3ec0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
3ed0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
3ee0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3ef0: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
3f00: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
3f10: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d  ->aOp[addr].p3 =
3f20: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
3f30: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3f40: 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70  lue of the P5 op
3f50: 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f  erand for the mo
3f60: 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61  st recently.** a
3f70: 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  dded operation..
3f80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3f90: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
3fa0: 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20   *p, u8 val){.  
3fb0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3fc0: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
3fd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
3fe0: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61  Op>0 );.    p->a
3ff0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
4000: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
4010: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
4020: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
4030: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
4040: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
4050: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
4060: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
4070: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
4080: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
4090: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
40a0: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
40b0: 61 64 64 72 29 7b 0a 20 20 69 66 28 20 41 4c 57  addr){.  if( ALW
40c0: 41 59 53 28 61 64 64 72 3e 3d 30 29 20 29 20 73  AYS(addr>=0) ) s
40d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
40e0: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
40f0: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  Op);.}.../*.** I
4100: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
4110: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
4120: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
4130: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
4140: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
4150: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
4160: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
4170: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
4180: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4190: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
41a0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
41b0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44  .  if( ALWAYS(pD
41c0: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c  ef) && (pDef->fl
41d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
41e0: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
41f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4200: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
4210: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
4220: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
4230: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
4240: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
4250: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
4260: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
4270: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4280: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
4290: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
42a0: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
42b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
42c0: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
42d0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
42e0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
42f0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
4300: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
4310: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
4320: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
4330: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4340: 49 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20  INTARRAY:.      
4350: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
4360: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
4370: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4380: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
4390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
43a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
43b0: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
43c0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
43d0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
43e0: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
43f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4400: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4410: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
4420: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4430: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4440: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4450: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4460: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4470: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4480: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4490: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
44a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
44b0: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
44c0: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
44d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
44e0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
44f0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
4500: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4510: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
4520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4530: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4560: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4570: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4580: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4590: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
45a0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
45b0: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
45c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
45e0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
45f0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
4600: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
4610: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
4620: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4630: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4640: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4650: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4660: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4670: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4680: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4690: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
46a0: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
46b0: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
46c0: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
46d0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
46e0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
46f0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
4700: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
4710: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4720: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4730: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4740: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4750: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4760: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4770: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4780: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4790: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
47a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
47b0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
47c0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
47d0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
47e0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
47f0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
4800: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
4810: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
4820: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4830: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4840: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4850: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4860: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4870: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4880: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4890: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
48a0: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
48b0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
48c0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
48d0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
48e0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
48f0: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
4900: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
4910: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4920: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
4930: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
4940: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4950: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4960: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4970: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4980: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72   = p->db;.    fr
4990: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
49a0: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
49b0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70  ;.    memset(pOp
49c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
49d0: 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f  0]));.    pOp->o
49e0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
49f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
4a00: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4a10: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
4a20: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4a30: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4a50: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
4a60: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
4a70: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4a80: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4a90: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4aa0: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4ab0: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4ac0: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4ad0: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4ae0: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
4af0: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
4b00: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
4b10: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
4b20: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
4b30: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
4b40: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4b50: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
4b60: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
4b70: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
4b80: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
4b90: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
4ba0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
4bb0: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
4bc0: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
4bd0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
4be0: 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP4..**.** If n=
4bf0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P4_KEYINFO it m
4c00: 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73  eans that zP4 is
4c10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4c20: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4c30: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
4c40: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
4c50: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
4c60: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4c70: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
4c80: 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  e3_malloc, to be
4c90: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4ca0: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
4cb0: 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49  d..** n==P4_KEYI
4cc0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
4cd0: 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70  cates that zP4 p
4ce0: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
4cf0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
4d00: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
4d10: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
4d20: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
4d30: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4d40: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
4d50: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
4d60: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
4d70: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
4d80: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
4d90: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
4da0: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
4db0: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
4dc0: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
4dd0: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
4de0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4df0: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
4e00: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
4e10: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
4e20: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
4e30: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
4e40: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
4e50: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
4e60: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
4e70: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
4e80: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
4e90: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
4ea0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
4eb0: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
4ec0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4ed0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
4ee0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
4ef0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
4f00: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
4f10: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
4f20: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
4f30: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
4f40: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
4f50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4f60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
4f70: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
4f80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4f90: 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f  .    if ( n!=P4_
4fa0: 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34  KEYINFO && n!=P4
4fb0: 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20  _VTAB ) {.      
4fc0: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
4fd0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
4fe0: 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P4);.    }.    r
4ff0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
5000: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
5010: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
5020: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
5030: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
5040: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5050: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
5060: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73  >aOp[addr];.  as
5070: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
5080: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 7c 7c  e==P4_NOTUSED ||
5090: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
50a0: 5f 49 4e 54 33 32 20 29 3b 0a 20 20 66 72 65 65  _INT32 );.  free
50b0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
50c0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
50d0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
50e0: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
50f0: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
5100: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
5110: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
5120: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
5130: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
5140: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
5150: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
5160: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
5170: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49  pOp->p4.i = SQLI
5180: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50  TE_PTR_TO_INT(zP
5190: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  4);.    pOp->p4t
51a0: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
51b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d    }else if( zP4=
51c0: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  =0 ){.    pOp->p
51d0: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  4.p = 0;.    pOp
51e0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
51f0: 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TUSED;.  }else i
5200: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
5210: 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
5220: 2a 70 4f 72 69 67 2c 20 2a 70 4e 65 77 3b 0a 0a  *pOrig, *pNew;..
5230: 20 20 20 20 70 4f 72 69 67 20 3d 20 28 4b 65 79      pOrig = (Key
5240: 49 6e 66 6f 2a 29 7a 50 34 3b 0a 20 20 20 20 70  Info*)zP4;.    p
5250: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
5260: 3d 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  = pNew = sqlite3
5270: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
5280: 20 70 4f 72 69 67 2d 3e 6e 46 69 65 6c 64 29 3b   pOrig->nField);
5290: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
52a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e  .      memcpy(pN
52b0: 65 77 2d 3e 61 43 6f 6c 6c 2c 20 70 4f 72 69 67  ew->aColl, pOrig
52c0: 2d 3e 61 43 6f 6c 6c 2c 20 70 4f 72 69 67 2d 3e  ->aColl, pOrig->
52d0: 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 70 4e  nField*sizeof(pN
52e0: 65 77 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 29 3b 0a  ew->aColl[0]));.
52f0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65        memcpy(pNe
5300: 77 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70  w->aSortOrder, p
5310: 4f 72 69 67 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Orig->aSortOrder
5320: 2c 20 70 4f 72 69 67 2d 3e 6e 46 69 65 6c 64 29  , pOrig->nField)
5330: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  ;.      pOp->p4t
5340: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5350: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5360: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
5370: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5380: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5390: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
53a0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
53b0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
53c0: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
53d0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
53e0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
53f0: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
5400: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
5410: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
5420: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5430: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5440: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
5450: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
5460: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
5470: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
5480: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
5490: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
54a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
54b0: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
54c0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
54d0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
54e0: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
54f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
5500: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
5510: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
5520: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
5530: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
5540: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
5550: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
5560: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
5570: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5580: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
5590: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
55a0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
55b0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
55c0: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
55d0: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
55e0: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
55f0: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
5600: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
5610: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
5620: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
5630: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
5640: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
5650: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
5660: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
5670: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
5680: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
5690: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
56a0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
56b0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
56c0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
56d0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
56e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
56f0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
5700: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
5710: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
5720: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5730: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5740: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
5750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
5760: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
5770: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5780: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
5790: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57a0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
57b0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
57c0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
57d0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
57e0: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
57f0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5800: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5810: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5820: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
5830: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
5840: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
5850: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
5860: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
5870: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
5880: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
5890: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
58a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
58b0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
58c0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
58d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
58e0: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
58f0: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
5900: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
5910: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
5920: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
5930: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5940: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
5950: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
5960: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5970: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
5980: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
5990: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
59a0: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
59b0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
59c0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
59d0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
59e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
59f0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5a00: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
5a10: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
5a20: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
5a30: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
5a40: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
5a50: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5a60: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5a70: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5a80: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
5a90: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
5aa0: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
5ab0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
5ac0: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
5ad0: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
5ae0: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5af0: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5b00: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5b10: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5b20: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5b30: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5b40: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5b50: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5b60: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5b70: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5b80: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5b90: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5ba0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5bb0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5bc0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5bd0: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5be0: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5bf0: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5c00: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5c10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5c20: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5c30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5c40: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5c50: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5c60: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5c70: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5c80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5c90: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5ca0: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5cb0: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5cc0: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5cd0: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5ce0: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5cf0: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5d00: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5d10: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5d20: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5d30: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5d40: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5d50: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5d60: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5d70: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5d80: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5d90: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5da0: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5db0: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5dc0: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5dd0: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5de0: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5df0: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5e00: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5e10: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5e20: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
5e30: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
5e40: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
5e50: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
5e60: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
5e70: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
5e80: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
5e90: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
5ea0: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
5eb0: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
5ec0: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20  c VdbeOp dummy; 
5ed0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d   /* Ignore the M
5ee0: 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75  SVC warning abou
5ef0: 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72  t no initializer
5f00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
5f10: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5f20: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5f30: 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65   addr<0 ){.#ifde
5f40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5f50: 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ACE.    if( p->n
5f60: 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  Op==0 ) return (
5f70: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
5f80: 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20  #endif.    addr 
5f90: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5fa0: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
5fb0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
5fc0: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
5fd0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5fe0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
5ff0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6000: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
6010: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
6020: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
6030: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
6040: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
6060: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
6070: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
6080: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
6090: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
60a0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
60b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
60c0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
60d0: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
60e0: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
60f0: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
6100: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
6110: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
6120: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
6130: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
6140: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
6150: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
6160: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
6170: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
6180: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
6190: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
61a0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
61b0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
61c0: 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61  O_STATIC:.    ca
61d0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
61e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
61f0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
6200: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
6210: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
6220: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
6230: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
6240: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
6250: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6260: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69  mp, zTemp, "keyi
6270: 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66  nfo(%d", pKeyInf
6280: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
6290: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72    i = sqlite3Str
62a0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
62b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
62c0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
62d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
62e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
62f0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
6300: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  j];.        cons
6310: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
6320: 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  pColl ? pColl->z
6330: 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20  Name : "nil";.  
6340: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
6350: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
6360: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
6370: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
6380: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
6390: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
63a0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
63b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
63c0: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  }.        zTemp[
63d0: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
63e0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
63f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
6400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
6410: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
6420: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6430: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
6440: 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a  ], zColl, n+1);.
6450: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
6460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
6470: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
6480: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
6490: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
64a0: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
64b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
64c0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
64d0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
64e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
64f0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
6500: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6510: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6520: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
6530: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
6540: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6550: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6560: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
6570: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
6580: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
6590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
65a0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
65b0: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
65c0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
65d0: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
65e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
65f0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
6600: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6610: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6620: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
6630: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
6640: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6650: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
6660: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
6670: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6680: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
6690: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
66a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
66b0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
66c0: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
66d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
66e0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
66f0: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
6700: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
6710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6720: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
6730: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
6740: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
6750: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6760: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
6770: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
6780: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
6790: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
67a0: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
67b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
67c0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
67d0: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  emp, "%lld", pMe
67e0: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
67f0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6800: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
6810: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6820: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6830: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
6840: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  ", pMem->r);.   
6850: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6860: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
6870: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
6880: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6890: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
68a0: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ULL");.      }el
68b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
68c0: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
68d0: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
68e0: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
68f0: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
6900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6910: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6920: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6930: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
6940: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
6950: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
6960: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
6970: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
6980: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6990: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
69a0: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
69b0: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
69c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
69d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
69e0: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
69f0: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
6a00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6a10: 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72  p, zTemp, "intar
6a20: 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ray");.      bre
6a30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6a40: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
6a50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6a60: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6a70: 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61  , zTemp, "progra
6a80: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
6a90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6aa0: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
6ab0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6ac0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
6ad0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6ae0: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
6af0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
6b00: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
6b10: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
6b20: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
6b30: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6b40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
6b50: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
6b60: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
6b70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
6b80: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
6b90: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
6ba0: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
6bb0: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
6bc0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
6bd0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
6be0: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
6bf0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
6c00: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
6c10: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
6c20: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
6c30: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
6c40: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
6c50: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
6c60: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
6c70: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
6c80: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
6c90: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
6ca0: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
6cb0: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
6cc0: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
6cd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6ce0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
6cf0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
6d00: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
6d10: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
6d20: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
6d30: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
6d40: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
6d50: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
6d60: 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d  8 );.  p->btreeM
6d70: 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
6d80: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21  )1)<<i;.  if( i!
6d90: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
6da0: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
6db0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6dc0: 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  .    p->lockMask
6dd0: 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29   |= ((yDbMask)1)
6de0: 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  <<i;.  }.}..#if 
6df0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6e00: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
6e10: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
6e20: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
6e30: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
6e40: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
6e50: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6e60: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
6e70: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
6e80: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
6e90: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
6ea0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
6eb0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6ec0: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
6ed0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
6ee0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
6ef0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
6f00: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
6f10: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
6f20: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
6f30: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
6f40: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6f50: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
6f60: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
6f70: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
6f80: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
6f90: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6fa0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
6fb0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
6fc0: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
6fd0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6fe0: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
6ff0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
7000: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
7010: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
7020: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
7030: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
7040: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
7050: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
7060: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7070: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
7080: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
7090: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
70a0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
70b0: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
70c0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
70d0: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
70e0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
70f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
7100: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
7110: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
7120: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
7130: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
7140: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
7150: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
7160: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
7170: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
7180: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
7190: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
71a0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
71b0: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
71c0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
71d0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
71e0: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
71f0: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
7200: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
7210: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
7220: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
7230: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
7240: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
7250: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7260: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7270: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7280: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7290: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
72a0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
72b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
72c0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
72d0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
72e0: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
72f0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7300: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
7310: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
7320: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
7330: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
7340: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
7350: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
7360: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7370: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
7380: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7390: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
73a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
73b0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
73c0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
73d0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
73e0: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
73f0: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
7400: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
7410: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
7420: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76  dbeEnter()..*/.v
7430: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
7440: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
7450: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
7460: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7470: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
7480: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
7490: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
74a0: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
74b0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
74c0: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
74d0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
74e0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
74f0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
7500: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
7510: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
7520: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
7530: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
7540: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
7550: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
7560: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7570: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
7580: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7590: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
75a0: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
75b0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
75c0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
75d0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
75e0: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
75f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7600: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
7610: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
7620: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
7630: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
7640: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
7650: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
7660: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
7670: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7680: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
7690: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
76a0: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
76b0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
76c0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
76d0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
76e0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
76f0: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
7700: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
7710: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
7720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
7730: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
7740: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
7750: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
7760: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
7770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7780: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
7790: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
77a0: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
77b0: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
77c0: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
77d0: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
77e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
77f0: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
7800: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
7810: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
7820: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
7830: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
7840: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
7850: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
7860: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7870: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
7880: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
7890: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
78a0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
78b0: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
78c0: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
78d0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
78e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
78f0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7910: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7920: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
7930: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
7940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
7950: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
7960: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7970: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7980: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7990: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
79a0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
79b0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
79c0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
79d0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
79e0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
79f0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
7a00: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
7a10: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
7a20: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
7a30: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
7a40: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7a50: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7a60: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7a70: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7a80: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7a90: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7aa0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7ab0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7ac0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7ad0: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7ae0: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
7af0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
7b00: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
7b10: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
7b20: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
7b30: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
7b40: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7b50: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7b60: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7b70: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7b80: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7b90: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7ba0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7bb0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7bc0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7bd0: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7be0: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7bf0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
7c00: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
7c10: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
7c20: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
7c30: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
7c40: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7c50: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7c60: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7c70: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7c80: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7c90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7ca0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7cb0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7cc0: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7cd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7ce0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7cf0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7d00: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7d10: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7d20: 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20  = MEM_Invalid;. 
7d30: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
7d40: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
7d50: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
7d60: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
7d70: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7d80: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
7d90: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
7da0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
7db0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
7dc0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
7dd0: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
7de0: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
7df0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
7e00: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
7e10: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
7e20: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
7e30: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
7e40: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7e50: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7e60: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7e70: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7e80: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
7e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
7ea0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7eb0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
7ec0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7ed0: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
7ee0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
7ef0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
7f00: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
7f10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7f20: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
7f30: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
7f40: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
7f50: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7f60: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
7f70: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
7f80: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
7f90: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
7fa0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
7fb0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
7fc0: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
7fd0: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
7fe0: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
7ff0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
8000: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
8010: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
8020: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
8030: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
8040: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
8050: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
8060: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
8070: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
8080: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
8090: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
80a0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
80b0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
80c0: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
80d0: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
80e0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
80f0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8100: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
8110: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
8120: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
8130: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
8140: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
8150: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
8160: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
8170: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
8180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
8190: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
81c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
81f0: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
8200: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
8210: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
8220: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8240: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
8250: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
8260: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
8270: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
8280: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
8290: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
82a0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
82d0: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
82e0: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
82f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8300: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
8310: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
8320: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8330: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8360: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
8370: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8380: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
8390: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
83a0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
83b0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
83c0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
83d0: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
83e0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
83f0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
8400: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
8410: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
8420: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
8430: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
8440: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
8450: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
8460: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8470: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
8480: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
8490: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
84a0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
84b0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
84c0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
84d0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
84e0: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
84f0: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
8500: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
8510: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
8520: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
8530: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
8540: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
8550: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
8560: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
8570: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
8580: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8590: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
85a0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
85b0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
85c0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
85d0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
85e0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
85f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
8600: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
8610: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
8620: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
8630: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
8650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
8660: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
8670: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
8680: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
8690: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
86a0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
86b0: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
86c0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
86d0: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
86e0: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
86f0: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
8700: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
8710: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
8720: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
8730: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
8740: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
8750: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
8760: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
8770: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
8780: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
8790: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
87a0: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
87b0: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
87c0: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
87d0: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
87e0: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
87f0: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
8800: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
8810: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
8820: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
8830: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
8840: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
8850: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
8860: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
8870: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
8880: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
8890: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
88a0: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
88b0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
88c0: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
88d0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
88e0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
88f0: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
8900: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
8910: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
8920: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
8930: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
8940: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
8950: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
8960: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8970: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
8980: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
8990: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
89a0: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
89b0: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
89c0: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
89d0: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
89e0: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
89f0: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
8a00: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
8a10: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
8a20: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
8a30: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
8a40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
8a50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
8a60: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
8a70: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
8a80: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
8a90: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
8aa0: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
8ab0: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
8ac0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
8ad0: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
8ae0: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
8af0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8b00: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
8b10: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
8b20: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
8b30: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
8b40: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8b50: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
8b60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8b70: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
8b80: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
8b90: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
8ba0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
8bb0: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
8bc0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8bd0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
8be0: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
8bf0: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
8c00: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
8c10: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
8c20: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
8c30: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
8c40: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
8c50: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
8c60: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
8c70: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
8c80: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
8c90: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
8ca0: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
8cb0: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
8cc0: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
8cd0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
8ce0: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
8cf0: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
8d00: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
8d10: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
8d20: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
8d30: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
8d40: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
8d50: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
8d60: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
8d70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8d80: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8d90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8da0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8db0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8dc0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8dd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
8de0: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
8e10: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
8e20: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
8e30: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8e40: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
8e50: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8e60: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
8e70: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
8e80: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8e90: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
8ea0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8eb0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8ec0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8ed0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8ee0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
8ef0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
8f00: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
8f10: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8f20: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
8f30: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
8f40: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
8f50: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
8f60: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
8f70: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
8f80: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
8f90: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
8fa0: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
8fb0: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
8fc0: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
8fd0: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
8fe0: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
8ff0: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
9000: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
9010: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
9020: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
9030: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
9040: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
9050: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
9060: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
9070: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
9080: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
9090: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
90a0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
90b0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
90c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
90d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
90e0: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
90f0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
9100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9110: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
9120: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
9130: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
9140: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
9150: 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a  te, nSub!=0) ){.
9160: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
9170: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
9180: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
9190: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
91a0: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
91b0: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
91c0: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
91d0: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
91e0: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
91f0: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
9200: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
9210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9220: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9230: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
9240: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
9250: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9270: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
9280: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
9290: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
92a0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
92b0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
92c0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
92d0: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
9300: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
9310: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
9320: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
9330: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
9340: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
9350: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
9380: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9390: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
93a0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
93b0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
93c0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
93d0: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
93e0: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
93f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9400: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9420: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
9430: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
9440: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
9450: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
9460: 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70   z = displayP4(p
9470: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
9480: 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65  ;.    if( z!=pMe
9490: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  m->z ){.      sq
94a0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
94b0: 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20  tr(pMem, z, -1, 
94c0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
94d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
94e0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
94f0: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
9500: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
9510: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
9520: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
9530: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9540: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
9550: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
9560: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  EXT;.    pMem++;
9570: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
9580: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
9590: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
95a0: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c  MemGrow(pMem, 4,
95b0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   0) ){.        a
95c0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
95d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
95e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
95f0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
9600: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
9610: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
9620: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
9630: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
9640: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
9650: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
9660: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
9670: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
9680: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
9690: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
96a0: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
96b0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
96c0: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
96d0: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
96e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
96f0: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
9700: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
9710: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
9720: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
9730: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
9740: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
9750: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
9760: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
9770: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
9780: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
9790: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
97a0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
97b0: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
97c0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
97d0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
97e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
97f0: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
9800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9810: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
9820: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9830: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
9840: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
9850: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
9860: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
9870: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
9880: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
9890: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
98a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
98b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
98c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
98d0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
98e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
98f0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
9900: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
9910: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
9920: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
9930: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
9940: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
9950: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
9960: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
9970: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9980: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9990: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
99a0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
99b0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
99c0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
99d0: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
99e0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63  p4.z!=0 ){.    c
99f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
9a00: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68  Op->p4.z;.    wh
9a10: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
9a20: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
9a30: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
9a40: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
9a50: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
9a60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9a70: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
9a80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9a90: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
9aa0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
9ab0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
9ac0: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
9ad0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9ae0: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
9af0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
9b00: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
9b10: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
9b20: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
9b30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9b40: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
9b50: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
9b60: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
9b70: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
9b80: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
9b90: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
9ba0: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
9bb0: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
9bc0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
9bd0: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
9be0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
9bf0: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
9c00: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
9c10: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
9c20: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
9c30: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9c40: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
9c50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
9c60: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
9c70: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
9c80: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
9c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9ca0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
9cb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9cc0: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
9cd0: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
9ce0: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
9cf0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9d00: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
9d10: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
9d20: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
9d30: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9d40: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78  space from a fix
9d50: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61  ed size buffer a
9d60: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
9d70: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
9d80: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66  pace.  If insuff
9d90: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20  icient space is 
9da0: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
9db0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
9dc0: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72  e pBuf parameter
9dd0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
9de0: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74  value of a point
9df0: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  er which will.**
9e00: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77   receive the new
9e10: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69   memory.  pBuf i
9e20: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e  s normally NULL.
9e30: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74    If pBuf is not
9e40: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  .** NULL, it mea
9e50: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ns that memory s
9e60: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
9e70: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
9e80: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  and that.** this
9e90: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
9ea0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79  not allocate any
9eb0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68   new memory.  Wh
9ec0: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  en pBuf is not.*
9ed0: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  * NULL simply re
9ee0: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79  turn pBuf.  Only
9ef0: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   allocate new me
9f00: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20  mory space when 
9f10: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  pBuf.** is NULL.
9f20: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
9f30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9f40: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
9f50: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
9f60: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61  om points to ava
9f70: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
9f80: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
9f90: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
9fa0: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
9fb0: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69  e.  When space i
9fc0: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70  s allocated, *pp
9fd0: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64  From is advanced
9fe0: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64   past.** the end
9ff0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
a000: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  d space..**.** *
a010: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
a020: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
a030: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
a040: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
a050: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
a060: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
a070: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
a080: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
a090: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
a0a0: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
a0b0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
a0c0: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
a0d0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
a0e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
a0f0: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f  allocSpace(.  vo
a100: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
a110: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75     /* Where retu
a120: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20  rn pointer will 
a130: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  be stored */.  i
a140: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
a150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a160: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   bytes to alloca
a170: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46  te */.  u8 **ppF
a180: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rom,         /* 
a190: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  IN/OUT: Allocate
a1a0: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f   from *ppFrom */
a1b0: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20  .  u8 *pEnd,    
a1c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
a1d0: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  er to 1 byte pas
a1e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70  t the end of *pp
a1f0: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  From buffer */. 
a200: 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20   int *pnByte    
a210: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f        /* If allo
a220: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  cation cannot be
a230: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74   made, increment
a240: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20   *pnByte */.){. 
a250: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a260: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70  YTE_ALIGNMENT(*p
a270: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20  pFrom) );.  if( 
a280: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42  pBuf ) return pB
a290: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  uf;.  nByte = RO
a2a0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69  UND8(nByte);.  i
a2b0: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
a2c0: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
a2d0: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
a2e0: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a  *)*ppFrom;.    *
a2f0: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
a300: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
a310: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
a320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75    }.  return pBu
a330: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69  f;.}../*.** Rewi
a340: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b  nd the VDBE back
a350: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
a360: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  g in preparation
a370: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20   for.** running 
a380: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
a390: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64  te3VdbeRewind(Vd
a3a0: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
a3b0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
a3c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
a3d0: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
a3e0: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   i;.#endif.  ass
a3f0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
a400: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
a410: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
a420: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
a430: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
a440: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
a450: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
a460: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
a470: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
a480: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
a490: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
a4a0: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
a4b0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
a4c0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65  AGIC_RUN;..#ifde
a4d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a4e0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
a4f0: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Mem; i++){.    a
a500: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
a510: 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ].db==p->db );. 
a520: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
a530: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
a540: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
a550: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
a560: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d  OE_Abort;.  p->m
a570: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
a580: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
a590: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
a5a0: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
a5b0: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
a5c0: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
a5d0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
a5e0: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
a5f0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
a600: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
a610: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
a620: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
a630: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
a640: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
a650: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
a660: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
a670: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
a680: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
a690: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
a6a0: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
a6b0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
a6c0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
a6d0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
a6e0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
a6f0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
a700: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
a710: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
a720: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
a730: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
a740: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
a750: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
a760: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
a770: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
a780: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
a790: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
a7a0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
a7b0: 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e  ed exact once on
a7c0: 20 61 20 65 61 63 68 20 76 69 72 74 75 61 6c 20   a each virtual 
a7d0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
a7e0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
a7f0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
a800: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
a810: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
a820: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
a830: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
a840: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65  is called, futhe
a850: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
a860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a870: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
a880: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
a890: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
a8a0: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
a8b0: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
a8c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
a8d0: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
a8e0: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
a8f0: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
a900: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
a910: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
a920: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
a930: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
a940: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
a950: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
a960: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
a970: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
a980: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
a990: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
a9a0: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
a9b0: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
a9c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a9d0: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
a9e0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
aa00: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
aa10: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
aa30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
aa40: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
aa50: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
aa60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
aa70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
aa80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aab0: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
aac0: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
aaf0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
ab00: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
ab10: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
ab20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ab30: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
ab40: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
ab50: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
ab60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ab70: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
ab80: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
ab90: 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20  .  int nOnce;   
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
abc0: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
abd0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ons */.  int n; 
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ac00: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
ac10: 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *zCsr;          
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ac30: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
ac40: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
ac50: 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20  /.  u8 *zEnd;   
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ac80: 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20   past allocated 
ac90: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
aca0: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
acc0: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
acd0: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ory is needed */
ace0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
acf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ad00: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
ad10: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
ad20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
ad30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
ad40: 49 4e 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70  INIT );.  db = p
ad50: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
ad60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ad70: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
ad80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
ad90: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
ada0: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
adb0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
adc0: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
add0: 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65  nMaxArg;.  nOnce
ade0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65   = pParse->nOnce
adf0: 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30  ;.  if( nOnce==0
ae00: 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a   ) nOnce = 1; /*
ae10: 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74   Ensure at least
ae20: 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e   one byte in p->
ae30: 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20  aOnceFlag[] */. 
ae40: 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20   .  /* For each 
ae50: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
ae60: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
ae70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
ae80: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
ae90: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
aea0: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
aeb0: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
aec0: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
aed0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
aee0: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
aef0: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
af00: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
af10: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
af20: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
af30: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
af40: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
af50: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
af60: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
af70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
af80: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
af90: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
afa0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
afb0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
afc0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
afd0: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
afe0: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
aff0: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
b000: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
b010: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
b020: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
b030: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
b040: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
b050: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
b060: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
b070: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
b080: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
b090: 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d  n..  */.  zCsr =
b0a0: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
b0b0: 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20  >nOp];       /* 
b0c0: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
b0d0: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
b0e0: 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a  */.  zEnd = (u8*
b0f0: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41  )&p->aOp[p->nOpA
b100: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
b110: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
b120: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
b130: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
b140: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
b150: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
b160: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
b170: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
b180: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
b190: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
b1a0: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
b1b0: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
b1c0: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
b1d0: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
b1e0: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
b1f0: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
b200: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
b210: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
b220: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
b230: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
b240: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
b250: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
b260: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
b270: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
b280: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
b290: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
b2a0: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
b2b0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
b2c0: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
b2d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
b2e0: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
b2f0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
b300: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
b310: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
b320: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
b330: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
b340: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
b350: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
b360: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
b370: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
b380: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
b390: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
b3a0: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
b3b0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
b3c0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
b3d0: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
b3e0: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
b3f0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
b400: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
b410: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
b420: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
b430: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
b440: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
b450: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
b460: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
b470: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
b480: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
b490: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
b4a0: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
b4b0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
b4c0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b4d0: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
b4e0: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
b4f0: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
b500: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b510: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
b520: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
b530: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
b540: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
b550: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b560: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
b570: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b580: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
b590: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
b5a0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b5b0: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
b5c0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
b5d0: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
b5e0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
b5f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b600: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
b610: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b620: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
b630: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
b640: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
b650: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
b660: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  , &nByte);.    i
b670: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
b680: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
b690: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
b6a0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
b6b0: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
b6c0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64  >pFree;.    zEnd
b6d0: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
b6e0: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65  .  }while( nByte
b6f0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
b700: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e  ailed );..  p->n
b710: 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72  Cursor = nCursor
b720: 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  p->nOnceFlag
b730: 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20   = nOnce;.  if( 
b740: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70  p->aVar ){.    p
b750: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
b760: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  nVar;.    for(n=
b770: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
b780: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
b790: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
b7a0: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  ll;.      p->aVa
b7b0: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
b7c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
b7d0: 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  >azVar ){.    p-
b7e0: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >nzVar = pParse-
b7f0: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63  >nzVar;.    memc
b800: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61  py(p->azVar, pPa
b810: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e  rse->azVar, p->n
b820: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  zVar*sizeof(p->a
b830: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d  zVar[0]));.    m
b840: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a  emset(pParse->az
b850: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  Var, 0, pParse->
b860: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61  nzVar*sizeof(pPa
b870: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  rse->azVar[0]));
b880: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
b890: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
b8a0: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
b8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
b8c0: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
b8d0: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
b8e0: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b900: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
b910: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
b920: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
b930: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
b940: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
b950: 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20   MEM_Invalid;.  
b960: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
b970: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
b980: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
b990: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
b9a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
b9b0: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
b9c0: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
b9d0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
b9e0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
b9f0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
ba00: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
ba10: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
ba20: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
ba30: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
ba40: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
ba50: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
ba60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
ba70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
ba80: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
ba90: 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e  Cx);.  if( pCx->
baa0: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
bab0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
bac0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
bad0: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
bae0: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
baf0: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
bb00: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
bb10: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
bb20: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
bb30: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
bb40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bb50: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
bb60: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
bb70: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
bb80: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
bb90: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
bba0: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
bbb0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
bbc0: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
bbd0: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
bbe0: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
bbf0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
bc00: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e  *pModule = pCx->
bc10: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
bc20: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
bc30: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
bc40: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
bc50: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
bc60: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
bc70: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
bc80: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
bc90: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
bca0: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
bcb0: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
bcc0: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
bcd0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
bce0: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
bcf0: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
bd00: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
bd10: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
bd20: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
bd30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
bd40: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
bd50: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
bd60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
bd70: 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e  ame->v;.  v->aOn
bd80: 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d  ceFlag = pFrame-
bd90: 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d  >aOnceFlag;.  v-
bda0: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >nOnceFlag = pFr
bdb0: 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a  ame->nOnceFlag;.
bdc0: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
bdd0: 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
bde0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
bdf0: 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
be00: 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
be10: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
be20: 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
be30: 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
be40: 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
be50: 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
be60: 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
be70: 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
be80: 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
be90: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
bea0: 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e  Change;.  return
beb0: 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
bec0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
bed0: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
bee0: 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
bef0: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
bf00: 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
bf10: 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
bf20: 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
bf30: 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
bf40: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
bf50: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
bf60: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
bf70: 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
bf80: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
bf90: 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
bfa0: 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
bfb0: 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
bfc0: 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
bfd0: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
bfe0: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
bff0: 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
c000: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
c010: 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
c020: 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
c030: 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
c040: 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
c050: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
c060: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
c070: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
c080: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d  ;.  }.  p->pFram
c090: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61  e = 0;.  p->nFra
c0a0: 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  me = 0;..  if( p
c0b0: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
c0c0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
c0d0: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
c0e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
c0f0: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
c100: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
c110: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
c120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
c130: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
c140: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
c150: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
c160: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
c170: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
c180: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c190: 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d  (&p->aMem[1], p-
c1a0: 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
c1b0: 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
c1c0: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
c1d0: 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
c1e0: 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
c1f0: 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
c200: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
c210: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
c220: 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
c230: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
c240: 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
c250: 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
c260: 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e VM */.  sqlite
c270: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
c280: 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ta(p, -1, 0);.  
c290: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
c2a0: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
c2b0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
c2c0: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
c2d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
c2e0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
c2f0: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
c300: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
c310: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
c320: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
c330: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
c340: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
c350: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
c360: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
c370: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
c380: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
c390: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
c3a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
c3b0: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
c3c0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
c3d0: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
c3e0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
c3f0: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
c400: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
c410: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
c420: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
c430: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
c440: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
c450: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
c460: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
c470: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
c480: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
c490: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
c4a0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
c4b0: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
c4c0: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
c4d0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
c4e0: 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20 29 3b  ==MEM_Invalid );
c4f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
c500: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c510: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
c520: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
c530: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
c540: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
c550: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
c560: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
c570: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
c580: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
c590: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
c5a0: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
c5b0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
c5c0: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
c5d0: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
c5e0: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
c5f0: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
c600: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
c610: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
c620: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
c630: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
c640: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
c650: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c660: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
c670: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
c680: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
c690: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
c6a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c6b0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61   p->db;..  relea
c6c0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
c6d0: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
c6e0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
c6f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
c700: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
c710: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
c720: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
c730: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
c740: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
c750: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
c760: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
c770: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
c780: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c790: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
c7a0: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
c7b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
c7c0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
c7d0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
c7e0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
c7f0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
c800: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
c810: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
c820: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
c830: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
c840: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
c850: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
c860: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
c870: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
c880: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
c890: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
c8a0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
c8b0: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
c8c0: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
c8d0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
c8e0: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
c8f0: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
c900: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
c910: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
c920: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
c930: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
c940: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
c950: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
c960: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
c970: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c980: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
c990: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
c9a0: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
c9b0: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
c9c0: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
c9d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
c9e0: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
c9f0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca10: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
ca20: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
ca30: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca50: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
ca60: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
ca70: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
caa0: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
cab0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
cac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
cad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cae0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
caf0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
cb00: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
cb10: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
cb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
cb30: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
cb40: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
cb50: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
cb60: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
cb70: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
cb80: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
cb90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
cba0: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
cbb0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
cbc0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
cbd0: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
cbe0: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
cbf0: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
cc00: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
cc10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
cc20: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
cc30: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
cc40: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
cc50: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
cc60: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
cc70: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
cc80: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
cc90: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
cca0: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
ccb0: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
ccc0: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
ccd0: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
cce0: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
ccf0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
cd00: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
cd10: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
cd20: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
cd30: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
cd40: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
cd50: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
cd60: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
cd70: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
cd80: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
cd90: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
cda0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
cdb0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
cdc0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
cdd0: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
cde0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
cdf0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
ce00: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
ce10: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
ce20: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
ce30: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
ce40: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
ce50: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
ce60: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
ce70: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
ce80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ce90: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
cea0: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
ceb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
cec0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ced0: 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
cee0: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
cef0: 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
cf00: 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
cf10: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
cf20: 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
cf30: 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
cf40: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
cf50: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
cf60: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
cf70: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
cf80: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
cf90: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
cfa0: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
cfb0: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
cfc0: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
cfd0: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
cfe0: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
cff0: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
d000: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
d010: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
d020: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
d030: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
d040: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
d050: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
d060: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
d070: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
d080: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
d090: 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a  abSync(db, p);..
d0a0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
d0b0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
d0c0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
d0d0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
d0e0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
d0f0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
d100: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
d110: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
d120: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
d130: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
d140: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
d150: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
d160: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
d170: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
d180: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
d190: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
d1a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
d1b0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
d1c0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
d1d0: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
d1e0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
d1f0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d200: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d210: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
d220: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d230: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d240: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
d250: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
d260: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
d270: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
d280: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
d290: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
d2a0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
d2b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d2c0: 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
d2d0: 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74  veLock(sqlite3Bt
d2e0: 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a  reePager(pBt));.
d2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d300: 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20  eeLeave(pBt);.  
d310: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
d320: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d330: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d340: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
d350: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
d360: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
d370: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
d380: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
d390: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
d3a0: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
d3b0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
d3c0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
d3d0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
d3e0: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
d3f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
d400: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
d410: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b  AINT_COMMITHOOK;
d420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d430: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
d440: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
d450: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
d460: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
d470: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
d480: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
d490: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
d4a0: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
d4b0: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
d4c0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
d4d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
d4e0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
d4f0: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
d500: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
d510: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
d520: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
d530: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
d540: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
d550: 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65  : or a temp file
d560: 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74  .  In .  ** that
d570: 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20   case we do not 
d580: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
d590: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
d5a0: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20  s, so use the . 
d5b0: 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20   ** simple case 
d5c0: 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  then too..  */. 
d5d0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
d5e0: 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42  trlen30(sqlite3B
d5f0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
d600: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
d610: 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  .   || nTrans<=1
d620: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  .  ){.    for(i=
d630: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
d640: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
d650: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
d660: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d670: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
d680: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
d690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
d6a0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d6b0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
d6c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
d6d0: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
d6e0: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
d6f0: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
d700: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
d710: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
d720: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
d730: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
d740: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
d750: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
d760: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
d770: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
d780: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
d790: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
d7a0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
d7b0: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
d7c0: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
d7d0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
d7e0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
d7f0: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
d800: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
d810: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d820: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
d830: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
d840: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
d850: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
d860: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d870: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
d880: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
d890: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d8a0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
d8b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d8c0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
d8d0: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
d8e0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
d8f0: 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
d900: 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
d910: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
d920: 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
d930: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
d940: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d950: 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
d960: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
d970: 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
d980: 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a   atomicly..  */.
d990: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d9a0: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
d9b0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
d9c0: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
d9d0: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
d9e0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
d9f0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
da00: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
da10: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
da20: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
da30: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
da40: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
da50: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
da60: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
da70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
da80: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
da90: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
daa0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
dab0: 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75      int retryCou
dac0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
dad0: 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20  nMainFile;..    
dae0: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
daf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
db00: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69  name */.    nMai
db10: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53  nFile = sqlite3S
db20: 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c  trlen30(zMainFil
db30: 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  e);.    zMaster 
db40: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
db50: 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58  (db, "%s-mjXXXXX
db60: 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c  X9XXz", zMainFil
db70: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73  e);.    if( zMas
db80: 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
db90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
dba0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
dbb0: 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
dbc0: 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29  if( retryCount )
dbd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
dbe0: 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a  tryCount>100 ){.
dbf0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dc00: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
dc10: 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25  L, "MJ delete: %
dc20: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
dc30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
dc40: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
dc50: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
dc60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
dc80: 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20  tryCount==1 ){. 
dc90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dca0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
dcb0: 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25  , "MJ collide: %
dcc0: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
dcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dce0: 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74        retryCount
dcf0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
dd00: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
dd10: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
dd20: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
dd30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
dd40: 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
dd50: 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
dd60: 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
dd90: 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
dda0: 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
ddb0: 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
ddc0: 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
ddd0: 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
dde0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
ddf0: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
de00: 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
de10: 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
de20: 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
de30: 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
de40: 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
de50: 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
de60: 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
de70: 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
de80: 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
de90: 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
dea0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
deb0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
dec0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
ded0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
dee0: 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
def0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
df00: 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
df10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
df20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
df30: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
df40: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
df50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
df60: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
df70: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
df80: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
df90: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
dfa0: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
dfb0: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
dfc0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
dfd0: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
dfe0: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
dff0: 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
e000: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
e010: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e020: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e030: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e050: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
e060: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
e070: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
e080: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
e090: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
e0a0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
e0b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e0c0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
e0d0: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
e0e0: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
e0f0: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
e100: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e110: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
e120: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
e130: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
e140: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
e150: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e160: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
e170: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
e180: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
e190: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
e1a0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
e1b0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
e1c0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
e1d0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
e1e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e1f0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
e200: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
e210: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
e220: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
e230: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
e240: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
e250: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
e260: 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
e270: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
e280: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
e290: 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
e2a0: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
e2b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e2c0: 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
e2d0: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
e2e0: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
e2f0: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
e300: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
e310: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
e320: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
e330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
e340: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
e350: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
e360: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
e370: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
e380: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
e390: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
e3a0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
e3b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e3c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e3d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e3e0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
e3f0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
e400: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
e410: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
e420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e430: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e440: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
e450: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e470: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
e480: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
e490: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
e4a0: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
e4b0: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
e4c0: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
e4d0: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
e4e0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
e4f0: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
e500: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
e510: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
e520: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
e530: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
e540: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
e550: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
e560: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
e570: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
e580: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
e590: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
e5a0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
e5b0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
e5c0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e5d0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
e5e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
e5f0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e600: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
e610: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
e620: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
e630: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
e640: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
e650: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
e660: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
e670: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e680: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
e690: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
e6a0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
e6b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e6c0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
e6d0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e6e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e6f0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
e700: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
e710: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
e720: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
e730: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
e740: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
e750: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
e760: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
e770: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
e780: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
e790: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
e7a0: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
e7b0: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
e7c0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
e7d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
e7e0: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
e7f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e800: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
e810: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
e820: 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
e830: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
e840: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
e850: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
e860: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e870: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e880: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
e890: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e8a0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
e8b0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
e8c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
e8d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e8e0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
e8f0: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
e900: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
e910: 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
e920: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e930: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e940: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e960: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e970: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
e980: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
e990: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
e9a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
e9b0: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
e9c0: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
e9d0: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
e9e0: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
e9f0: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
ea00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
ea10: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
ea20: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
ea30: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
ea40: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
ea50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
ea60: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
ea70: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
ea80: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
ea90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
eaa0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
eab0: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
eac0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
ead0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
eae0: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
eaf0: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
eb00: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
eb10: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
eb20: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
eb30: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
eb40: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
eb50: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
eb60: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
eb70: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
eb80: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
eb90: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
eba0: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
ebb0: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
ebc0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
ebd0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
ebe0: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
ebf0: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
ec00: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
ec10: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
ec20: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
ec30: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
ec40: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
ec50: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
ec60: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
ec70: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
ec80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
ec90: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
eca0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
ecb0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ecc0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
ecd0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
ece0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ecf0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
ed00: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ed10: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
ed20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ed30: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
ed40: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
ed50: 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
ed60: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
ed70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
ed80: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
ed90: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
eda0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
edb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
edc0: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
edd0: 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20  te3.nVdbeActive 
ede0: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
edf0: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
ee00: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
ee10: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
ee20: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
ee30: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
ee40: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
ee50: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
ee60: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
ee70: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
ee80: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
ee90: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
eea0: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
eeb0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
eec0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
eed0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
eee0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
eef0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
ef00: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
ef10: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
ef20: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
ef30: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
ef40: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
ef50: 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
ef60: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  = 0;.  int nRead
ef70: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
ef80: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
ef90: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
efa0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
efb0: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
efc0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
efd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
efe0: 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
eff0: 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
f000: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
f010: 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
f020: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
f030: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
f040: 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
f050: 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
f060: 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
f070: 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
f080: 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
f090: 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
f0a0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
f0b0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
f0c0: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
f0d0: 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
f0e0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
f0f0: 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
f100: 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
f110: 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
f120: 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
f130: 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
f140: 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
f150: 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
f160: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f170: 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
f180: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
f190: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
f1a0: 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
f1b0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
f1c0: 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
f1d0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
f1e0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
f1f0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f200: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
f210: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
f220: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
f230: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
f240: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f250: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
f260: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
f270: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f280: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
f290: 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
f2a0: 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
f2b0: 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
f2c0: 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
f2d0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
f2e0: 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
f2f0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
f300: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
f310: 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
f320: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
f330: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
f340: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
f350: 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
f360: 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
f370: 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
f380: 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
f390: 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
f3a0: 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
f3b0: 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
f3c0: 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
f3d0: 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
f3e0: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
f3f0: 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
f400: 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
f410: 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
f420: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
f430: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
f440: 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
f450: 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
f460: 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
f470: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f480: 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
f490: 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
f4a0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
f4b0: 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
f4c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
f4d0: 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
f4e0: 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
f4f0: 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
f500: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f510: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
f520: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
f530: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
f540: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
f550: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
f560: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
f570: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
f580: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
f590: 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
f5a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
f5b0: 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
f5c0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
f5d0: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
f5e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f5f0: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
f600: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
f610: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
f620: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
f630: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f640: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
f650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f660: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f670: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
f680: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
f690: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f6a0: 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
f6b0: 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
f6c0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
f6d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f6e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f6f0: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
f700: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
f710: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f720: 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
f730: 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
f740: 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
f750: 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
f760: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f780: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
f790: 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
f7a0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f7b0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
f7c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f7d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
f7e0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f7f0: 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
f800: 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
f810: 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
f820: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
f830: 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
f840: 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
f850: 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
f860: 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
f870: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
f880: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
f890: 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
f8a0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
f8b0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
f8c0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
f8d0: 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
f8e0: 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d  fCons;.      db-
f8f0: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
f900: 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
f910: 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  mmCons;.    }.  
f920: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f930: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f940: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
f950: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
f960: 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
f970: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
f980: 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
f990: 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
f9a0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
f9b0: 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
f9c0: 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
f9d0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
f9e0: 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
f9f0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
fa00: 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
fa10: 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
fa20: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
fa30: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
fa40: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
fa50: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
fa60: 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
fa70: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
fa80: 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
fa90: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
faa0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
fab0: 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
fac0: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
fad0: 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
fae0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
faf0: 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
fb00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
fb10: 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
fb20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
fb30: 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
fb40: 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
fb50: 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
fb60: 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
fb70: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
fb80: 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
fb90: 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
fba0: 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
fbb0: 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
fbc0: 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
fbd0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
fbe0: 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
fbf0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
fc00: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
fc10: 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
fc20: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
fc30: 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rt;.    sqlite3S
fc40: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
fc50: 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69  rMsg, db, "forei
fc60: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
fc70: 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
fc80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
fc90: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
fca0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
fcb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
fcc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
fcd0: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
fce0: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
fcf0: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
fd00: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
fd10: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
fd20: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
fd30: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
fd40: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
fd50: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
fd60: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
fd70: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
fd80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fd90: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
fda0: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
fdb0: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
fdc0: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
fdd0: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
fde0: 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
fdf0: 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
fe00: 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
fe10: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
fe20: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
fe30: 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
fe40: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fe50: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
fe60: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
fe70: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
fe80: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
fe90: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
fea0: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
feb0: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
fec0: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
fed0: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
fee0: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
fef0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
ff00: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
ff10: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
ff20: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
ff50: 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
ff60: 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
ff70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
ff80: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
ff90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
ffa0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
ffb0: 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
ffc0: 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
ffd0: 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
ffe0: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
fff0: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
10000 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
10010 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
10020 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
10030 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
10040 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
10050 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
10060 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
10070 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
10080 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
10090 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
100a0 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
100b0 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
100c0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
100d0 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
100e0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
100f0 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
10100 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
10110 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
10120 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
10130 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
10140 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10150 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
10160 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
10170 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
10180 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
10190 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
101a0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
101b0 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
101c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
101d0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
101e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
101f0 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46  .  if( p->aOnceF
10200 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e  lag ) memset(p->
10210 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d  aOnceFlag, 0, p-
10220 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63  >nOnceFlag);.  c
10230 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
10240 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
10250 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
10260 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
10270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10280 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10290 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
102a0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
102b0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
102c0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
102d0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
102e0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
102f0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
10300 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
10310 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
10320 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
10330 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
10340 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
10350 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
10360 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
10370 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
10380 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
10390 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
103a0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
103b0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
103c0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
103d0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
103e0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
103f0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
10400 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
10410 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
10420 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
10430 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
10440 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
10450 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
10460 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
10470 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
10480 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
10490 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  KED );  /* This 
104a0 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20  error no longer 
104b0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73  exists */.    is
104c0 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
104d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
104e0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
104f0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
10500 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
10510 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
10520 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
10530 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
10540 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
10550 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
10560 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
10570 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
10580 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
10590 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
105a0 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
105b0 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
105c0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
105d0 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
105e0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
105f0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
10600 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
10610 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
10620 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
10630 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
10640 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
10650 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
10660 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
10670 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
10680 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
10690 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
106a0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
106b0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
106c0 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
106d0 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
106e0 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77     ** occurred w
106f0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
10700 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62  the journal, sub
10710 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61  -journal or data
10720 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
10730 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  le as part of an
10740 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20   effort to free 
10750 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28  up cache space (
10760 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  see function.   
10770 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73     ** pagerStres
10780 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c  s() in pager.c),
10790 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73   the rollback is
107a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73   required to res
107b0 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  tore .      ** t
107c0 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f  he pager to a co
107d0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
107e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
107f0 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
10800 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
10810 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
10820 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
10830 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
10840 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
10850 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
10860 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
10870 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
10880 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
10890 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
108a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
108b0 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
108c0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
108d0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
108e0 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
108f0 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
10900 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
10910 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
10920 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
10930 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
10940 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
10950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
10960 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
10970 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
10980 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ACK);.          
10990 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
109a0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
109b0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
109c0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
109d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
109e0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
109f0 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  for immediate fo
10a00 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
10a10 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
10a20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10a30 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10a40 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
10a50 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
10a60 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
10a70 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
10a80 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
10a90 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
10aa0 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56  writer .    ** V
10ab0 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69  M, then we do ei
10ac0 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
10ad0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
10ae0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
10af0 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
10b00 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
10b10 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
10b20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
10b30 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
10b40 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
10b50 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  ve has occurred.
10b60 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
10b70 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53   !sqlite3VtabInS
10b80 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26  ync(db) .     &&
10b90 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
10ba0 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64  .     && db->nVd
10bb0 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61  beWrite==(p->rea
10bc0 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29  dOnly==0) .    )
10bd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
10be0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
10bf0 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
10c00 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
10c10 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
10c20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10c30 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
10c40 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  p, 1);.        i
10c50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
10c70 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f  ( NEVER(p->readO
10c80 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
10c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
10ca0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
10cb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10cc0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
10cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
10cf0 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
10d00 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
10d10 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
10d20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
10d30 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
10d40 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
10d50 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
10d60 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
10d70 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
10d80 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
10d90 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
10da0 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
10db0 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
10dc0 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
10dd0 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
10de0 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
10df0 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
10e00 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
10e10 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
10e20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
10e30 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
10e40 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10e50 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
10e60 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  && p->readOnly )
10e70 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10e80 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
10e90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10ea0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
10eb0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10ec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
10ee0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
10ef0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10f00 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
10f10 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  OK);.        }el
10f20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
10f30 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
10f40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
10f50 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
10f60 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
10f70 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
10f80 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
10f90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10fa0 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
10fb0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
10fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10fe0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10ff0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
11000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
11010 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
11020 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11030 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
11040 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
11050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
11060 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
11070 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
11080 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
11090 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
110a0 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
110b0 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
110c0 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
110d0 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
110e0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
110f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
11100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11110 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
11120 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
11130 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
11140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11150 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
11160 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
11170 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
11180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11190 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
111a0 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
111b0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
111c0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
111d0 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
111e0 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
111f0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
11200 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
11210 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
11220 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
11230 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
11240 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
11250 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
11260 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
11270 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
11280 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
11290 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
112a0 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
112b0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
112c0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
112d0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
112e0 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
112f0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
11300 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
11310 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
11320 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
11330 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
11340 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
11350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
11360 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
11370 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
11380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
11390 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
113a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
113b0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
113c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
113d0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
113e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
113f0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
11400 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
11410 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
11420 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
11430 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
11440 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
11450 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11460 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
11470 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
11480 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
11490 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
114a0 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
114b0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
114c0 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
114d0 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
114e0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
114f0 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
11500 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
11510 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
11520 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
11530 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
11540 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
11550 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
11560 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
11570 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
11580 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
11590 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
115a0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
115b0 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
115c0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
115d0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
115e0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
115f0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
11600 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
11610 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
11620 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
11630 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
11640 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
11650 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
11660 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11670 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
11680 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
11690 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
116a0 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
116b0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
116c0 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
116d0 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
116e0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
116f0 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
11700 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
11710 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
11720 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
11730 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
11740 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
11750 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
11760 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
11770 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
11780 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
11790 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  b);.  if( p->db-
117a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
117b0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
117c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
117d0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
117e0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
117f0 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
11800 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
11810 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
11820 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
11830 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
11840 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
11850 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
11860 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
11870 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
11880 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
11890 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
118a0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
118b0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
118c0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
118d0 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
118e0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
118f0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
11900 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
11910 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
11920 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
11930 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
11940 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
11950 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
11960 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
11970 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
11980 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
11990 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
119a0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
119b0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
119c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
119d0 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
119e0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
119f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11a00 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
11a10 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
11a20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
11a30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
11a40 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
11a50 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
11a60 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
11a70 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
11a80 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
11a90 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
11aa0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
11ab0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
11ac0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
11ad0 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
11ae0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
11af0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
11b00 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
11b10 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
11b20 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
11b30 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
11b40 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
11b50 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
11b60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
11b70 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
11b80 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
11b90 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
11ba0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11bb0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
11bc0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
11bd0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
11be0 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65    u8 mallocFaile
11bf0 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
11c00 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  iled;.    sqlite
11c10 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
11c20 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
11c30 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
11c40 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
11c50 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
11c60 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
11c70 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
11c80 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
11c90 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  c();.    db->mal
11ca0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
11cb0 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62  ocFailed;.    db
11cc0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
11cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11ce0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
11cf0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
11d00 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
11d10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11d20 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
11d30 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
11d40 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
11d50 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
11d60 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
11d70 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
11d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11d90 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
11da0 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
11db0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
11dc0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
11dd0 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
11de0 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
11df0 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
11e00 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
11e10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
11e20 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
11e30 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
11e40 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
11e50 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
11e60 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
11e70 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
11e80 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
11e90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11ea0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
11eb0 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
11ec0 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
11ed0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
11ee0 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
11ef0 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
11f00 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
11f10 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
11f20 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
11f30 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
11f40 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
11f50 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
11f60 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
11f70 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
11f80 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
11f90 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
11fa0 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
11fb0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
11fc0 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
11fd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11fe0 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
11ff0 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
12000 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
12010 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
12020 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
12030 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
12040 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
12050 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
12060 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
12070 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
12080 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
12090 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
120a0 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
120b0 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
120c0 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
120d0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
120e0 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
120f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
12100 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
12110 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
12120 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
12130 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
12140 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
12150 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
12160 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
12170 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
12180 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
12190 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
121a0 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
121b0 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
121c0 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
121d0 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
121e0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
121f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
12200 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
12210 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
12220 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
12230 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
12240 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
12250 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
12260 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
12270 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
12280 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
12290 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
122a0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
122b0 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
122c0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
122d0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
122e0 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b  ){.    vdbeInvok
122f0 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20  eSqllog(p);.    
12300 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
12310 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  ferError(p);.   
12320 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12330 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
12340 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
12350 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
12360 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
12370 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
12380 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
12390 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
123a0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
123b0 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
123c0 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
123d0 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
123e0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
123f0 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
12400 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
12410 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
12420 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
12430 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
12440 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
12450 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
12460 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
12470 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
12480 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->rc, 0);.    sq
12490 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
124a0 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
124b0 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
124c0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
124d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
124e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
124f0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
12500 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
12510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
12520 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
12530 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
12540 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
12550 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
12560 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
12570 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
12580 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
12590 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
125a0 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
125b0 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
125c0 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
125d0 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
125e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
125f0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
12600 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
12610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12620 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
12630 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
12640 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
12650 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
12660 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
12670 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
12680 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12690 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
126a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
126b0 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
126c0 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
126d0 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
126e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
126f0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
12700 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
12710 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
12720 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
12730 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
12740 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
12750 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
12760 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
12770 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
12780 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
12790 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
127a0 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
127b0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
127c0 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
127d0 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
127e0 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
127f0 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
12800 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
12810 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
12820 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12830 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
12840 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
12850 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
12860 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
12870 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
12880 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
12890 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
128a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
128b0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
128c0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
128d0 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
128e0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
128f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12900 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
12910 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
12920 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
12930 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
12940 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
12950 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12960 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
12970 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
12980 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
12990 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
129a0 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
129b0 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
129c0 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
129d0 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
129e0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
129f0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
12a00 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
12a10 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
12a20 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
12a30 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
12a40 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
12a50 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
12a60 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
12a70 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
12a80 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
12a90 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
12aa0 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
12ab0 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
12ac0 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
12ad0 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
12ae0 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
12af0 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
12b00 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
12b10 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
12b20 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
12b30 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
12b40 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
12b50 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
12b60 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
12b70 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
12b80 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
12b90 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
12ba0 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
12bb0 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
12bc0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
12bd0 6f 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74  orrsponds to bit
12be0 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69   0 etc.)..*/.voi
12bf0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
12c00 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20  eteAuxData(Vdbe 
12c10 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c  *pVdbe, int iOp,
12c20 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75   int mask){.  Au
12c30 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56  xData **pp = &pV
12c40 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20  dbe->pAuxData;. 
12c50 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
12c60 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
12c70 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
12c80 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
12c90 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20  (pAux->iOp==iOp 
12ca0 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33  && (pAux->iArg>3
12cb0 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 28 28  1 || !(mask & ((
12cc0 75 33 32 29 31 3c 3c 70 41 75 78 2d 3e 69 41 72  u32)1<<pAux->iAr
12cd0 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
12ce0 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
12cf0 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
12d00 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
12d10 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
12d20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
12d30 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
12d40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12d50 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
12d60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12d70 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
12d80 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
12d90 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
12da0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
12db0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
12dc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
12dd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
12de0 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
12df0 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
12e00 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
12e10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
12e20 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
12e30 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
12e40 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12e50 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
12e60 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
12e70 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
12e80 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
12e90 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
12ea0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
12eb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12ec0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
12ed0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
12ee0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
12ef0 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
12f00 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
12f10 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
12f20 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
12f30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
12f40 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
12f50 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
12f60 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12f70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
12f80 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
12f90 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
12fa0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
12fb0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
12fc0 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
12fd0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
12fe0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
12ff0 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
13000 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
13010 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
13020 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
13030 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13040 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
13050 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
13060 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
13070 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13080 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
13090 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
130a0 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
130b0 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
130c0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62  Free(db, p->aLab
130d0 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  el);.  sqlite3Db
130e0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
130f0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
13100 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
13110 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
13120 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
13130 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  e);.#if defined(
13140 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
13150 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71  EE_EXPLAIN).  sq
13160 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13170 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  p->zExplain);.  
13180 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13190 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a  , p->pExplain);.
131a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
131b0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
131c0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
131d0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
131e0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
131f0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
13200 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
13210 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
13220 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
13230 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13240 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
13250 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
13260 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
13270 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
13280 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
13290 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
132a0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
132b0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
132c0 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
132d0 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
132e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
132f0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
13300 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
13310 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
13320 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
13330 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
13340 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
13350 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
13360 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
13370 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
13380 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
13390 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
133a0 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
133b0 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
133c0 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
133d0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
133e0 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
133f0 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
13400 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
13410 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
13420 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
13430 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
13440 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
13450 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
13460 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
13470 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
13480 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
13490 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
134a0 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
134b0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
134c0 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
134d0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
134e0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
134f0 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
13500 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
13510 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
13520 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
13530 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
13540 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
13550 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
13560 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
13570 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
13580 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
13590 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
135a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
135b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
135c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
135d0 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
135e0 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
135f0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
13600 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
13610 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
13620 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
13630 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
13640 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
13650 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
13660 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
13670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13680 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
13690 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
136a0 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
136b0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
136c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
136d0 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
136e0 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
136f0 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72  arget;.    if( r
13700 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
13710 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13720 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  PT;.    p->rowid
13730 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66  IsValid = 1;.#if
13740 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
13750 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
13760 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
13770 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
13780 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
13790 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
137a0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
137b0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
137c0 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  YS(p->pCursor) )
137d0 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
137e0 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
137f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
13800 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
13810 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
13820 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
13830 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13840 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
13850 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
13860 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
13870 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
13880 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
13890 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
138a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
138b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
138c0 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
138d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
138e0 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
138f0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13900 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
13910 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
13920 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
13930 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
13940 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
13950 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
13960 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
13970 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
13980 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
13990 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
139a0 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
139b0 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
139c0 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
139d0 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
139e0 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
139f0 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
13a00 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
13a10 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
13a20 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
13a30 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
13a40 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
13a50 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
13a60 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
13a70 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
13a80 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
13a90 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
13aa0 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
13ab0 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
13ac0 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
13ad0 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
13ae0 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
13af0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
13b00 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
13b10 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
13b20 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
13b30 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
13b40 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
13b50 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
13b60 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
13b70 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
13b80 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
13b90 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13ba0 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
13bb0 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
13bc0 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
13bd0 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
13be0 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
13bf0 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
13c00 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
13c20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
13c30 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
13c40 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c60 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13c70 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13ca0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13cb0 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
13cd0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13ce0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13cf0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
13d00 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
13d10 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13d20 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
13d50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13d60 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
13d70 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
13d80 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13d90 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13da0 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13db0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
13dc0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13dd0 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
13e00 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
13e10 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
13e20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13e30 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
13e40 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13e70 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
13e80 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13eb0 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
13ec0 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
13ed0 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
13ee0 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
13ef0 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
13f00 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
13f10 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
13f20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
13f30 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
13f40 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
13f50 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
13f60 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
13f70 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
13f80 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
13f90 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
13fa0 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
13fb0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
13fc0 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
13fd0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
13fe0 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
13ff0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14000 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
14010 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
14020 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
14030 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
14040 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
14050 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
14060 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
14070 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
14080 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
14090 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
140a0 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
140b0 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
140c0 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
140d0 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
140e0 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
140f0 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
14100 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
14110 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
14120 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28  ){.      if( i<(
14130 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65  -MAX_6BYTE) ) re
14140 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a  turn 6;.      /*
14150 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70   Previous test p
14160 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28  revents:  u = -(
14170 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
14180 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75  5808) */.      u
14190 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = -i;.    }else
141a0 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
141b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
141c0 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74  127 ){.      ret
141d0 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26  urn ((i&1)==i &&
141e0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29   file_format>=4)
141f0 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b   ? 8+(u32)u : 1;
14200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
14210 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
14220 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
14230 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
14240 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
14250 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
14260 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
14270 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
14280 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
14290 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
142a0 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
142b0 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
142c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
142d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
142e0 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
142f0 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
14300 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
14310 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
14320 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
14330 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
14340 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
14350 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
14360 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
14370 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
14380 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
14390 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
143a0 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
143b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
143c0 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
143d0 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
143e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
143f0 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
14400 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
14410 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
14420 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
14430 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
14440 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
14450 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
14460 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
14470 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
14480 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
14490 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
144a0 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
144b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
144c0 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
144d0 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
144e0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
144f0 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
14500 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
14510 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
14520 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
14530 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
14540 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
14550 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
14560 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
14570 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
14580 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
14590 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
145a0 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
145b0 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
145c0 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
145d0 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
145e0 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
145f0 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
14600 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
14610 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
14620 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
14630 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
14640 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
14650 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
14660 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
14670 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
14680 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
14690 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
146a0 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
146b0 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
146c0 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
146d0 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
146e0 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
146f0 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
14700 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
14710 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
14720 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
14730 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
14740 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
14750 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
14760 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
14770 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
14780 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
14790 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
147a0 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
147b0 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
147c0 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
147d0 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
147e0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
147f0 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
14800 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
14810 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
14820 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
14830 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
14840 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
14850 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
14860 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
14870 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
14880 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
14890 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
148a0 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
148b0 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
148c0 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
148d0 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
148e0 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
148f0 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
14900 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
14910 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
14920 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
14930 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
14940 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
14950 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
14960 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
14970 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
14980 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
14990 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
149a0 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
149b0 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
149c0 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
149d0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
149e0 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
149f0 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
14a00 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
14a10 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
14a20 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
14a30 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
14a40 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
14a50 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
14a60 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
14a70 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
14a80 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
14a90 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
14aa0 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
14ab0 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
14ac0 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
14ad0 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
14ae0 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
14af0 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
14b00 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
14b10 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
14b20 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
14b30 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
14b40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b50 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
14b60 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
14b70 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
14b80 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
14b90 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
14ba0 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
14bb0 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
14bc0 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
14bd0 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
14be0 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
14bf0 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
14c00 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
14c10 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14c20 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
14c30 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
14c40 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
14c50 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
14c60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
14c70 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
14c80 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
14c90 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
14ca0 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
14cb0 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
14cc0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
14cd0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
14ce0 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
14cf0 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
14d00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14d10 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
14d20 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
14d30 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
14d40 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
14d50 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
14d60 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
14d70 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
14d80 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
14d90 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
14da0 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
14db0 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
14dc0 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
14dd0 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
14de0 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
14df0 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
14e00 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
14e10 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
14e20 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
14e30 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
14e40 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
14e50 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
14e60 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
14e70 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
14e80 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
14e90 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
14ea0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
14eb0 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
14ec0 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
14ed0 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
14ee0 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
14ef0 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
14f00 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
14f10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14f20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14f30 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
14f40 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
14f50 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
14f60 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
14f70 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
14f80 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
14f90 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
14fa0 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
14fb0 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
14fc0 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
14fd0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
14fe0 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
14ff0 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
15000 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
15010 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
15020 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
15030 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15040 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
15050 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
15060 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
15070 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
15080 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
15090 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
150a0 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
150b0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
150c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
150d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
150e0 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
150f0 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
15100 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
15110 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
15120 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
15130 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15140 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
15150 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
15160 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
15170 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
15180 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15190 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
151a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
151b0 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
151c0 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
151d0 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
151e0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
151f0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
15200 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
15210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
15220 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
15230 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
15240 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
15250 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
15260 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
15270 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
15280 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
15290 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
152a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
152b0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
152c0 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
152d0 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
152e0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
152f0 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
15300 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
15310 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
15320 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
15330 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
15340 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
15350 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
15360 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
15370 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
15380 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
15390 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
153a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
153b0 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
153c0 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
153d0 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
153e0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
153f0 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
15400 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
15410 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
15420 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
15430 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
15440 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
15450 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
15460 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
15470 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
15480 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
15490 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
154a0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
154b0 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
154c0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
154d0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
154e0 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
154f0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
15500 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
15510 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
15520 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
15530 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
15540 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
15550 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
15580 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
15590 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
155a0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
155b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
155c0 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
155d0 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
155e0 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
155f0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
15600 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
15610 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
15620 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
15630 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15640 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
15650 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15660 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
15670 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
15680 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15690 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
156a0 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
156b0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
156c0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
156d0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
156e0 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
156f0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15700 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
15710 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
15720 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
15730 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
15740 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15750 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15760 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
15770 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
15780 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
15790 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
157a0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
157b0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
157c0 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
157d0 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
157e0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
157f0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15800 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
15810 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
15820 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
15830 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
15840 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
15850 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
15860 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
15870 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
15880 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
15890 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
158a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
158b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
158c0 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
158d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
158e0 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
158f0 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
15900 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
15910 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
15920 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
15930 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
15940 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
15950 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
15960 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
15970 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
15980 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
15990 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
159a0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
159b0 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
159c0 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
159d0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
159e0 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
159f0 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
15a00 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
15a10 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
15a20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
15a30 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
15a40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15a50 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
15a60 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
15a70 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
15a80 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
15a90 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
15aa0 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
15ab0 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
15ac0 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
15ad0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
15ae0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
15af0 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
15b00 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
15b10 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
15b20 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
15b30 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
15b40 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
15b50 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
15b60 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
15b70 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
15b80 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
15b90 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
15ba0 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
15bb0 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
15bc0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
15bd0 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
15be0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
15bf0 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
15c00 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
15c10 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
15c20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
15c30 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
15c40 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
15c50 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
15c60 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
15c70 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
15c80 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
15c90 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
15ca0 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
15cb0 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
15cc0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
15cd0 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
15ce0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
15cf0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
15d00 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15d10 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
15d20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
15d30 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
15d40 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
15d50 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
15d60 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
15d70 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
15d80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
15d90 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
15da0 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
15db0 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
15dc0 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
15dd0 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
15de0 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
15df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
15e00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
15e10 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
15e20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
15e30 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
15e40 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
15e50 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
15e60 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
15e70 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15e80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
15e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
15ea0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
15eb0 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
15ec0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
15ed0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
15ee0 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
15ef0 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
15f00 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
15f10 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
15f20 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
15f30 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
15f40 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
15f50 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
15f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15f70 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15f80 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
15f90 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
15fa0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
15fb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15fc0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
15fd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
15fe0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
15ff0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
16000 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
16010 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
16020 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
16030 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
16040 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
16050 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
16060 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16070 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
16080 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
16090 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
160a0 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
160b0 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
160c0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
160d0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
160e0 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
160f0 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
16100 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
16110 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
16120 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
16130 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
16140 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
16150 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
16160 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
16170 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
16180 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
16190 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
161a0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
161b0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
161c0 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
161d0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
161e0 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
161f0 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
16200 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
16210 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
16220 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
16230 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
16240 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
16250 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
16260 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
16270 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
16280 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
16290 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
162a0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
162b0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
162c0 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
162d0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
162e0 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
162f0 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
16300 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
16310 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
16320 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
16330 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16340 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
16350 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
16360 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
16370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16380 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
16390 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
163a0 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
163b0 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
163c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
163d0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
163e0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
163f0 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16410 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
16420 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
16430 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
16440 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
16450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16460 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
16470 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
16480 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
16490 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
164a0 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
164b0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
164c0 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
164d0 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
164e0 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
164f0 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
16500 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
16510 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
16520 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
16530 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
16540 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
16550 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
16560 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
16570 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
16580 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
16590 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
165a0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
165b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
165c0 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
165d0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
165e0 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
165f0 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
16600 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
16610 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
16620 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
16630 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
16640 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
16650 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
16660 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
16670 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16680 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
16690 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
166a0 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
166b0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
166c0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
166d0 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
166e0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
166f0 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
16700 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
16710 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
16720 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
16730 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
16740 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
16750 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
16760 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
16770 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
16780 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
16790 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
167a0 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
167b0 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
167c0 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
167d0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
167e0 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
167f0 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
16800 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
16810 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
16820 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16830 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
16840 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16850 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
16860 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
16870 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
16880 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
16890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
168a0 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
168b0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
168c0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
168d0 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
168e0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
168f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
16900 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
16910 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
16920 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16930 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
16940 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
16950 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
16960 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
16970 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
16980 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169a0 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
169b0 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
169c0 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
169f0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
16a00 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
16a10 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
16a20 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20  em;..  p->flags 
16a30 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
16a40 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
16a50 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
16a60 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
16a70 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
16a80 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
16a90 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
16aa0 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
16ab0 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
16ac0 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
16ad0 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
16ae0 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
16af0 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
16b00 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
16b10 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
16b20 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
16b30 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
16b40 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
16b50 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
16b60 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
16b70 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
16b80 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
16b90 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  /.    pMem->zMal
16ba0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  loc = 0;.    pMe
16bb0 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20  m->z = 0;.    d 
16bc0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
16bd0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
16be0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
16bf0 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
16c00 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20  ;.    u++;.  }. 
16c10 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
16c20 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
16c30 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
16c40 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = u;.}../*.** Th
16c50 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
16c60 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
16c70 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
16c80 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
16c90 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
16ca0 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
16cb0 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
16cc0 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
16cd0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
16ce0 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
16cf0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
16d00 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
16d10 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
16d20 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
16d30 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
16d40 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
16d50 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
16d60 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
16d70 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
16d80 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
16d90 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
16da0 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
16db0 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
16dc0 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
16dd0 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
16de0 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
16df0 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
16e00 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16e10 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65  f fields..** The
16e20 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20   key with fewer 
16e30 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c  fields is usuall
16e40 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20  y compares less 
16e50 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e  than the .** lon
16e60 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65  ger key.  Howeve
16e70 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
16e80 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20  D_INCRKEY flags 
16e90 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74  in pPKey2 is set
16ea0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d  .** and the comm
16eb0 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20  on prefixes are 
16ec0 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31  equal, then key1
16ed0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65   is less than ke
16ee0 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65  y2..** Or if the
16ef0 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f   UNPACKED_MATCH_
16f00 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73  PREFIX flag is s
16f10 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69  et and the prefi
16f20 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  xes are.** equal
16f30 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20  , then the keys 
16f40 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
16f50 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a  o be equal and.*
16f60 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f  * the parts beyo
16f70 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
16f80 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64  efix are ignored
16f90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16fa0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
16fb0 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
16fc0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
16fd0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
16fe0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
16ff0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
17000 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
17010 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
17020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
17030 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
17040 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
17050 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
17060 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
17070 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
17080 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
17090 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
170a0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
170b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
170c0 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
170d0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
170e0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
170f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
17100 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
17110 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
17120 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
17130 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
17140 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
17150 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
17160 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
17170 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
17180 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
17190 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
171a0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
171b0 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
171c0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
171d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
171e0 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
171f0 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c  _ONLY( mem1.zMal
17200 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
17210 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
17220 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
17230 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
17240 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
17250 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
17260 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
17270 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
17280 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
17290 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
172a0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
172b0 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
172c0 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
172d0 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
172e0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
172f0 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
17300 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
17310 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
17320 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
17330 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
17340 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
17350 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
17360 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
17370 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
17380 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
17390 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
173a0 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
173b0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
173c0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
173d0 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
173e0 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
173f0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
17400 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
17410 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
17420 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
17430 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
17440 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
17450 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
17460 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31  1, szHdr1);.  d1
17470 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
17480 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
17490 46 69 65 6c 64 2b 31 3e 3d 70 50 4b 65 79 32 2d  Field+1>=pPKey2-
174a0 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 61 73 73  >nField );.  ass
174b0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
174c0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
174d0 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a    while( idx1<sz
174e0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
174f0 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
17500 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
17510 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
17520 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
17530 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
17540 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
17550 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
17560 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
17570 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
17580 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
17590 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
175a0 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
175b0 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
175c0 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
175d0 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
175e0 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
175f0 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
17600 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
17610 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
17620 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
17630 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
17640 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
17650 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
17660 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
17670 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
17680 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
17690 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
176a0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
176b0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
176c0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
176d0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
176e0 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
176f0 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
17700 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
17710 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17720 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
17730 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
17740 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
17750 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17760 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
17770 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
17780 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
17790 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
177a0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
177b0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
177c0 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
177d0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
177e0 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
177f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
17800 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
17810 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
17820 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
17830 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
17840 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
17850 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
17860 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
17870 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
17880 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
17890 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
178a0 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
178b0 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
178c0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
178d0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
178e0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
178f0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
17900 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66      .      /* If
17910 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
17920 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  CH flag is set a
17930 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  nd all fields ex
17940 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  cept the final. 
17950 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69       ** rowid fi
17960 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20  eld were equal, 
17970 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50  then clear the P
17980 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
17990 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20  g and set .     
179a0 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69   ** pPKey2->rowi
179b0 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  d to the value o
179c0 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  f the rowid fiel
179d0 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65  d in (pKey1, nKe
179e0 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  y1)..      ** Th
179f0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
17a00 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70  e OP_IsUnique op
17a10 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  code..      */. 
17a20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65 79 32       if( (pPKey2
17a30 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
17a40 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
17a50 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d  ) && i==(pPKey2-
17a60 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20  >nField-1) ){.  
17a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
17a80 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63  x1==szHdr1 && rc
17a90 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
17aa0 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  rt( mem1.flags &
17ab0 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
17ac0 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67      pPKey2->flag
17ad0 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50  s &= ~UNPACKED_P
17ae0 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
17af0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f        pPKey2->ro
17b00 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a  wid = mem1.u.i;.
17b10 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
17b20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17b30 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
17b40 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
17b50 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
17b60 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
17b70 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
17b80 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
17b90 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
17ba0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
17bb0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
17bc0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
17bd0 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
17be0 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
17bf0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
17c00 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
17c10 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
17c20 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
17c30 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
17c40 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
17c50 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
17c60 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
17c70 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
17c80 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
17c90 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
17ca0 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
17cb0 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67  NCRKEY.  ** flag
17cc0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72   is set, then br
17cd0 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74  eak the tie by t
17ce0 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20  reating key2 as 
17cf0 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20  larger..  ** If 
17d00 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
17d10 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
17d20 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
17d30 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
17d40 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ixes.  ** are co
17d50 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
17d60 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
17d70 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
17d80 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61   is the .  ** la
17d90 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70  rger.  As it hap
17da0 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32  pens, the pPKey2
17db0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
17dc0 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20  the longer.  ** 
17dd0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
17de0 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
17df0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
17e00 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
17e10 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
17e20 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
17e30 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
17e40 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
17e50 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
17e60 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
17e70 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30    /* Leave rc==0
17e80 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
17e90 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20  idx1<szHdr1 ){. 
17ea0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
17eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
17ec0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
17ed0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
17ee0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
17ef0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
17f00 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
17f10 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
17f20 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
17f30 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
17f40 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
17f50 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
17f60 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
17f70 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
17f80 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
17f90 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
17fa0 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
17fb0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
17fc0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
17fd0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
17fe0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
17ff0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
18000 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
18010 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
18020 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
18030 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18040 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
18050 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
18060 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
18070 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
18080 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
18090 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
180a0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
180b0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
180c0 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
180d0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
180e0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
180f0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
18100 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
18110 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
18120 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
18130 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18140 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
18150 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
18160 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
18170 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
18180 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
18190 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
181a0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
181b0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
181c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
181d0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
181e0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
181f0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
18200 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
18210 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
18220 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
18230 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
18240 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
18250 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
18260 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18270 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
18280 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
18290 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
182a0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
182b0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
182c0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
182d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
182e0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
182f0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
18300 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
18310 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
18320 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
18330 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
18340 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
18350 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
18360 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
18370 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18380 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ry */.  memset(&
18390 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
183a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
183b0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
183c0 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e  (pCur, 0, (int)n
183d0 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
183e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
183f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18400 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
18410 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
18420 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
18430 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
18440 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
18450 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
18460 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
18470 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
18480 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
18490 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
184a0 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
184b0 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
184c0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
184d0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
184e0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
184f0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
18500 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
18510 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
18520 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
18530 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
18540 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
18550 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
18560 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
18570 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
18580 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
18590 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
185a0 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
185b0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
185c0 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
185d0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
185e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
185f0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
18600 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18610 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
18620 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18630 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
18640 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
18650 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18660 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
18670 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
18680 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
18690 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
186a0 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
186b0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
186c0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
186d0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
186e0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
186f0 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
18700 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
18710 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
18720 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
18730 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
18740 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
18750 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
18760 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
18770 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
18780 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
18790 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
187a0 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
187b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
187c0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
187d0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
187e0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
187f0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
18800 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
18810 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18820 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18830 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
18840 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
18850 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
18860 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
18870 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
18880 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
18890 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
188a0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
188b0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
188c0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
188d0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
188e0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
188f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
18900 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
18910 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18920 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
18930 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
18940 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
18950 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
18960 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
18970 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
18980 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
18990 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
189a0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
189b0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
189c0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
189d0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
189e0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
189f0 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
18a00 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
18a10 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
18a20 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18a30 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
18a40 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
18a50 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
18a60 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
18a70 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
18a80 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
18a90 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
18aa0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
18ab0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18ac0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
18ad0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
18ae0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
18af0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
18b00 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
18b10 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
18b20 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
18b30 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
18b40 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
18b50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
18b60 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
18b70 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  (.  VdbeCursor *
18b80 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
18b90 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
18ba0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
18bb0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
18bc0 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
18bd0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
18be0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20  rsion of key to 
18bf0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
18c00 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
18c30 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
18c40 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
18c50 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
18c60 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
18c70 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
18c80 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d  pCursor;.  Mem m
18c90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
18ca0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
18cb0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
18cc0 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
18cd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
18ce0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
18cf0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
18d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18d10 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
18d20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
18d30 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
18d40 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
18d50 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
18d60 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
18d70 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
18d80 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
18d90 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
18da0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
18db0 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
18dc0 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
18dd0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
18de0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
18df0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
18e00 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
18e10 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
18e20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18e30 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
18e40 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
18e50 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
18e60 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
18e70 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
18e80 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
18e90 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
18ea0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
18eb0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
18ec0 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
18ed0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
18ee0 52 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20  REFIX_MATCH );. 
18ef0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
18f00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
18f10 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
18f20 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
18f30 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
18f40 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
18f50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18f60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
18f70 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
18f80 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
18f90 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
18fa0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
18fb0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
18fc0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
18fd0 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
18fe0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
18ff0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
19000 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
19010 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19020 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
19030 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
19040 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
19050 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
19060 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
19070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
19080 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
19090 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
190a0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
190b0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
190c0 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
190d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
190e0 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
190f0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
19100 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
19110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
19120 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
19130 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
19140 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
19150 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
19160 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
19170 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
19180 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
19190 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
191a0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
191b0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
191c0 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
191d0 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
191e0 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
191f0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
19200 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
19210 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
19220 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
19230 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
19240 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
19250 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
19260 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
19270 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
19280 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
19290 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
192a0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
192b0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
192c0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
192d0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
192e0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
192f0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
19300 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
19310 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
19320 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
19330 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
19340 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
19350 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19360 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
19370 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
19380 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
19390 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
193a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
193b0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
193c0 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
193d0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
193e0 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
193f0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
19400 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
19410 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
19420 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
19430 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
19440 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
19450 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
19460 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
19470 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
19480 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
19490 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
194a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
194b0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
194c0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
194d0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
194e0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
194f0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19500 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
19510 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
19520 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
19530 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
19540 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
19550 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
19560 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
19570 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
19580 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
19590 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
195a0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
195b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
195c0 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
195d0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
195e0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
195f0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
19600 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
19610 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
19620 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
19630 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
19640 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
19650 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
19660 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19670 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
19680 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b  pe((Mem *)pRet);
19690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
196a0 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
196b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
196c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
196d0 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
196e0 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
196f0 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
19700 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
19710 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
19720 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
19730 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
19740 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
19750 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
19760 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
19770 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19780 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
19790 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
197a0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
197b0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
197c0 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
197d0 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
197e0 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
197f0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
19800 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
19810 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
19820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19830 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
19840 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
19850 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
19860 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
19870 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
19880 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
19890 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
198a0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
198b0 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
198c0 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
198d0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
198e0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
198f0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
19900 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
19910 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
19920 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
19930 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
19940 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19950 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69   = p->db;.  sqli
19960 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
19970 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
19980 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
19990 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56  3DbStrDup(db, pV
199a0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
199b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
199c0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
199d0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
199e0 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
199f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19a00 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
19a10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19a20 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
19a30 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K../*.** If the 
19a40 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19a50 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c  is not NULL, rel
19a60 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74  ease any allocat
19a70 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
19a80 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d  .** with the mem
19a90 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  ory cells in the
19aa0 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79   p->aMem[] array
19ab0 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20  . Also free the 
19ac0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
19ad0 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  * structure itse
19ae0 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65  lf, using sqlite
19af0 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  3DbFree()..**.**
19b00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19b10 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20 55  s used to free U
19b20 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
19b30 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74  ructures allocat
19b40 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62  ed by.** the vdb
19b50 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20  eUnpackRecord() 
19b60 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
19b70 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a  n vdbeapi.c..*/.
19b80 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
19b90 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c  FreeUnpacked(sql
19ba0 69 74 65 33 20 2a 64 62 2c 20 55 6e 70 61 63 6b  ite3 *db, Unpack
19bb0 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
19bc0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
19bd0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
19be0 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b   i<p->nField; i+
19bf0 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  +){.      Mem *p
19c00 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69  Mem = &p->aMem[i
19c10 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ];.      if( pMe
19c20 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m->zMalloc ) sql
19c30 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
19c40 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  se(pMem);.    }.
19c50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
19c60 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
19c70 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
19c80 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
19c90 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  k. If this is an
19ca0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
19cb0 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c  E pre-update cal
19cc0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f  l,.** then curso
19cd0 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
19ce0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19cf0 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
19d00 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a  the row about.**
19d10 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72   to be update or
19d20 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65   deleted. If the
19d30 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c   application cal
19d40 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  ls sqlite3_preup
19d50 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74  date_old(),.** t
19d60 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
19d70 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  e will be read f
19d80 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20  rom the row the 
19d90 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
19da0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19db0 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f  3VdbePreUpdateHo
19dc0 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ok(.  Vdbe *v,  
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72        /* Vdbe pr
19df0 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73  e-update hook is
19e00 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20   invoked by */. 
19e10 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73   VdbeCursor *pCs
19e20 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
19e30 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72   /* Cursor to gr
19e40 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20  ab old.* values 
19e50 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  from */.  int op
19e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
19e80 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41  ITE_INSERT, UPDA
19e90 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a  TE or DELETE */.
19ea0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19eb0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
19ec0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
19ed0 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
19ee0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
19ef0 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66          /* Modif
19f00 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ied table */.  i
19f10 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20  64 iKey1,       
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f30 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61  * Initial key va
19f40 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  lue */.  int iRe
19f50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
19f60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
19f70 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72  ster for new.* r
19f80 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  ecord */.){.  sq
19f90 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64  lite3 *db = v->d
19fa0 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a  b;.  i64 iKey2;.
19fb0 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75    PreUpdate preu
19fc0 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pdate;.  const c
19fd0 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62  har *zTbl = pTab
19fe0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69  ->zName;.  stati
19ff0 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53  c const u8 fakeS
1a000 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20  ortOrder = 0;.. 
1a010 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72   assert( db->pPr
1a020 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20  eUpdate==0 );.  
1a030 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64 61 74  memset(&preupdat
1a040 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65  e, 0, sizeof(Pre
1a050 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20  Update));.  if( 
1a060 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
1a070 45 20 29 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d  E ){.    iKey2 =
1a080 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75   v->aMem[iReg].u
1a090 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .i;.  }else{.   
1a0a0 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a   iKey2 = iKey1;.
1a0b0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
1a0c0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
1a0d0 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20  b->nCol .       
1a0e0 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64  || (pCsr->nField
1a0f0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26  ==pTab->nCol+1 &
1a100 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  & op==SQLITE_DEL
1a110 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29  ETE && iReg==-1)
1a120 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61  .  );..  preupda
1a130 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75  te.v = v;.  preu
1a140 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73  pdate.pCsr = pCs
1a150 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f  r;.  preupdate.o
1a160 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64  p = op;.  preupd
1a170 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52  ate.iNewReg = iR
1a180 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  eg;.  preupdate.
1a190 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b  keyinfo.db = db;
1a1a0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
1a1b0 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64  info.enc = ENC(d
1a1c0 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  b);.  preupdate.
1a1d0 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d  keyinfo.nField =
1a1e0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70   pTab->nCol;.  p
1a1f0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
1a200 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  .aSortOrder = (u
1a210 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65  8*)&fakeSortOrde
1a220 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  r;.  preupdate.i
1a230 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key1 = iKey1;.  
1a240 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20  preupdate.iKey2 
1a250 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70  = iKey2;.  preup
1a260 64 61 74 65 2e 69 50 4b 65 79 20 3d 20 70 54 61  date.iPKey = pTa
1a270 62 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20 64 62 2d  b->iPKey;..  db-
1a280 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
1a290 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
1a2a0 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
1a2b0 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
1a2c0 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
1a2d0 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
1a2e0 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
1a2f0 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
1a300 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a310 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
1a320 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
1a330 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
1a340 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64  update.pUnpacked
1a350 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
1a360 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
1a370 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64  ate.pNewUnpacked
1a380 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61  );.  if( preupda
1a390 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69  te.aNew ){.    i
1a3a0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1a3b0 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c  0; i<pCsr->nFiel
1a3c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
1a3d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1a3e0 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e  ease(&preupdate.
1a3f0 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aNew[i]);.    }.
1a400 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1a410 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  e(db, preupdate.
1a420 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
1a430 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1a440 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
1a450 4f 4f 4b 20 2a 2f 0a                             OOK */.