/ Hex Artifact Content
Login

Artifact feeafee5f9de51c0d30907e0600ce4db5d032df8:


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 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 34 32 20 32  eaux.c,v 1.442 2
02c0: 30 30 39 2f 30 33 2f 31 36 20 31 33 3a 31 39 3a  009/03/16 13:19:
02d0: 33 36 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  36 danielk1977 E
02e0: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
02f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0300: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
0310: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
0320: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0330: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0340: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0350: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0360: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0370: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0380: 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63  to 1 and all opc
0390: 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69  odes will be pri
03a0: 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20  nted.** as they 
03b0: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
03c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72   instruction str
03d0: 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  eam..*/.#ifdef S
03e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
03f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
0400: 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
0410: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  f.../*.** Create
0420: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64   a new virtual d
0430: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a  atabase engine..
0440: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
0450: 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69 74  VdbeCreate(sqlit
0460: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
0470: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
0480: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0490: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
04a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
04c0: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
04d0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
04e0: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
04f0: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0500: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0510: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0520: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0530: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0540: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0550: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
0560: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
0570: 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20   SQL string for 
0580: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
0590: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
05a0: 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28  lite3VdbeSetSql(
05b0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
05c0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69  har *z, int n, i
05d0: 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29 7b  nt isPrepareV2){
05e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
05f0: 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
0600: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
0610: 20 69 66 28 20 21 69 73 50 72 65 70 61 72 65 56   if( !isPrepareV
0620: 32 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  2 ) return;.#end
0630: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
0640: 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  zSql==0 );.  p->
0650: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  zSql = sqlite3Db
0660: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
0670: 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65  , n);.  p->isPre
0680: 70 61 72 65 56 32 20 3d 20 69 73 50 72 65 70 61  pareV2 = isPrepa
0690: 72 65 56 32 20 3f 20 31 20 3a 20 30 3b 0a 7d 0a  reV2 ? 1 : 0;.}.
06a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
06b0: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
06c0: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
06d0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
06e0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
06f0: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0700: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 56 64  mt *pStmt){.  Vd
0710: 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29  be *p = (Vdbe *)
0720: 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  pStmt;.  return 
0730: 28 70 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20  (p->isPrepareV2 
0740: 3f 20 70 2d 3e 7a 53 71 6c 20 3a 20 30 29 3b 0a  ? p->zSql : 0);.
0750: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c  }../*.** Swap al
0760: 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65  l content betwee
0770: 6e 20 74 77 6f 20 56 44 42 45 20 73 74 72 75 63  n two VDBE struc
0780: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0790: 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28 56  qlite3VdbeSwap(V
07a0: 64 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70  dbe *pA, Vdbe *p
07b0: 42 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20  B){.  Vdbe tmp, 
07c0: 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a  *pTmp;.  char *z
07d0: 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41  Tmp;.  tmp = *pA
07e0: 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20  ;.  *pA = *pB;. 
07f0: 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54   *pB = tmp;.  pT
0800: 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a  mp = pA->pNext;.
0810: 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42    pA->pNext = pB
0820: 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70  ->pNext;.  pB->p
0830: 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70  Next = pTmp;.  p
0840: 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b  Tmp = pA->pPrev;
0850: 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70  .  pA->pPrev = p
0860: 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e  B->pPrev;.  pB->
0870: 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20  pPrev = pTmp;.  
0880: 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b  zTmp = pA->zSql;
0890: 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42  .  pA->zSql = pB
08a0: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53  ->zSql;.  pB->zS
08b0: 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d  ql = zTmp;.  pB-
08c0: 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20 70  >isPrepareV2 = p
08d0: 41 2d 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a  A->isPrepareV2;.
08e0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
08f0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72  _DEBUG./*.** Tur
0900: 6e 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20  n tracing on or 
0910: 6f 66 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  off.*/.void sqli
0920: 74 65 33 56 64 62 65 54 72 61 63 65 28 56 64 62  te3VdbeTrace(Vdb
0930: 65 20 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63  e *p, FILE *trac
0940: 65 29 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d  e){.  p->trace =
0950: 20 74 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66   trace;.}.#endif
0960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
0970: 68 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61  he Vdbe.aOp arra
0980: 79 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  y so that it is 
0990: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 20  at least one op 
09a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
09b0: 69 74 20 77 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  it was..**.** If
09c0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
09d0: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
09e0: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
09f0: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0a00: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0a10: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0a20: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0a30: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a40: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a50: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a60: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a70: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a80: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a90: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0aa0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ab0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0ad0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ae0: 70 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e  p){.  VdbeOp *pN
0af0: 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  ew;.  int nNew =
0b00: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0b10: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0b20: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0b30: 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77 20  f(Op)));.  pNew 
0b40: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0b50: 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  oc(p->db, p->aOp
0b60: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70  , nNew*sizeof(Op
0b70: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  ));.  if( pNew )
0b80: 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  {.    p->nOpAllo
0b90: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0ba0: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0bb0: 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  New)/sizeof(Op);
0bc0: 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e  .    p->aOp = pN
0bd0: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0be0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0bf0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0c00: 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  M);.}../*.** Add
0c10: 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69   a new instructi
0c20: 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  on to the list o
0c30: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63  f instructions c
0c40: 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a  urrent in the.**
0c50: 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74   VDBE.  Return t
0c60: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
0c70: 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  e new instructio
0c80: 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  n..**.** Paramet
0c90: 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20  ers:.**.**    p 
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f                Po
0cb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42  inter to the VDB
0cc0: 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20  E.**.**    op   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f             The o
0ce0: 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69  pcode for this i
0cf0: 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a  nstruction.**.**
0d00: 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20      p1, p2, p3  
0d10: 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a      Operands.**.
0d20: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
0d30: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
0d40: 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  el() function to
0d50: 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73 20   fix an address 
0d60: 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  and.** the sqlit
0d70: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
0d80: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61   function to cha
0d90: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
0da0: 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61   the P4.** opera
0db0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
0dc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62  e3VdbeAddOp3(Vdb
0dd0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
0de0: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e  t p1, int p2, in
0df0: 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t p3){.  int i;.
0e00: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a    VdbeOp *pOp;..
0e10: 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20    i = p->nOp;.  
0e20: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
0e30: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
0e40: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
0e50: 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29  p>0 && op<0xff )
0e60: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c  ;.  if( p->nOpAl
0e70: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66  loc<=i ){.    if
0e80: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29  ( growOpArray(p)
0e90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0ea0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0eb0: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
0ec0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0ed0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75  pOp->opcode = (u
0ee0: 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20  8)op;.  pOp->p5 
0ef0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d  = 0;.  pOp->p1 =
0f00: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
0f10: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
0f20: 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70   p3;.  pOp->p4.p
0f30: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74   = 0;.  pOp->p4t
0f40: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
0f50: 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
0f60: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
0f70: 45 5f 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a  E_DEBUG.  pOp->z
0f80: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69  Comment = 0;.  i
0f90: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
0fa0: 64 6f 70 54 72 61 63 65 20 29 20 73 71 6c 69 74  dopTrace ) sqlit
0fb0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
0fc0: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
0fd0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56  .#endif.#ifdef V
0fe0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f  DBE_PROFILE.  pO
0ff0: 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  p->cycles = 0;. 
1000: 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23   pOp->cnt = 0;.#
1010: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
1020: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1030: 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a  dbeAddOp0(Vdbe *
1040: 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65  p, int op){.  re
1050: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1060: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c  AddOp3(p, op, 0,
1070: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
1080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1090: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
10a0: 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75   int p1){.  retu
10b0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
10c0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
10d0: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
10e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56  ite3VdbeAddOp2(V
10f0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1100: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
1110: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1120: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1130: 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d  p, p1, p2, 0);.}
1140: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  .../*.** Add an 
1150: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1160: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1170: 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a  e as a pointer..
1180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1190: 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65  beAddOp4(.  Vdbe
11a0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11b0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
11c0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
11d0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
11e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
11f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1200: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
1210: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
1220: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
1230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1240: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
1250: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
1260: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1270: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
1280: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
1290: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
12a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74  and */.  int p4t
12b0: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ype          /* 
12c0: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20  P4 operand type 
12d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
12e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12f0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1300: 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74  p2, p3);.  sqlit
1310: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1320: 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74  , addr, zP4, p4t
1330: 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ype);.  return a
1340: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ddr;.}../*.** Cr
1350: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
1360: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e  lic label for an
1370: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1380: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a  t has yet to be.
1390: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73  ** coded.  The s
13a0: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73  ymbolic label is
13b0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e   really just a n
13c0: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20  egative number. 
13d0: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61   The.** label ca
13e0: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  n be used as the
13f0: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20   P2 value of an 
1400: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65  operation.  Late
1410: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  r, when.** the l
1420: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64  abel is resolved
1430: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61   to a specific a
1440: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45  ddress, the VDBE
1450: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68   will scan.** th
1460: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74  rough its operat
1470: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61  ion list and cha
1480: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  nge all values o
1490: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68  f P2 which match
14a0: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e  .** the label in
14b0: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20  to the resolved 
14c0: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  address..**.** T
14d0: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68  he VDBE knows th
14e0: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73  at a P2 value is
14f0: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65   a label because
1500: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61   labels are.** a
1510: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61  lways negative a
1520: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65  nd P2 values are
1530: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e   suppose to be n
1540: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
1550: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76  Hence, a negativ
1560: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  e P2 value is a 
1570: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79  label that has y
1580: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65  et to be resolve
1590: 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  d..**.** Zero is
15a0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
15b0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
15c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15d0: 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20  eMakeLabel(Vdbe 
15e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
15f0: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1600: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1610: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1620: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e  INIT );.  if( i>
1630: 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20  =p->nLabelAlloc 
1640: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
1650: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20  ->nLabelAlloc*2 
1660: 2b 20 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  + 5;.    p->aLab
1670: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
1680: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
1690: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20  b, p->aLabel,.  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d       n*sizeof(p-
16d0: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
16e0: 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63    p->nLabelAlloc
16f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1700: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d  ocSize(p->db, p-
1710: 3e 61 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28  >aLabel)/sizeof(
1720: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20  p->aLabel[0]);. 
1730: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62   }.  if( p->aLab
1740: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1750: 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d  bel[i] = -1;.  }
1760: 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a  .  return -1-i;.
1770: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
1780: 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65   label "x" to be
1790: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
17a0: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
17b0: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e  tion to.** be in
17c0: 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72  serted.  The par
17d0: 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20  ameter "x" must 
17e0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
17f0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69  ed from.** a pri
1800: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
1810: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1820: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1830: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1840: 65 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  el(Vdbe *p, int 
1850: 78 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31  x){.  int j = -1
1860: 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  -x;.  assert( p-
1870: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1880: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
1890: 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70  ert( j>=0 && j<p
18a0: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66  ->nLabel );.  if
18b0: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
18c0: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
18d0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a  = p->nOp;.  }.}.
18e0: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f  ./*.** Loop thro
18f0: 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ugh the program 
1900: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76  looking for P2 v
1910: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e  alues that are n
1920: 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75  egative.** on ju
1930: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  mp instructions.
1940: 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75    Each such valu
1950: 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52  e is a label.  R
1960: 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61  esolve the.** la
1970: 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74  bel by setting t
1980: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69  he P2 value to i
1990: 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a  ts correct non-z
19a0: 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
19b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19c0: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74   called once aft
19d0: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
19e0: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
19f0: 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  d..**.** Variabl
1a00: 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20  e *pMaxFuncArgs 
1a10: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61  is set to the ma
1a20: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61  ximum value of a
1a30: 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a  ny P2 argument .
1a40: 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63  ** to an OP_Func
1a50: 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70  tion, OP_AggStep
1a60: 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f   or OP_VFilter o
1a70: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
1a80: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
1a90: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
1aa0: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
1ab0: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
1ac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ad0: 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74  tine also does t
1ae0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74  he following opt
1af0: 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73  imization:  It s
1b00: 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73 74  cans for.** inst
1b10: 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  ructions that mi
1b20: 67 68 74 20 63 61 75 73 65 20 61 20 73 74 61 74  ght cause a stat
1b30: 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20  ement rollback. 
1b40: 20 53 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f   Such instructio
1b50: 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  ns.** are:.**.**
1b60: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69     *  OP_Halt wi
1b70: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
1b80: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
1b90: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
1ba0: 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20   OP_Destroy.**  
1bb0: 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a   *  OP_VUpdate.*
1bc0: 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d  *   *  OP_VRenam
1bd0: 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  e.**.** If no su
1be0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
1bf0: 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76  s found, then ev
1c00: 65 72 79 20 53 74 61 74 65 6d 65 6e 74 20 69 6e  ery Statement in
1c10: 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  struction .** is
1c20: 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f   changed to a No
1c30: 6f 70 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  op.  In this way
1c40: 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65 61 74  , we avoid creat
1c50: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
1c60: 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  t .** journal fi
1c70: 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79  le unnecessarily
1c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c90: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
1ca0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
1cb0: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
1cc0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
1cd0: 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 4f 70 20  xArgs = 0;.  Op 
1ce0: 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  *pOp;.  int *aLa
1cf0: 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b  bel = p->aLabel;
1d00: 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65  .  int doesState
1d10: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  mentRollback = 0
1d20: 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65  ;.  int hasState
1d30: 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20  mentBegin = 0;. 
1d40: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31   p->readOnly = 1
1d50: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
1d60: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66 6f  ournal = 0;.  fo
1d70: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
1d80: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
1d90: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
1da0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
1db0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69  ->opcode;..    i
1dc0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75  f( opcode==OP_Fu
1dd0: 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65  nction || opcode
1de0: 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a  ==OP_AggStep ){.
1df0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1e00: 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  5>nMaxArgs ) nMa
1e10: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b  xArgs = pOp->p5;
1e20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e30: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1e40: 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
1e50: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
1e60: 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  te ){.      if( 
1e70: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
1e80: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
1e90: 70 2d 3e 70 32 3b 0a 23 65 6e 64 69 66 0a 20 20  p->p2;.#endif.  
1ea0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
1eb0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20  de==OP_Halt ){. 
1ec0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
1ed0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
1ee0: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
1ef0: 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
1f00: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
1f10: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
1f20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1f30: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1f40: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
1f50: 20 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42     hasStatementB
1f60: 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  egin = 1;.      
1f70: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
1f80: 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  al = 1;.    }els
1f90: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
1fa0: 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  _Destroy ){.    
1fb0: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1fc0: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1fd0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1fe0: 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  e==OP_Transactio
1ff0: 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d 30 20  n && pOp->p2!=0 
2000: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64  ){.      p->read
2010: 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Only = 0;.#ifnde
2020: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2030: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
2040: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
2050: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2060: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2070: 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53  e ){.      doesS
2080: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
2090: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
20a0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
20b0: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
20c0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73  int n;.      ass
20d0: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20  ert( p->nOp - i 
20e0: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73  >= 3 );.      as
20f0: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
2100: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
2110: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f   );.      n = pO
2120: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
2130: 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29  if( n>nMaxArgs )
2140: 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23   nMaxArgs = n;.#
2150: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2160: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
2170: 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74  OpcodeHasPropert
2180: 79 28 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f  y(opcode, OPFLG_
2190: 4a 55 4d 50 29 20 26 26 20 70 4f 70 2d 3e 70 32  JUMP) && pOp->p2
21a0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
21b0: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
21c0: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
21d0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
21e0: 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a  el[-1-pOp->p2];.
21f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2200: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
2210: 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70   p->aLabel);.  p
2220: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20  ->aLabel = 0;.. 
2230: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
2240: 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f 2a   nMaxArgs;..  /*
2250: 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c   If we never rol
2260: 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
2270: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
2280: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  hen statement.  
2290: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
22a0: 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20  are not needed. 
22b0: 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79   So change every
22c0: 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20   OP_Statement.  
22d0: 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61  ** opcode into a
22e0: 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73  n OP_Noop.  This
22f0: 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f   avoid a call to
2300: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
2310: 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77  clusive().  ** w
2320: 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65  hich can be expe
2330: 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c  nsive on some pl
2340: 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20  atforms..  */.  
2350: 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74  if( hasStatement
2360: 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74  Begin && !doesSt
2370: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
2380: 29 7b 0a 20 20 20 20 70 2d 3e 75 73 65 73 53 74  ){.    p->usesSt
2390: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  mtJournal = 0;. 
23a0: 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f     for(pOp=p->aO
23b0: 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69  p, i=p->nOp-1; i
23c0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29  >=0; i--, pOp++)
23d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
23e0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74  >opcode==OP_Stat
23f0: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ement ){.       
2400: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2410: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  P_Noop;.      }.
2420: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2430: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
2440: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
2450: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
2460: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
2470: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2480: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
2490: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
24a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
24b0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
24c0: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
24d0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
24e0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
24f0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
2500: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
2510: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64  eturn the.** add
2520: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73  ress of the firs
2530: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65  t operation adde
2540: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2550: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56  3VdbeAddOpList(V
2560: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c  dbe *p, int nOp,
2570: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
2580: 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61  t *aOp){.  int a
2590: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
25a0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
25b0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
25c0: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
25d0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20   p->nOpAlloc && 
25e0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
25f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2600: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
2610: 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30  nOp;.  if( nOp>0
2620: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2630: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
2640: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
2650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2660: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
2670: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
2680: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
2690: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
26a0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
26b0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
26c0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
26d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
26e0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
26f0: 20 69 66 28 20 70 32 3c 30 20 26 26 20 73 71 6c   if( p2<0 && sql
2700: 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61  ite3VdbeOpcodeHa
2710: 73 50 72 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e  sProperty(pOut->
2720: 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55  opcode, OPFLG_JU
2730: 4d 50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  MP) ){.        p
2740: 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b  Out->p2 = addr +
2750: 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20   ADDR(p2);.     
2760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2770: 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20  pOut->p2 = p2;. 
2780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
2790: 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b  t->p3 = pIn->p3;
27a0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  .      pOut->p4t
27b0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
27c0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
27d0: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  .p = 0;.      pO
27e0: 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64  ut->p5 = 0;.#ifd
27f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2800: 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d        pOut->zCom
2810: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ment = 0;.      
2820: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  if( sqlite3VdbeA
2830: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
2840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2850: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
2860: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
2870: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
2880: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
2890: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
28a0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
28b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
28c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
28d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
28e0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
28f0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
2900: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
2910: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
2920: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
2930: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
2940: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
2950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2960: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
2970: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
2980: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
2990: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
29a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
29b0: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
29c0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
29d0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
29e0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
29f0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2a00: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2a10: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2a20: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2a30: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2a40: 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a  addr].p1 = val;.
2a50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2a60: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2a70: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
2a80: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2a90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
2aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2ab0: 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e  seful for settin
2ac0: 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  g a jump destina
2ad0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
2ae0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2af0: 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  2(Vdbe *p, int a
2b00: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
2b10: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2b20: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2b30: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2b40: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2b50: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2b60: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2b70: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32   p->aOp[addr].p2
2b80: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2b90: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2ba0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20  value of the P3 
2bb0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
2bc0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
2bd0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2be0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
2bf0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2c00: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2c10: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2c20: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2c30: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2c40: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2c50: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
2c60: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
2c70: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d  ->aOp[addr].p3 =
2c80: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2c90: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2ca0: 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70  lue of the P5 op
2cb0: 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f  erand for the mo
2cc0: 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61  st recently.** a
2cd0: 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  dded operation..
2ce0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2cf0: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
2d00: 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20   *p, u8 val){.  
2d10: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2d20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2d30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2d40: 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29  f( p && p->aOp )
2d50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
2d60: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d  >nOp>0 );.    p-
2d70: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
2d80: 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  5 = val;.  }.}..
2d90: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2da0: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
2db0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
2dc0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2dd0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
2de0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
2df0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
2e00: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
2e10: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2e20: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
2e30: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
2e40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
2e50: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
2e60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
2e70: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
2e80: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
2e90: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
2ea0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
2eb0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
2ec0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
2ed0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
2ee0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
2ef0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
2f00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
2f10: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
2f20: 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65 66  f( pDef && (pDef
2f30: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2f40: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
2f50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
2f60: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
2f70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
2f80: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
2f90: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
2fa0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2fb0: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
2fc0: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
2fd0: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
2fe0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
2ff0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  4type ){.      c
3000: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
3010: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
3020: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3030: 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63  MPRINTF:.      c
3040: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
3050: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
3060: 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73  YINFO:.      cas
3070: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20  e P4_INTARRAY:. 
3080: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
3090: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a  INFO_HANDOFF: {.
30a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
30b0: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
30c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
30e0: 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a   P4_VDBEFUNC: {.
30f0: 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63          VdbeFunc
3100: 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56   *pVdbeFunc = (V
3110: 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20  dbeFunc *)p4;.  
3120: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
3130: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
3140: 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63  pVdbeFunc->pFunc
3150: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3160: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
3170: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
3180: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3190: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
31a0: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
31b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
31c0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
31d0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
31e0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
31f0: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
3200: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
3210: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3220: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
3230: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  EM: {.        sq
3240: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
3250: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
3260: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
3270: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3280: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
3290: 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20  hange N opcodes 
32a0: 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72  starting at addr
32b0: 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76   to No-ops..*/.v
32c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
32d0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
32e0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
32f0: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
3300: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
3310: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70  VdbeOp *pOp = &p
3320: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20  ->aOp[addr];.   
3330: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
3340: 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65 28  ->db;.    while(
3350: 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72   N-- ){.      fr
3360: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
3370: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
3380: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
3390: 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f  Op, 0, sizeof(pO
33a0: 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f  p[0]));.      pO
33b0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
33c0: 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b  oop;.      pOp++
33d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
33e0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
33f0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
3400: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3410: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3420: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3430: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
3440: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
3450: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
3460: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
3470: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
3480: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
3490: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
34a0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
34b0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
34c0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
34d0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
34e0: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
34f0: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
3500: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
3510: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
3520: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
3530: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3540: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
3550: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
3560: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
3570: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
3580: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
3590: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
35a0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
35b0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
35c0: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a  tes of zP4..**.*
35d0: 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  * If n==P4_KEYIN
35e0: 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  FO it means that
35f0: 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65   zP4 is a pointe
3600: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  r to a KeyInfo s
3610: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63  tructure..** A c
3620: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
3630: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
3640: 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ture into memory
3650: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3660: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
3670: 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68  , to be freed wh
3680: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66  en the Vdbe is f
3690: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d  inalized..** n==
36a0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
36b0: 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  FF indicates tha
36c0: 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  t zP4 points to 
36d0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
36e0: 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  ure.** stored in
36f0: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65   memory that the
3700: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
3710: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3720: 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a  3_malloc. The .*
3730: 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
3740: 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c  not free the all
3750: 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  ocation, it will
3760: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
3770: 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69  he Vdbe is.** fi
3780: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  nalized..** .** 
3790: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
37a0: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
37b0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
37c0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
37d0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
37e0: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
37f0: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
3800: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
3810: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
3820: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
3830: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
3840: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
3850: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
3860: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
3870: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
3880: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3890: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
38a0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
38b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
38c0: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
38d0: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
38e0: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
38f0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
3900: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
3910: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
3920: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
3930: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
3940: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3950: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30  .  if( p->aOp==0
3960: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
3970: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28  iled ){.    if (
3980: 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29  n != P4_KEYINFO)
3990: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28   {.      freeP4(
39a0: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
39b0: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
39c0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
39d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 64    }.  assert( ad
39e0: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
39f0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
3a00: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
3a10: 20 31 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72   1;.    if( addr
3a20: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  <0 ) return;.  }
3a30: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
3a40: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
3a50: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
3a60: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
3a70: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
3a80: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
3a90: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
3aa0: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
3ab0: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
3ac0: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
3ad0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
3ae0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
3af0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
3b00: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
3b10: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
3b20: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
3b30: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
3b40: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
3b50: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
3b60: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3b70: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
3b80: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3b90: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
3ba0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
3bb0: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
3bc0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
3bd0: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
3be0: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
3bf0: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
3c00: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
3c10: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
3c20: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
3c30: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
3c40: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
3c50: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
3c60: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nfo = sqlite3Mal
3c70: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
3c80: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
3c90: 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
3ca0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
3cb0: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f  ){.      u8 *aSo
3cc0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d  rtOrder;.      m
3cd0: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20  emcpy(pKeyInfo, 
3ce0: 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  zP4, nByte);.   
3cf0: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
3d00: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3d10: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
3d20: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
3d30: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
3d40: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
3d50: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
3d60: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
3d70: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
3d80: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
3d90: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
3da0: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
3db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3dc0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3dd0: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
3de0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
3df0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
3e00: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
3e10: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3e20: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
3e30: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
3e40: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
3e50: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
3e60: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
3e70: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
3e80: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3e90: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3ea0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
3eb0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
3ec0: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
3ed0: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
3ee0: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
3ef0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
3f00: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
3f10: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
3f20: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
3f30: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
3f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3f50: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3f60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3f70: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3f80: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
3f90: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3fa0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
3fb0: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
3fc0: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
3fd0: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
3fe0: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
3ff0: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
4000: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
4010: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
4020: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
4030: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
4040: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
4050: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
4060: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4070: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
4080: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4090: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
40a0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
40b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
40c0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
40d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
40e0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
40f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
4100: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
4110: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
4120: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
4130: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
4140: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
4150: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
4160: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
4170: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
4180: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
4190: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
41a0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
41b0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
41c0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
41d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
41e0: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
41f0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
4200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
4210: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
4220: 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65  ist ap;.  sqlite
4230: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
4240: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72  P_Noop);.  asser
4250: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
4260: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
4270: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
4280: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
4290: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
42a0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
42b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
42c0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
42d0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
42e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
42f0: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
4300: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
4310: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4320: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
4330: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
4340: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
4350: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
4360: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
4370: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
4380: 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
4390: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f   Return the opco
43a0: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61  de for a given a
43b0: 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f  ddress..*/.VdbeO
43c0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
43d0: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
43e0: 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74   addr){.  assert
43f0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4400: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
4410: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
4420: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
4430: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
4440: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 65  ocFailed );.  re
4450: 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26  turn ((addr>=0 &
4460: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28  & addr<p->nOp)?(
4470: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30  &p->aOp[addr]):0
4480: 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  );.}..#if !defin
4490: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
44a0: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
44b0: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
44c0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
44d0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
44e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
44f0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
4500: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
4510: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
4520: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
4530: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
4540: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
4550: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
4560: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
4570: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
4580: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
4590: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
45a0: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
45b0: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
45c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
45d0: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
45e0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
45f0: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
4600: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
4610: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
4620: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
4630: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
4640: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
4650: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
4660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4670: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4680: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
4690: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
46a0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
46b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
46c0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
46d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
46e0: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
46f0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
4700: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
4710: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
4720: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
4730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
4740: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
4750: 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
4760: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
4770: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
4780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
4790: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
47a0: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
47b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
47d0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
47e0: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
47f0: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
4800: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
4810: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
4820: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
4830: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
4840: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
4850: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
4860: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
4870: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20  l->zName,n+1);. 
4880: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
4890: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
48a0: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
48b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
48c0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
48d0: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  il",4);.        
48e0: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
48f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4900: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
4910: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
4920: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
4930: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
4940: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4950: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4960: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
4970: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
4980: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
4990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
49a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
49b0: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
49c0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
49d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
49e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
49f0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
4a00: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
4a10: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
4a20: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
4a30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4a40: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
4a50: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
4a60: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
4a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a80: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
4a90: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
4aa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4ab0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
4ac0: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
4ad0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
4ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4af0: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
4b00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4b10: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4b20: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
4b30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4b50: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
4b60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4b70: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4b80: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
4b90: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
4ba0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4bb0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
4bc0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
4bd0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
4be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d       assert( (pM
4bf0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4c00: 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Null)==0 );.    
4c10: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
4c20: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
4c30: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
4c40: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
4c50: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
4c60: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
4c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
4c80: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4c90: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
4ca0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
4cb0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
4cc0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
4cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4ce0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4cf0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
4d00: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
4d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4d20: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
4d30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4d40: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
4d50: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
4d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
4d70: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
4d80: 34 2e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  4.pVtab;.      s
4d90: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4da0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76  nTemp, zTemp, "v
4db0: 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61  tab:%p:%p", pVta
4dc0: 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b, pVtab->pModul
4dd0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
4de0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4df0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
4e00: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
4e10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4e20: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
4e30: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
4e40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
4e50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
4e60: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
4e70: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
4e80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
4e90: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
4ea0: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
4eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4ec0: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  }.  assert( zP4!
4ed0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
4ee0: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  P4;.}.#endif../*
4ef0: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
4f00: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
4f10: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
4f20: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
4f30: 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20  sed..**.*/.void 
4f40: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
4f50: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
4f60: 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b  t i){.  int mask
4f70: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
4f80: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
4f90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
4fa0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
4fb0: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
4fc0: 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20   mask = 1<<i;.  
4fd0: 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  if( (p->btreeMas
4fe0: 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
4ff0: 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b      p->btreeMask
5000: 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71   |= mask;.    sq
5010: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
5020: 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61  rrayInsert(&p->a
5030: 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44  Mutex, p->db->aD
5040: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d  b[i].pBt);.  }.}
5050: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  ...#if defined(V
5060: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
5070: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5080: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
5090: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
50a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
50b0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
50c0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
50d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
50e0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
50f0: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
5100: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
5110: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
5120: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
5130: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5140: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
5150: 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20  4d %4d %4d %-4s 
5160: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
5170: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
5180: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
5190: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
51a0: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
51b0: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
51c0: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
51d0: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
51e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
51f0: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
5200: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
5210: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
5220: 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  >p5,.#ifdef SQLI
5230: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70  TE_DEBUG.      p
5240: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70  Op->zComment ? p
5250: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22  Op->zComment : "
5260: 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22  ".#else.      ""
5270: 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66  .#endif.  );.  f
5280: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
5290: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
52a0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
52b0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
52c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
52d0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
52e0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
52f0: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
5300: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20     Mem *pEnd;.  
5310: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5320: 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61  p->db;.    u8 ma
5330: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62  lloc_failed = db
5340: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
5350: 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b      for(pEnd=&p[
5360: 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  N]; p<pEnd; p++)
5370: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5380: 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c  (&p[1])==pEnd ||
5390: 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64   p[0].db==p[1].d
53a0: 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  b );..      /* T
53b0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
53c0: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
53d0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
53e0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
53f0: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
5400: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
5410: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
5420: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
5430: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
5440: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
5450: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
5460: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
5470: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
5480: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
5490: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
54a0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
54b0: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
54c0: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
54d0: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
54e0: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
54f0: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
5500: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
5510: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
5520: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
5530: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
5540: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
5550: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
5560: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
5570: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
5580: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
5590: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
55a0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
55b0: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
55c0: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
55d0: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
55e0: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
55f0: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
5600: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
5610: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
5620: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
5630: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
5640: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
5650: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
5660: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
5670: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
5680: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
5690: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
56a0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n) ){.        sq
56b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
56c0: 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65  ase(p);.      }e
56d0: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c  lse if( p->zMall
56e0: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  oc ){.        sq
56f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5700: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
5710: 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20       p->zMalloc 
5720: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
5730: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d      p->flags = M
5740: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20  EM_Null;.    }. 
5750: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
5760: 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69  led = malloc_fai
5770: 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  led;.  }.}..#ifd
5780: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5790: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
57a0: 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  NT.int sqlite3Vd
57b0: 62 65 52 65 6c 65 61 73 65 42 75 66 66 65 72 73  beReleaseBuffers
57c0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
57d0: 20 69 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65   ii;.  int nFree
57e0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
57f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5800: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
5810: 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20   );.  for(ii=1; 
5820: 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b  ii<=p->nMem; ii+
5830: 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65  +){.    Mem *pMe
5840: 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d  m = &p->aMem[ii]
5850: 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
5860: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
5870: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
5880: 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28 70  te3RowSetClear(p
5890: 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 29 3b  Mem->u.pRowSet);
58a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
58b0: 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d 2d 3e  Mem->z && pMem->
58c0: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b  flags&MEM_Dyn ){
58d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
58e0: 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a 20 20  pMem->xDel );.  
58f0: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 71 6c      nFree += sql
5900: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
5910: 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d  (pMem->db, pMem-
5920: 3e 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >z);.      sqlit
5930: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
5940: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
5950: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 46 72 65 65  }.  return nFree
5960: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
5970: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5980: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
5990: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
59a0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
59b0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
59c0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
59d0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
59e0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
59f0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
5a00: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
5a10: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
5a20: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
5a30: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
5a40: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
5a50: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
5a60: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
5a70: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
5a80: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
5a90: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
5aa0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
5ab0: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
5ac0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
5ad0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
5ae0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
5af0: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
5b00: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
5b10: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
5b20: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
5b30: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
5b40: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
5b50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
5b60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5b70: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
5b80: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
5b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
5ba0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
5bb0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
5bc0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
5bd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
5be0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52  em *pMem = p->pR
5bf0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
5c00: 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72  Mem[1];..  asser
5c10: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
5c20: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
5c30: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
5c40: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5c50: 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74  MISUSE;.  assert
5c60: 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c  ( db->magic==SQL
5c70: 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29  ITE_MAGIC_BUSY )
5c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
5c90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
5ca0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
5cb0: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
5cc0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
5cd0: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
5ce0: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
5cf0: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
5d00: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
5d10: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
5d20: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
5d30: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
5d40: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
5d50: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
5d60: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
5d70: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
5d80: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
5d90: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
5da0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5db0: 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  pMem, p->nMem);.
5dc0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
5dd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
5de0: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
5df0: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
5e00: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
5e10: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
5e20: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
5e30: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
5e40: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
5e50: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
5e60: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
5e70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5e80: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
5e90: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
5ea0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
5eb0: 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70  p->nOp && p->exp
5ec0: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
5ed0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
5ee0: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
5ef0: 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20   i>=p->nOp ){.  
5f00: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
5f10: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
5f20: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
5f30: 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  se if( db->u1.is
5f40: 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20  Interrupted ){. 
5f50: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
5f60: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
5f70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
5f80: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  OR;.    sqlite3S
5f90: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
5fa0: 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20  rMsg, db, "%s", 
5fb0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
5fc0: 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >rc));.  }else{.
5fd0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
5fe0: 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61   Op *pOp = &p->a
5ff0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[i];.    if( p
6000: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
6010: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
6020: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
6030: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
6040: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
6050: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
6060: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
6090: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
60a0: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
60b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
60c0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
60d0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
60e0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
60f0: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
6100: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
6110: 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  );  /* Opcode */
6120: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6130: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
6140: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
6150: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
6160: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
6170: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6180: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
6190: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
61a0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
61b0: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ++;.    }..    p
61c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
61d0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
61e0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
6210: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
6220: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
6230: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
6240: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
6250: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
6260: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
6270: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
6280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6290: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
62a0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
62b0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
62c0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
62d0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
62e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
62f0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
6300: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
6310: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6330: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
6340: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
6350: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
6360: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
6370: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
6380: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
6390: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
63a0: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
63b0: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
63c0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
63d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
63e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
63f0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
6400: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
6410: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d  EM_Term;.    z =
6420: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
6430: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
6440: 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a    if( z!=pMem->z
6450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6460: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
6470: 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Mem, z, -1, SQLI
6480: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
6490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
64a0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
64b0: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
64c0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
64d0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
64e0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
64f0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
6500: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70   }.    pMem->typ
6510: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
6520: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
6530: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
6540: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
6550: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
6560: 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20  row(pMem, 4, 0) 
6570: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62  ){.        p->db
6580: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
6590: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
65a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
65b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
65c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
65d0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
65e0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
65f0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
6600: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6610: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
6620: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
6630: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
6640: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
6650: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
6660: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
6670: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
6680: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
6690: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
66a0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f      if( pOp->zCo
66b0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  mment ){.       
66c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
66d0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
66e0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
66f0: 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   = pOp->zComment
6700: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
6710: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6720: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
6730: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
6740: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
6750: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
6760: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
6770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
6780: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
6790: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
67a0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
67d0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
67e0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
67f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6800: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
6810: 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65  mn = 8 - 5*(p->e
6820: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
6830: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
6840: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
6850: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
6860: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
6870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6880: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
6890: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
68a0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
68b0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
68c0: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
68d0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
68e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
68f0: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
6900: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
6910: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
6920: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
6930: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
6940: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
6950: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
6960: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
6970: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
6980: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6990: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
69a0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
69b0: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
69c0: 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ++;.    printf("
69d0: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
69e0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
69f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6a00: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
6a10: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
6a20: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
6a30: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
6a40: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
6a50: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
6a60: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
6a70: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
6a80: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
6a90: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
6aa0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
6ab0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
6ac0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
6ad0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
6ae0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
6af0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
6b00: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
6b10: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
6b20: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
6b30: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
6b40: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
6b50: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6b60: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
6b70: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
6b80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
6b90: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
6ba0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6bb0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6bc0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
6bd0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
6be0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
6bf0: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
6c00: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
6c10: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
6c20: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6c30: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
6c40: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
6c50: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
6c60: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
6c70: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
6c80: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
6c90: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
6ca0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
6cb0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
6cc0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
6cd0: 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20  cate space from 
6ce0: 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66  a fixed size buf
6cf0: 66 65 72 2e 20 20 4d 61 6b 65 20 2a 70 70 20 70  fer.  Make *pp p
6d00: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 61  oint to the.** a
6d10: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
6d20: 20 28 4e 6f 74 65 3a 20 20 70 70 20 69 73 20 61   (Note:  pp is a
6d30: 20 63 68 61 72 2a 20 72 61 74 68 65 72 20 74 68   char* rather th
6d40: 61 6e 20 61 20 76 6f 69 64 2a 2a 20 74 6f 0a 2a  an a void** to.*
6d50: 2a 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  * work around th
6d60: 65 20 70 6f 69 6e 74 65 72 20 61 6c 69 61 73 69  e pointer aliasi
6d70: 6e 67 20 72 75 6c 65 73 20 6f 66 20 43 2e 29 20  ng rules of C.) 
6d80: 20 2a 70 70 20 73 68 6f 75 6c 64 20 69 6e 69 74   *pp should init
6d90: 69 61 6c 6c 79 0a 2a 2a 20 62 65 20 7a 65 72 6f  ially.** be zero
6da0: 2e 20 20 49 66 20 2a 70 70 20 69 73 20 6e 6f 74  .  If *pp is not
6db0: 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e   zero, that mean
6dc0: 73 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65  s that the space
6dd0: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
6de0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
6df0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
6e00: 69 73 20 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a 2a  is a noop..**.**
6e10: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
6e20: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
6e30: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
6e40: 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69  *.** *ppFrom poi
6e50: 6e 74 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  nt to available 
6e60: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
6e70: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
6e80: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
6e90: 61 62 6c 65 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  able space..**.*
6ea0: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
6eb0: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
6ec0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
6ed0: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
6ee0: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
6ef0: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
6f00: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
6f10: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
6f20: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
6f30: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
6f40: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
6f50: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
6f60: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
6f70: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6f80: 64 20 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20  d allocSpace(.  
6f90: 63 68 61 72 20 2a 70 70 2c 20 20 20 20 20 20 20  char *pp,       
6fa0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
6fb0: 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  Set *pp to point
6fc0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   to allocated bu
6fd0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
6fe0: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
6ff0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7000: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
7010: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
7020: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
7030: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
7040: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
7050: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
7060: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7070: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
7080: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
7090: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
70a0: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
70b0: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
70c0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
70d0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
70e0: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  yte */.){.  if( 
70f0: 28 2a 28 76 6f 69 64 2a 2a 29 70 70 29 3d 3d 30  (*(void**)pp)==0
7100: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
7110: 28 6e 42 79 74 65 2b 37 29 26 7e 37 3b 0a 20 20  (nByte+7)&~7;.  
7120: 20 20 69 66 28 20 28 70 45 6e 64 20 2d 20 2a 70    if( (pEnd - *p
7130: 70 46 72 6f 6d 29 3e 3d 6e 42 79 74 65 20 29 7b  pFrom)>=nByte ){
7140: 0a 20 20 20 20 20 20 2a 28 76 6f 69 64 2a 2a 29  .      *(void**)
7150: 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 2a 70 70  pp = (void *)*pp
7160: 46 72 6f 6d 3b 0a 20 20 20 20 20 20 2a 70 70 46  From;.      *ppF
7170: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
7180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
7190: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b  pnByte += nByte;
71a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
71b0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
71c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
71d0: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
71e0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
71f0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
7200: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
7210: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
7220: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
7230: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
7240: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
7250: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
7260: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
7270: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
7280: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
7290: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
72a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
72b0: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
72c0: 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56  ve a VDBE from V
72d0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74  DBE_MAGIC_INIT t
72e0: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
72f0: 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  RUN..**.** This 
7300: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
7310: 63 61 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61 6e  called more than
7320: 20 6f 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67 6c   once on a singl
7330: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
7340: 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  e..** The first 
7350: 63 61 6c 6c 20 69 73 20 6d 61 64 65 20 77 68 69  call is made whi
7360: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
7370: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7380: 53 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 61  Subsequent.** ca
7390: 6c 6c 73 20 61 72 65 20 6d 61 64 65 20 61 73 20  lls are made as 
73a0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63  part of the proc
73b0: 65 73 73 20 6f 66 20 72 65 73 65 74 74 69 6e 67  ess of resetting
73c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20   a statement to 
73d0: 62 65 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74 65  be.** re-execute
73e0: 64 20 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20 74  d (from a call t
73f0: 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  o sqlite3_reset(
7400: 29 29 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e 4d  )). The nVar, nM
7410: 65 6d 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a 20  em, nCursor .** 
7420: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 70 61  and isExplain pa
7430: 72 61 6d 65 74 65 72 73 20 61 72 65 20 6f 6e 6c  rameters are onl
7440: 79 20 70 61 73 73 65 64 20 63 6f 72 72 65 63 74  y passed correct
7450: 20 76 61 6c 75 65 73 20 74 68 65 20 66 69 72 73   values the firs
7460: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66 75  t time.** the fu
7470: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
7480: 2e 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  . On subsequent 
7490: 63 61 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c 69  calls, from sqli
74a0: 74 65 33 5f 72 65 73 65 74 28 29 2c 20 6e 56 61  te3_reset(), nVa
74b0: 72 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 2d  r.** is passed -
74c0: 31 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75 72  1 and nMem, nCur
74d0: 73 6f 72 20 61 6e 64 20 69 73 45 78 70 6c 61 69  sor and isExplai
74e0: 6e 20 61 72 65 20 61 6c 6c 20 70 61 73 73 65 64  n are all passed
74f0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73   zero..*/.void s
7500: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
7510: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7530: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
7540: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c  E */.  int nVar,
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7570: 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68  of '?' see in th
7580: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7590: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20  */.  int nMem,  
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
75c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f   memory cells to
75d0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
75e0: 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20  nt nCursor,     
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7600: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
7610: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
7620: 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69  /.  int isExplai
7630: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
7640: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7650: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
7660: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ds is present */
7670: 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  .){.  int n;.  s
7680: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
7690: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
76a0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
76b0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
76c0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
76d0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
76e0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
76f0: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
7700: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
7710: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
7720: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
7730: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
7740: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
7750: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
7760: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
7770: 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  UN;..  /* For ea
7780: 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72  ch cursor requir
7790: 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74  ed, also allocat
77a0: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  e a memory cell.
77b0: 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c   Memory.  ** cel
77c0: 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73  ls (nMem+1-nCurs
77d0: 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75  or)..nMem, inclu
77e0: 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72  sive, will never
77f0: 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   be used by.  **
7800: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
7810: 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20  m. Instead they 
7820: 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f  are used to allo
7830: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20  cate space for. 
7840: 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42   ** VdbeCursor/B
7850: 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  tCursor structur
7860: 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20  es. The blob of 
7870: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
7880: 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72  d with .  ** cur
7890: 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20  sor 0 is stored 
78a0: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e  in memory cell n
78b0: 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c  Mem. Memory cell
78c0: 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73   (nMem-1).  ** s
78d0: 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f  tores the blob o
78e0: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
78f0: 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
7900: 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a  1, etc..  **.  *
7910: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f  * See also: allo
7920: 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20  cateCursor()..  
7930: 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75  */.  nMem += nCu
7940: 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rsor;..  /* Allo
7950: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
7960: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c  emory registers,
7970: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20   SQL variables, 
7980: 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64  VDBE cursors and
7990: 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20   .  ** an array 
79a0: 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66  to marshal SQL f
79b0: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
79c0: 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e  s in. This is on
79d0: 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a  ly done the.  **
79e0: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
79f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7a00: 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20  led for a given 
7a10: 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69  VDBE, not when i
7a20: 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20  t is.  ** being 
7a30: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69  called from sqli
7a40: 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20 72  te3_reset() to r
7a50: 65 73 65 74 20 74 68 65 20 76 69 72 74 75 61 6c  eset the virtual
7a60: 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20   machine..  */. 
7a70: 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26 20   if( nVar>=0 && 
7a80: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
7a90: 64 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 73  d ){.    u8 *zCs
7aa0: 72 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f  r = (u8 *)&p->aO
7ab0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 20 20 75  p[p->nOp];.    u
7ac0: 38 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29  8 *zEnd = (u8 *)
7ad0: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c  &p->aOp[p->nOpAl
7ae0: 6c 6f 63 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42  loc];.    int nB
7af0: 79 74 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  yte;.    int nAr
7b00: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
7b10: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
7b20: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
7b30: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
7b40: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
7b50: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
7b60: 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69      if( isExplai
7b70: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
7b80: 20 20 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b        nMem = 10;
7b90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b  .    }..    do {
7ba0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 43  .      memset(zC
7bb0: 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72  sr, 0, zEnd-zCsr
7bc0: 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d  );.      nByte =
7bd0: 20 30 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53   0;.      allocS
7be0: 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e  pace((char*)&p->
7bf0: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
7c00: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
7c10: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
7c20: 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28      allocSpace((
7c30: 63 68 61 72 2a 29 26 70 2d 3e 61 56 61 72 2c 20  char*)&p->aVar, 
7c40: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
7c50: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
7c60: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c  nByte);.      al
7c70: 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29  locSpace((char*)
7c80: 26 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a  &p->apArg, nArg*
7c90: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a  sizeof(Mem*), &z
7ca0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
7cb0: 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53  e);.      allocS
7cc0: 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e  pace((char*)&p->
7cd0: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
7ce0: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
7cf0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
7d00: 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63  .      allocSpac
7d10: 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 70 43  e((char*)&p->apC
7d20: 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sr, .           
7d30: 20 20 20 20 20 20 6e 43 75 72 73 6f 72 2a 73 69        nCursor*si
7d40: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
7d50: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
7d60: 26 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a  &nByte.      );.
7d70: 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 20        if( nByte 
7d80: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46  ){.        p->pF
7d90: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
7da0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
7db0: 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  te);.      }.   
7dc0: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
7dd0: 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20 3d  ee;.      zEnd =
7de0: 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20   &zCsr[nByte];. 
7df0: 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65     }while( nByte
7e00: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
7e10: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70 2d  ailed );..    p-
7e20: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
7e30: 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  or;.    if( p->a
7e40: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Var ){.      p->
7e50: 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20  nVar = nVar;.   
7e60: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
7e70: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
7e80: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
7e90: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
7ea0: 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e         p->aVar[n
7eb0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
7ec0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7ed0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
7ee0: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
7f10: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
7f20: 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  .      p->nMem =
7f30: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
7f40: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
7f50: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
7f60: 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  -1 */.      for(
7f70: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
7f80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
7f90: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
7fa0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
7fb0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
7fc0: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
7fd0: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
7fe0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
7ff0: 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b  (n=1; n<p->nMem;
8000: 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   n++){.    asser
8010: 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62  t( p->aMem[n].db
8020: 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ==db );.  }.#end
8030: 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  if..  p->pc = -1
8040: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
8050: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
8060: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
8070: 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e  rt;.  p->explain
8080: 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20   |= isExplain;. 
8090: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
80a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
80b0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
80c0: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
80d0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
80e0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
80f0: 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65    p->openedState
8100: 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  ment = 0;.#ifdef
8110: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
8120: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
8130: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8140: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
8150: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
8160: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  0;.      p->aOp[
8170: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
8180: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
8190: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
81a0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
81b0: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
81c0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
81d0: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
81e0: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
81f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
8200: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
8210: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
8220: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
8230: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
8240: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
8250: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
8260: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
8270: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
8280: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
8290: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
82a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
82b0: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
82c0: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
82d0: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
82e0: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
82f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
8300: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
8310: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
8320: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8340: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
8350: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
8360: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
8370: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
8380: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
8390: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
83a0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
83b0: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e  *pModule = pCx->
83c0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
83d0: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
83e0: 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
83f0: 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e  te3SafetyOff(p->
8400: 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  db);.    pModule
8410: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
8420: 72 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69 64  rsor);.    (void
8430: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e  )sqlite3SafetyOn
8440: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e  (p->db);.    p->
8450: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
8460: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
8470: 66 28 20 21 70 43 78 2d 3e 65 70 68 65 6d 50 73  f( !pCx->ephemPs
8480: 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20  eudoTable ){.   
8490: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
84a0: 2d 3e 64 62 2c 20 70 43 78 2d 3e 70 44 61 74 61  ->db, pCx->pData
84b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
84c0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
84d0: 73 20 65 78 63 65 70 74 20 66 6f 72 20 56 54 61  s except for VTa
84e0: 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  b cursors that a
84f0: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
8500: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
8510: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
8520: 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69  ursorsExceptActi
8530: 76 65 56 74 61 62 73 28 56 64 62 65 20 2a 70 29  veVtabs(Vdbe *p)
8540: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
8550: 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72   p->apCsr==0 ) r
8560: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
8570: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
8580: 69 2b 2b 29 7b 0a 20 20 20 20 56 64 62 65 43 75  i++){.    VdbeCu
8590: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
85a0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Csr[i];.    if( 
85b0: 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61  pC && (!p->inVta
85c0: 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e  bMethod || !pC->
85d0: 70 56 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a  pVtabCursor) ){.
85e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
85f0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
8600: 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  C);.      p->apC
8610: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  sr[i] = 0;.    }
8620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
8630: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
8640: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
8650: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8660: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
8670: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
8680: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
8690: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
86a0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
86b0: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
86c0: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
86d0: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
86e0: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
86f0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
8700: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
8710: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
8720: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8730: 20 70 2d 3e 64 62 3b 0a 20 20 4d 65 6d 20 2a 70   p->db;.  Mem *p
8740: 4d 65 6d 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  Mem;.  closeAllC
8750: 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69  ursorsExceptActi
8760: 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f  veVtabs(p);.  fo
8770: 72 28 70 4d 65 6d 3d 26 70 2d 3e 61 4d 65 6d 5b  r(pMem=&p->aMem[
8780: 31 5d 2c 20 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  1], i=1; i<=p->n
8790: 4d 65 6d 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  Mem; i++, pMem++
87a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  ){.    if( pMem-
87b0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
87c0: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Set ){.      sql
87d0: 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28  ite3RowSetClear(
87e0: 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 29  pMem->u.pRowSet)
87f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4d 65 6d 53  ;.    }.    MemS
8800: 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c  etTypeFlag(pMem,
8810: 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a   MEM_Null);.  }.
8820: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
8830: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
8840: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 69 66 28 20 70  ->nMem);.  if( p
8850: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 29  ->contextStack )
8860: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
8870: 72 65 65 28 64 62 2c 20 70 2d 3e 63 6f 6e 74 65  ree(db, p->conte
8880: 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20  xtStack);.  }.  
8890: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20  p->contextStack 
88a0: 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78  = 0;.  p->contex
88b0: 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b  tStackDepth = 0;
88c0: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
88d0: 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c  ckTop = 0;.  sql
88e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
88f0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
8900: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
8910: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
8920: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
8930: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
8940: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
8950: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
8960: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
8970: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
8980: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
8990: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
89a0: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
89b0: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
89c0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
89d0: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
89e0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
89f0: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
8a00: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
8a10: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
8a20: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
8a30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8a40: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
8a50: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
8a60: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
8a70: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
8a80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8a90: 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ->db;..  release
8aa0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
8ab0: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
8ac0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
8ad0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8ae0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
8af0: 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  ;.  n = nResColu
8b00: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
8b10: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
8b20: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
8b30: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
8b40: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
8b50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8b60: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
8b70: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
8b80: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
8b90: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
8ba0: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
8bb0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
8bc0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
8bd0: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
8be0: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
8bf0: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
8c00: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
8c10: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
8c20: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
8c30: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
8c40: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
8c50: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
8c60: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
8c70: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
8c80: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
8c90: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
8ca0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
8cb0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8cc0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
8cd0: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
8ce0: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
8cf0: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
8d00: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
8d10: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
8d20: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
8d30: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
8d40: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
8d50: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
8d60: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
8d70: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
8d80: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
8d90: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
8da0: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
8db0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8dc0: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
8df0: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
8e00: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
8e30: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
8e40: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
8e50: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
8e80: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
8e90: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
8ea0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
8eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8ec0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
8ed0: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
8ee0: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
8ef0: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
8f00: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
8f10: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
8f20: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
8f30: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
8f40: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
8f50: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
8f60: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
8f70: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
8f80: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
8f90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8fa0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8fb0: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
8fc0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
8fd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8fe0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
8ff0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
9000: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
9010: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
9020: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
9030: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
9040: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
9050: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
9060: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
9070: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
9080: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
9090: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
90a0: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
90b0: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
90c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
90d0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
90e0: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
90f0: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
9100: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
9110: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
9120: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
9130: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
9140: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
9150: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
9160: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
9170: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
9180: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
9190: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
91a0: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
91b0: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
91c0: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
91d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91e0: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
91f0: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
9200: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
9210: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
9220: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
9230: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
9240: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
9250: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
9260: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9270: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
9280: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f   = 0;..  /* Befo
9290: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
92a0: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
92b0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
92c0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
92d0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
92e0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
92f0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
9300: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
9310: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
9320: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
9330: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
9340: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
9350: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
9360: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
9370: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
9380: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
9390: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
93a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
93b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
93c0: 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e  tabSync(db, &p->
93d0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
93e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
93f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
9400: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
9410: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
9420: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
9430: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
9440: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
9450: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
9460: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
9470: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
9480: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
9490: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
94a0: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
94b0: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
94c0: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
94d0: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
94e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
94f0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
9500: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
9510: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
9520: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
9530: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
9540: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
9550: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
9560: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
9570: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
9580: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
9590: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
95a0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
95b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
95c0: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
95d0: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
95e0: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
95f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
9600: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
9610: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
9620: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
9630: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
9640: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
9650: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
9660: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 61 73  llback ){.    as
9670: 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73  sert( (db->flags
9680: 20 26 20 53 51 4c 49 54 45 5f 43 6f 6d 6d 69 74   & SQLITE_Commit
9690: 42 75 73 79 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Busy)==0 );.    
96a0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
96b0: 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 3b 0a  ITE_CommitBusy;.
96c0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
96d0: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
96e0: 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f      rc = db->xCo
96f0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d  mmitCallback(db-
9700: 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20  >pCommitArg);.  
9710: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
9720: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20  afetyOn(db);.   
9730: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
9740: 51 4c 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79  QLITE_CommitBusy
9750: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
9760: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9770: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
9780: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9790: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
97a0: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
97b0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
97c0: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
97d0: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
97e0: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
97f0: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
9800: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
9810: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
9820: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
9830: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
9840: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
9850: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
9860: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
9870: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
9880: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
9890: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
98a0: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
98b0: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
98c0: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
98d0: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
98e0: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
98f0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
9900: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
9910: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
9920: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
9930: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
9940: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
9950: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
9960: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
9970: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
9980: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
9990: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
99a0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
99b0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
99c0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
99d0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
99e0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
99f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
9a00: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
9a10: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
9a20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
9a30: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
9a40: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
9a50: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
9a60: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
9a70: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
9a80: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
9a90: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
9aa0: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
9ab0: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
9ac0: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
9ad0: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
9ae0: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
9af0: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
9b00: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
9b10: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
9b20: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
9b30: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
9b40: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
9b50: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
9b60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
9b70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
9b80: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
9b90: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
9ba0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
9bb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
9bc0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
9bd0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
9be0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
9bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c00: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9c10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
9c20: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
9c30: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
9c40: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
9c50: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
9c60: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
9c70: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
9c80: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
9c90: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
9ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9cb0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
9cc0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
9cd0: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
9ce0: 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  micly..  */.#ifn
9cf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9d00: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
9d10: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
9d20: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
9d30: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
9d40: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
9d50: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
9d60: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
9d70: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9d80: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
9d90: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
9da0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
9db0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
9dc0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
9dd0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
9de0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
9df0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
9e00: 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20     int res;..   
9e10: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
9e20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9e30: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20   name */.    do 
9e40: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
9e50: 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dom;.      sqlit
9e60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
9e70: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
9e80: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
9e90: 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
9ea0: 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
9eb0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
9ec0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9ed0: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
9ee0: 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30  nFile, iRandom&0
9ef0: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  x7fffffff);.    
9f00: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
9f10: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
9f20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
9f40: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
9f50: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
9f60: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
9f70: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
9f80: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
9fa0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9fb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9fc0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
9fd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
9fe0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9ff0: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
a000: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
a010: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
a020: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
a030: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
a040: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
a050: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
a060: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
a070: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
a080: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
a090: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
a0a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a0b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a0c0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
a0d0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
a0e0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
a0f0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
a100: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
a110: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
a120: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
a130: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
a140: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a150: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
a160: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
a170: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
a180: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
a190: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a1a0: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
a1b0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
a1c0: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
a1d0: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
a1e0: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
a1f0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
a200: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
a210: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
a220: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
a230: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
a240: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
a250: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
a260: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
a270: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
a280: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
a290: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
a2a0: 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65  nue;   /* Ignore
a2b0: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
a2c0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  se */.      if( 
a2d0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
a2e0: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
a2f0: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
a300: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
a310: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
a320: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
a330: 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
a340: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
a350: 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72  /* Ignore :memor
a360: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
a370: 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
a380: 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
a390: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
a3a0: 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
a3b0: 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
a3c0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a3d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a3e0: 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
a3f0: 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
a400: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
a410: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
a420: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
a430: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
a440: 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
a450: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a460: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
a470: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
a480: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
a490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
a4a0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
a4b0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
a4c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a4d0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
a4e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a4f0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
a500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a510: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
a520: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a530: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
a540: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
a550: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
a560: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
a570: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
a580: 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
a590: 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
a5a0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
a5b0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
a5c0: 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
a5d0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
a5e0: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
a5f0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
a600: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
a610: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
a620: 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
a630: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a640: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
a650: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
a660: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
a670: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
a680: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a690: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
a6a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
a6b0: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
a6c0: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
a6d0: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
a6e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
a6f0: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
a700: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
a710: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
a720: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
a730: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
a740: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
a750: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
a760: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
a770: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a780: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
a790: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
a7a0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
a7b0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
a7c0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
a7d0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
a7e0: 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
a7f0: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
a800: 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
a810: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
a820: 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
a830: 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
a840: 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
a850: 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
a860: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a870: 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
a880: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
a890: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
a8a0: 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
a8b0: 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
a8c0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
a8d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
a8e0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a8f0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
a900: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
a910: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
a920: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
a930: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
a940: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
a950: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
a960: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a970: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
a980: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
a990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a9a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
a9b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
a9c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
a9d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
a9e0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
a9f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
aa00: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
aa10: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
aa20: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
aa30: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
aa40: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
aa50: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
aa60: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
aa70: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
aa80: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
aa90: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
aaa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
aab0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
aac0: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
aad0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
aae0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
aaf0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
ab00: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
ab10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
ab20: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
ab30: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
ab40: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
ab50: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
ab60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
ab70: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
ab80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
ab90: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
aba0: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
abb0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
abc0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
abd0: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
abe0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
abf0: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
ac00: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
ac10: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
ac20: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
ac30: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
ac40: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
ac50: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
ac60: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
ac70: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
ac80: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
ac90: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
aca0: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
acb0: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
acc0: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
acd0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
ace0: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
acf0: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
ad00: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
ad10: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
ad20: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
ad30: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
ad40: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
ad50: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
ad60: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
ad70: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
ad80: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
ad90: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
ada0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
adb0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
adc0: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
add0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
ade0: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
adf0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
ae00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
ae10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
ae20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ae30: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
ae40: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
ae50: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
ae60: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
ae70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
ae80: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
ae90: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
aea0: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
aeb0: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
aec0: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
aed0: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
aee0: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
aef0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
af00: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
af10: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
af20: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
af30: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
af40: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
af50: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
af60: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
af70: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
af80: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
af90: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
afa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
afb0: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
afc0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
afd0: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d  Write = 0;.  p =
afe0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
aff0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
b000: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
b010: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
b020: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
b030: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
b040: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
b050: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
b060: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
b070: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
b080: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
b090: 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73  eVdbeCnt );.  as
b0a0: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
b0b0: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
b0c0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
b0d0: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
b0e0: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
b0f0: 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  /*.** For every 
b100: 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61  Btree that in da
b110: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b120: 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68  n db which .** h
b130: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
b140: 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61  , "trip" or inva
b150: 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73  lidate each curs
b160: 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74  or in.** that Bt
b170: 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  ree might have b
b180: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
b190: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
b1a0: 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  ** can never be 
b1b0: 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69  used again.  Thi
b1c0: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
b1d0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63   rollback.*** oc
b1e0: 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74  curs.  We have t
b1f0: 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f  o trip all the o
b200: 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76  ther cursors, ev
b210: 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f  en.** cursor fro
b220: 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64  m other VMs in d
b230: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
b240: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a  e connections,.*
b250: 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f  * so that none o
b260: 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73  f them try to us
b270: 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68  e the data at wh
b280: 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65  ich they.** were
b290: 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68   pointing and wh
b2a0: 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65  ich now may have
b2b0: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75   been changed du
b2c0: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c  e.** to the roll
b2d0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65  back..**.** Reme
b2e0: 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c  mber that a roll
b2f0: 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20  back can delete 
b300: 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20  tables complete 
b310: 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72  and.** reorder r
b320: 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74  ootpages.  So it
b330: 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
b340: 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a  nt just to save.
b350: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ** the state of 
b360: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20  the cursor.  We 
b370: 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61  have to invalida
b380: 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  te the cursor.**
b390: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
b3a0: 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e  ever used again.
b3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b3c0: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
b3d0: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
b3e0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
b3f0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
b400: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
b410: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
b420: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
b430: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26  Bt;.    if( p &&
b440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
b450: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
b460: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
b470: 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
b480: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a   SQLITE_ABORT);.
b490: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b4a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b4b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
b4c0: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
b4d0: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
b4e0: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
b4f0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
b500: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
b510: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
b520: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
b530: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
b540: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
b550: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
b560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
b570: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
b580: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
b590: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
b5a0: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
b5b0: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
b5c0: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
b5d0: 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
b5e0: 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
b5f0: 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
b600: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
b610: 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
b620: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
b630: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
b640: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
b650: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
b660: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
b670: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
b680: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
b690: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
b6a0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
b6b0: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
b6c0: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
b6d0: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
b6e0: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
b6f0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
b700: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  lt(Vdbe *p){.  s
b710: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
b720: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
b730: 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65  nt (*xFunc)(Btre
b740: 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a  e *pBt) = 0;  /*
b750: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
b760: 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20  l on each btree 
b770: 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  backend */.  int
b780: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
b790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b7a0: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53 51  et to true if SQ
b7b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f  LITE_NOMEM or IO
b7c0: 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ERR */..  /* Thi
b7d0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
b7e0: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
b7f0: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
b800: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
b810: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
b820: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
b830: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
b840: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
b850: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
b860: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
b870: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
b880: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
b890: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b8a0: 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
b8b0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
b8c0: 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
b8d0: 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
b8e0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
b8f0: 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
b900: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
b910: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
b920: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
b930: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
b940: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
b950: 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
b960: 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
b970: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
b980: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
b990: 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
b9a0: 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
b9b0: 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
b9c0: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
b9d0: 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
b9e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
b9f0: 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
ba00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ba10: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
ba20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
ba30: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
ba40: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
ba50: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
ba60: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
ba70: 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
ba80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ba90: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
baa0: 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
bab0: 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
bac0: 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
bad0: 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
bae0: 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  r started */.  i
baf0: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
bb00: 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
bb10: 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
bb20: 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
bb30: 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
bb40: 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
bb50: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
bb60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
bb70: 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  reeMutexArrayEnt
bb80: 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  er(&p->aMutex);.
bb90: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
bba0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
bbb0: 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
bbc0: 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
bbd0: 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
bbe0: 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
bbf0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
bc00: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
bc10: 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
bc20: 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
bc30: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
bc40: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
bc50: 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
bc60: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
bc70: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
bc80: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
bc90: 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20  nly, we need do 
bca0: 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61  no rollback at a
bcb0: 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ll. Otherwise,. 
bcc0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20       ** proceed 
bcd0: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
bce0: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
bcf0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
bd00: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
bd10: 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
bd20: 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
bd30: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
bd40: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26  _IOERR_BLOCKED &
bd50: 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
bd60: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
bd70: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
bd80: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
bd90: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  mt;.          p-
bda0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53  >rc = SQLITE_BUS
bdb0: 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
bdc0: 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
bdd0: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
bde0: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20 20  SQLITE_FULL).   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
be10: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
be20: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
be30: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
be40: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  tmt;.        }el
be50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
be60: 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
be70: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
be80: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
be90: 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
bea0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
beb0: 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
bec0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
bed0: 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
bee0: 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
bef0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
bf00: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
bf10: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
bf20: 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
bf30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
bf40: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
bf50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bf60: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
bf70: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
bf80: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
bf90: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
bfa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
bfb0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
bfc0: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
bfd0: 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
bfe0: 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
bff0: 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a  vdbe, then.    *
c000: 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  * we do either a
c010: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
c020: 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
c030: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
c040: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
c050: 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
c060: 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
c070: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
c080: 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
c090: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
c0a0: 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
c0b0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
c0c0: 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
c0d0: 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
c0e0: 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
c0f0: 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  && db->writeVdbe
c100: 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  Cnt==(p->readOnl
c110: 79 3d 3d 30 29 20 0a 20 20 20 20 20 26 26 20 28  y==0) .     && (
c120: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
c130: 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 29 3d 3d  TE_CommitBusy)==
c140: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
c150: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
c160: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
c170: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
c180: 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
c190: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  or) ){.        /
c1a0: 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
c1b0: 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
c1c0: 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72 6f  and the vdbe pro
c1d0: 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20  gram was .      
c1e0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
c1f0: 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
c200: 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  IL' constraint. 
c210: 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
c220: 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mit .        ** 
c230: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
c240: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c250: 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d  int rc = vdbeCom
c260: 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
c270: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c280: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
c290: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
c2a0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
c2b0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
c2c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c2d0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
c2e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
c2f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c300: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
c310: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
c320: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
c330: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
c340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c350: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
c360: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
c370: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c390: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
c3a0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
c3b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
c3c0: 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  xFunc ){.      i
c3d0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
c3e0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
c3f0: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
c400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
c410: 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
c420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
c430: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
c440: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20  eeCommitStmt;.  
c450: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
c460: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
c470: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
c480: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75  t ){.        xFu
c490: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
c4a0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
c4b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c4c0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
c4d0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
c4e0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
c4f0: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
c500: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
c510: 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
c520: 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
c530: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
c540: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
c550: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
c560: 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e  /* If xFunc is n
c570: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
c580: 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74   is one of sqlit
c590: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
c5a0: 74 6d 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  tmt or.    ** sq
c5b0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
c5c0: 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e  Stmt. Call it on
c5d0: 63 65 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65  ce on each backe
c5e0: 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  nd. If an error 
c5f0: 6f 63 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e  occurs.    ** an
c600: 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  d the return cod
c610: 65 20 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54  e is still SQLIT
c620: 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65  E_OK, set the re
c630: 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65  turn code to the
c640: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f   new.    ** erro
c650: 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a  r value..    */.
c660: 20 20 20 20 61 73 73 65 72 74 28 21 78 46 75 6e      assert(!xFun
c670: 63 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63  c ||.      xFunc
c680: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
c690: 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20  mmitStmt ||.    
c6a0: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
c6b0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
c6c0: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72  t.    );.    for
c6d0: 28 69 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69  (i=0; xFunc && i
c6e0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
c6f0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
c700: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
c710: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
c720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
c730: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c740: 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20  xFunc(pBt);.    
c750: 20 20 20 20 69 66 28 20 72 63 20 26 26 20 28 70      if( rc && (p
c760: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c770: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
c780: 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a  _CONSTRAINT) ){.
c790: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
c7a0: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
c7b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c7c0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
c7d0: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
c7e0: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
c7f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c800: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
c810: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
c820: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
c830: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
c840: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
c850: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
c860: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
c870: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
c880: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
c890: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
c8a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
c8b0: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
c8c0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
c8d0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
c8e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
c8f0: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
c900: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
c910: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
c920: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
c930: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
c940: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
c950: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
c960: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
c970: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
c980: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
c990: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
c9a0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
c9b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
c9c0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
c9d0: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
c9e0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
c9f0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
ca00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
ca10: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
ca20: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
ca30: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
ca40: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
ca50: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
ca60: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
ca70: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
ca80: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
ca90: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
caa0: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
cab0: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
cac0: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
cad0: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
cae0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
caf0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
cb00: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  nt--;.    if( !p
cb10: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
cb20: 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62      db->writeVdb
cb30: 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  eCnt--;.    }.  
cb40: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
cb50: 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d  tiveVdbeCnt>=db-
cb60: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
cb70: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
cb80: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
cb90: 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
cba0: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
cbb0: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
cbc0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
cbd0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
cbe0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
cbf0: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
cc00: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
cc10: 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
cc20: 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
cc30: 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
cc40: 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
cc50: 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
cc60: 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
cc70: 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
cc80: 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
cc90: 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
cca0: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
ccb0: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
ccc0: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
ccd0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
cce0: 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
ccf0: 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
cd00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd10: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
cd20: 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
cd30: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
cd40: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
cd50: 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
cd60: 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
cd70: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
cd80: 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
cd90: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
cda0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
cdb0: 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
cdc0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
cdd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
cde0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
cdf0: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
ce00: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
ce10: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
ce20: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
ce30: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
ce40: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
ce50: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
ce60: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
ce70: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
ce80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
ce90: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
cea0: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
ceb0: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
cec0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
ced0: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
cee0: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
cef0: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
cf00: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
cf10: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
cf20: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
cf30: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
cf40: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
cf50: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
cf60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
cf70: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
cf80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
cf90: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
cfa0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
cfb0: 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
cfc0: 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
cfd0: 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
cfe0: 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
cff0: 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
d000: 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
d010: 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
d020: 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
d030: 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
d040: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
d050: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d060: 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64  Halt(p);.  (void
d070: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
d080: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
d090: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
d0a0: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
d0b0: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
d0c0: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
d0d0: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
d0e0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
d0f0: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
d100: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
d110: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
d120: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
d130: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
d140: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
d150: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
d160: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
d170: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
d180: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
d190: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
d1a0: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
d1b0: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
d1c0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
d1d0: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
d1e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
d1f0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
d200: 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
d210: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
d220: 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72  >pErr,-1,p->zErr
d230: 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  Msg,SQLITE_UTF8,
d240: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d250: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d260: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
d270: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
d280: 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
d290: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d2a0: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
d2b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  );.      p->zErr
d2c0: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
d2d0: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
d2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
d2f0: 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
d300: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d310: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
d320: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
d330: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
d340: 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
d350: 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
d360: 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
d370: 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
d380: 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
d390: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
d3a0: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
d3b0: 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
d3c0: 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
d3d0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
d3e0: 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
d3f0: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
d400: 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
d410: 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
d420: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
d430: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
d440: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
d450: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
d460: 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
d470: 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
d480: 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
d490: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
d4a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d4b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
d4c0: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
d4d0: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
d4e0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
d4f0: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
d500: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
d510: 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
d520: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
d530: 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
d540: 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
d550: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
d560: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
d570: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
d580: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
d590: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
d5a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
d5b0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
d5c0: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
d5d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
d5e0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
d5f0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
d600: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
d610: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
d620: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
d630: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
d640: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d650: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
d660: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
d670: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
d680: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
d690: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
d6a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
d6b0: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
d6c0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
d6d0: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
d6e0: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
d6f0: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
d700: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
d710: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
d720: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
d730: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
d740: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
d750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
d760: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
d770: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
d780: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
d790: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
d7a0: 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
d7b0: 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
d7c0: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
d7d0: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
d7e0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
d7f0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
d800: 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
d810: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
d820: 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
d830: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d840: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
d850: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
d860: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
d870: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
d880: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
d890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
d8a0: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
d8b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
d8c0: 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
d8d0: 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
d8e0: 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
d8f0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
d900: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
d910: 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
d920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d930: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
d940: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
d950: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d960: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ../*.** Call the
d970: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
d980: 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74  each auxdata ent
d990: 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20  ry in pVdbeFunc 
d9a0: 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65  for which.** the
d9b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
d9c0: 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c  it in mask is cl
d9d0: 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e  ear.  Auxdata en
d9e0: 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a  tries beyond 31.
d9f0: 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65  ** are always de
da00: 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73  stroyed.  To des
da10: 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61  troy all auxdata
da20: 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74   entries, call t
da30: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  his.** routine w
da40: 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a  ith mask==0..*/.
da50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
da60: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
da70: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
da80: 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  c, int mask){.  
da90: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
daa0: 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e  ; i<pVdbeFunc->n
dab0: 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Aux; i++){.    s
dac0: 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70  truct AuxData *p
dad0: 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63  Aux = &pVdbeFunc
dae0: 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20  ->apAux[i];.    
daf0: 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d  if( (i>31 || !(m
db00: 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20  ask&(1<<i))) && 
db10: 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20  pAux->pAux ){.  
db20: 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
db30: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
db40: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
db50: 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
db60: 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e    }.      pAux->
db70: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
db80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
db90: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
dba0: 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
dbb0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
dbc0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
dbd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
dbe0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
dbf0: 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
dc00: 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  db;.  if( p->pPr
dc10: 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
dc20: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
dc30: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
dc40: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
dc50: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
dc60: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
dc70: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
dc80: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
dc90: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
dca0: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
dcb0: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
dcc0: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e     Op *pOp = p->
dcd0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
dce0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c  ; i<p->nOp; i++,
dcf0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
dd00: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
dd10: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
dd20: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
dd30: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
dd40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
dd50: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
dd60: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
dd70: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
dd80: 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
dd90: 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69  p->nVar);.  sqli
dda0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ddb0: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 72 65 6c 65  >aLabel);.  rele
ddc0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
ddd0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
dde0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
ddf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
de00: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
de10: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
de20: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
de30: 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  );.  p->magic = 
de40: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
de50: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
de60: 28 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a 20 20  (db, p->aOp);.  
de70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
de80: 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73  , p->pFree);.  s
de90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
dea0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   p);.}../*.** If
deb0: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
dec0: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
ded0: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
dee0: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
def0: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
df00: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
df10: 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f   code.  If no Mo
df20: 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c  veTo is pending,
df30: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
df40: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e   does nothing an
df50: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
df60: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
df70: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
df80: 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
df90: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
dfa0: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
dfb0: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
dfc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
dfd0: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
dfe0: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
dff0: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
e000: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
e010: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
e020: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
e030: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
e040: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
e050: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
e060: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
e070: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
e080: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
e090: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
e0a0: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
e0b0: 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
e0c0: 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a   = res==0 ?1:0;.
e0d0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
e0e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e0f0: 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e  te3BtreeNext(p->
e100: 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
e110: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
e120: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e130: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
e140: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
e150: 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
e160: 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66  endif.    p->def
e170: 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
e180: 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61  .    p->cacheSta
e190: 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
e1a0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
e1b0: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
e1c0: 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20   int hasMoved;. 
e1d0: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
e1e0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
e1f0: 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
e200: 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20  r, &hasMoved);. 
e210: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
e220: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68  rn rc;.    if( h
e230: 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20  asMoved ){.     
e240: 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
e250: 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
e260: 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20       p->nullRow 
e270: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
e280: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e290: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
e2a0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
e2b0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
e2c0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
e2d0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
e2e0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
e2f0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
e300: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
e310: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
e320: 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
e330: 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
e340: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
e350: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
e360: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
e370: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
e380: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
e390: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
e3a0: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
e3b0: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
e3c0: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
e3d0: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
e3e0: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
e3f0: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
e400: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
e410: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
e420: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
e430: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
e440: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
e450: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
e460: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
e470: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
e480: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
e490: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
e4a0: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
e4b0: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
e4c0: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
e4d0: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
e4e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
e4f0: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
e500: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
e510: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
e520: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
e530: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
e540: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
e550: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
e560: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
e570: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
e580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
e590: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
e5a0: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
e5b0: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
e5c0: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
e5d0: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
e5e0: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
e5f0: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
e600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
e610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
e620: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
e630: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e650: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
e660: 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
e680: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
e690: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
e6a0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
e6b0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
e6c0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
e6d0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
e700: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
e710: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
e730: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
e740: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
e750: 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
e760: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
e770: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
e780: 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
e7b0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
e7c0: 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
e7d0: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
e7e0: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
e7f0: 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
e820: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
e830: 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e850: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
e860: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
e870: 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
e8a0: 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
e8b0: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
e8c0: 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
e8d0: 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
e8e0: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
e8f0: 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
e900: 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
e910: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
e920: 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
e930: 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
e940: 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
e950: 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
e960: 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
e970: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
e980: 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
e990: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
e9a0: 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
e9b0: 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
e9c0: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
e9d0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
e9e0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
e9f0: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
ea00: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
ea10: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
ea20: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
ea30: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
ea40: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
ea50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
ea60: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
ea70: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
ea80: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
ea90: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
eaa0: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
eab0: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
eac0: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
ead0: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
eae0: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
eaf0: 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
eb00: 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d     if( file_form
eb10: 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d  at>=4 && (i&1)==
eb20: 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  i ){.      retur
eb30: 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20  n 8+(u32)i;.    
eb40: 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20  }.    u = i<0 ? 
eb50: 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20  -i : i;.    if( 
eb60: 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
eb70: 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
eb80: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
eb90: 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
eba0: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
ebb0: 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
ebc0: 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
ebd0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
ebe0: 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
ebf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
ec00: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
ec10: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
ec20: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
ec30: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
ec40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
ec50: 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
ec60: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
ec70: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
ec80: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
ec90: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
eca0: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
ecb0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
ecc0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
ecd0: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
ece0: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
ecf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
ed00: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
ed10: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
ed20: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
ed30: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
ed40: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
ed50: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
ed60: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
ed70: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
ed80: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
ed90: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
eda0: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
edb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
edc0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
edd0: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
ede0: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
edf0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
ee00: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
ee10: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
ee20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
ee30: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
ee40: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
ee50: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
ee60: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
ee70: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
ee80: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
ee90: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
eea0: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
eeb0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
eec0: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
eed0: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
eee0: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
eef0: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
ef00: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
ef10: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
ef20: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
ef30: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
ef40: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
ef50: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
ef60: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
ef70: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
ef80: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
ef90: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
efa0: 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
efb0: 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
efc0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
efd0: 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
efe0: 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
eff0: 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
f000: 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
f010: 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
f020: 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
f030: 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
f040: 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
f050: 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
f060: 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
f070: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
f080: 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
f090: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
f0a0: 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
f0b0: 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
f0c0: 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
f0d0: 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
f0e0: 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
f0f0: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
f100: 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
f110: 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
f120: 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
f130: 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
f140: 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
f150: 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
f160: 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
f170: 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
f180: 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
f190: 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
f1a0: 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
f1b0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
f1c0: 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
f1d0: 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
f1e0: 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
f1f0: 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
f200: 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
f210: 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
f220: 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
f230: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
f240: 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
f250: 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
f260: 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
f270: 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
f280: 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
f290: 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
f2a0: 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
f2b0: 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
f2c0: 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
f2d0: 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
f2e0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
f2f0: 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
f300: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
f310: 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
f320: 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
f330: 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
f340: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
f350: 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
f360: 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
f370: 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
f380: 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
f390: 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
f3a0: 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
f3b0: 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
f3c0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
f3d0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
f3e0: 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
f3f0: 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
f400: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
f410: 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
f420: 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
f430: 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
f440: 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
f450: 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
f460: 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
f470: 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
f480: 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
f490: 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
f4a0: 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
f4b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
f4c0: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
f4d0: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
f4e0: 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
f4f0: 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
f500: 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
f510: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
f520: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
f530: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
f540: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
f550: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
f560: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
f570: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
f580: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
f590: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
f5a0: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
f5b0: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
f5c0: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
f5d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
f5e0: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
f5f0: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
f600: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
f610: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
f620: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
f630: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
f640: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
f650: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
f660: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
f670: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
f680: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
f690: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
f6a0: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
f6b0: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
f6c0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
f6d0: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
f6e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
f6f0: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
f700: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
f710: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
f720: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
f730: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
f740: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
f750: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
f760: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
f770: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
f780: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
f790: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
f7a0: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
f7b0: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
f7c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
f7d0: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
f7e0: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
f7f0: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
f800: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
f810: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
f820: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
f830: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
f840: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
f850: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
f860: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
f870: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
f880: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
f890: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
f8a0: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
f8b0: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
f8c0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
f8d0: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
f8e0: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
f8f0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
f900: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
f910: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
f920: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
f930: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
f940: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
f950: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
f960: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
f970: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
f980: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
f990: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
f9a0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
f9b0: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
f9c0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
f9d0: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
f9e0: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
f9f0: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
fa00: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
fa10: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
fa20: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
fa30: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
fa40: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
fa50: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
fa60: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
fa70: 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
fa80: 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
fa90: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
faa0: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
fab0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fac0: 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
fad0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
fae0: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
faf0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
fb00: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
fb10: 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75  assert( len<=nBu
fb20: 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
fb30: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
fb40: 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  [i] = (u8)(v&0xF
fb50: 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
fb60: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
fb70: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
fb80: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
fb90: 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
fba0: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
fbb0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
fbc0: 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
fbd0: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
fbe0: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73              == s
fc00: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
fc10: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
fc20: 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
fc30: 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
fc40: 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
fc50: 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
fc60: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
fc70: 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
fc80: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
fc90: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
fca0: 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  en += pMem->u.nZ
fcb0: 65 72 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  ero;.      if( l
fcc0: 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  en>nBuf ){.     
fcd0: 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20     len = nBuf;. 
fce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
fcf0: 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e  set(&buf[pMem->n
fd00: 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e  ], 0, len-pMem->
fd10: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  n);.    }.    re
fd20: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
fd30: 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
fd40: 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
fd50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
fd60: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
fd70: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
fd80: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
fd90: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
fda0: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
fdb0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
fdc0: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
fdd0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
fde0: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
fdf0: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
fe00: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
fe10: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
fe20: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
fe30: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
fe40: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
fe50: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe70: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
fe80: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
fe90: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
feb0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
fec0: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
fed0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
fee0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
fef0: 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
ff00: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
ff10: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
ff20: 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
ff30: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
ff40: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
ff50: 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
ff60: 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
ff70: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
ff80: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
ff90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
ffa0: 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
ffb0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
ffc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
ffd0: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
ffe0: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
fff0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
10000 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
10010 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
10020 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
10030 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
10040 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
10050 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
10060 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
10070 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
10080 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
10090 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
100a0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
100b0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
100c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
100d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
100e0 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
100f0 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
10100 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<16) | (buf[1]<
10110 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20  <8) | buf[2];.  
10120 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
10130 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
10140 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
10150 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
10160 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
10170 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
10180 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75   pMem->u.i = (bu
10190 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
101a0 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
101b0 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
101c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
101d0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
101e0 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
101f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
10200 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
10210 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
10220 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73      u64 x = (((s
10230 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
10240 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
10250 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28  .      u32 y = (
10260 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[2]<<24) | (b
10270 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[3]<<16) | (bu
10280 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35  f[4]<<8) | buf[5
10290 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
102a0 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
102b0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
102c0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65  4*)&x;.      pMe
102d0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
102e0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
102f0 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
10300 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
10310 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
10320 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
10330 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
10340 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
10350 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75    u64 x;.      u
10360 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e  32 y;.#if !defin
10370 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
10380 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10390 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
103a0 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69  T).      /* Veri
103b0 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
103c0 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
103d0 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
103e0 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
103f0 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
10400 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
10410 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
10420 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
10430 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
10440 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
10450 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
10460 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
10470 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  .      ** endian
10480 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10490 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
104a0 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
104b0 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
104c0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
104d0 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
104e0 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d  ;.      u64 t2 =
104f0 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d   t1;.      swapM
10500 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
10510 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t2);.      asser
10520 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
10530 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
10540 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
10550 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
10560 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20  #endif..      x 
10570 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
10580 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
10590 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
105a0 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20  f[3];.      y = 
105b0 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28  (buf[4]<<24) | (
105c0 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[5]<<16) | (b
105d0 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[6]<<8) | buf[
105e0 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  7];.      x = (x
105f0 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
10600 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
10610 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
10620 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
10630 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
10640 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
10650 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Int;.      }else
10660 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
10670 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
10680 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  & sizeof(pMem->r
10690 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
106a0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
106b0 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20  loat(x);.       
106c0 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
106d0 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
106e0 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
106f0 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
10700 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20  sNaN(pMem->r) ? 
10710 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
10720 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eal;.      }.   
10730 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20     return 8;.   
10740 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
10750 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
10760 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
10770 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
10780 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
10790 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
107a0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
107b0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
107c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
107d0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
107e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  : {.      int le
107f0 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
10800 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
10810 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
10820 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
10830 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  >n = len;.      
10840 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
10850 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
10860 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20  _type&0x01 ){.  
10870 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
10880 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
10890 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
108a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
108b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
108c0 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  Blob | MEM_Ephem
108d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
108e0 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20  return len;.    
108f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
10900 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ;.}.../*.** Give
10910 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
10920 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
10930 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
10940 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63  parse the.** rec
10950 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63  ord into a Unpac
10960 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
10970 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ure.  Return a p
10980 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
10990 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
109a0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
109b0 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72  unction might pr
109c0 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62 79  ovide szSpace by
109d0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  tes of memory.**
109e0 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63 65   space at pSpace
109f0 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63 61  .  This space ca
10a00 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c  n be used to hol
10a10 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  d the returned.*
10a20 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63 6f  * VDbeParsedReco
10a30 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66 20  rd structure if 
10a40 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
10a50 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a  gh.  If it is.**
10a60 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c   not big enough,
10a70 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e   space is obtain
10a80 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
10a90 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  malloc()..**.** 
10aa0 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
10ab0 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65  ucture should be
10ac0 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c   closed by a cal
10ad0 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56  l to.** sqlite3V
10ae0 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
10af0 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55  dRecord()..*/ .U
10b00 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
10b10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
10b20 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
10b30 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
10b40 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
10b50 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
10b60 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
10b70 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
10b80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10b90 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
10ba0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
10bb0 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
10bc0 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
10bd0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
10be0 65 63 6f 72 64 20 2a 70 53 70 61 63 65 2c 2f 2a  ecord *pSpace,/*
10bf0 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
10c00 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74 69   to hold resulti
10c10 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ng object */.  i
10c20 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20  nt szSpace      
10c30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10c40 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
10c50 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
10c60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10c70 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
10c80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
10c90 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
10ca0 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cord *p;.  int n
10cb0 42 79 74 65 2c 20 64 3b 0a 20 20 75 33 32 20 69  Byte, d;.  u32 i
10cc0 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20  dx;.  u16 u;    
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ce0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
10cf0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
10d00 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
10d10 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  m;.  .  assert( 
10d20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69 7a 65  sizeof(Mem)>size
10d30 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42 79 74  of(*p) );.  nByt
10d40 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  e = sizeof(Mem)*
10d50 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
10d60 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+2);.  if( nByt
10d70 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20  e>szSpace ){.   
10d80 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
10d90 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
10da0 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
10db0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
10dc0 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c  urn 0;.    p->fl
10dd0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
10de0 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43  EED_FREE | UNPAC
10df0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
10e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
10e10 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 70   = pSpace;.    p
10e20 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
10e30 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
10e40 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  .  }.  p->pKeyIn
10e50 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
10e60 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
10e70 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
10e80 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70  1;.  p->aMem = p
10e90 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29 70 29  Mem = &((Mem*)p)
10ea0 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  [1];.  idx = get
10eb0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
10ec0 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
10ed0 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
10ee0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
10ef0 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 29  && u<p->nField )
10f00 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
10f10 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
10f20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
10f30 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
10f40 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
10f50 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c 69   d>=nKey && sqli
10f60 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
10f70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
10f80 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )>0 ) break;.   
10f90 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
10fa0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
10fb0 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
10fc0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65  nfo->db;.    pMe
10fd0 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m->flags = 0;.  
10fe0 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20    pMem->zMalloc 
10ff0 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
11000 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
11010 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
11020 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
11030 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
11040 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65   u++;.  }.  asse
11050 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
11060 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
11070 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
11080 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
11090 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
110a0 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79   routine destroy
110b0 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  s a UnpackedReco
110c0 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  rd object.*/.voi
110d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
110e0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
110f0 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  d(UnpackedRecord
11100 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
11110 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
11120 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
11130 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 20  D_DESTROY ){.   
11140 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
11150 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  Mem *pMem;.     
11160 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70   for(i=0, pMem=p
11170 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69  ->aMem; i<p->nFi
11180 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  eld; i++, pMem++
11190 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
111a0 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  Mem->zMalloc ){.
111b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
111c0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
111d0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  pMem);.        }
111e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
111f0 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
11200 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
11210 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20 73 71  FREE ){.      sq
11220 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
11230 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
11240 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11250 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11260 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
11270 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
11280 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
11290 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
112a0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
112b0 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
112c0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
112d0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
112e0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
112f0 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
11300 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
11310 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
11320 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
11330 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
11340 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
11350 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
11360 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
11370 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
11380 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
11390 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
113a0 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
113b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
113c0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
113d0 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
113e0 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
113f0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
11400 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
11410 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
11420 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
11430 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
11440 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
11450 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
11460 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
11470 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
11480 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
11490 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
114a0 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
114b0 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
114c0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
114d0 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
114e0 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
114f0 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
11500 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
11510 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
11520 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
11530 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
11540 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
11550 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
11560 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
11570 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
11580 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
11590 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
115a0 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47   the UNPACKED_IG
115b0 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20  NORE_ROWID flag 
115c0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
115d0 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
115e0 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70   the header of p
115f0 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e  Key1 is ignored.
11600 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
11610 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a  that pKey1 is.**
11620 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61   an index key, a
11630 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74  nd thus ends wit
11640 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  h a rowid value.
11650 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a    The last byte.
11660 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ** of the header
11670 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
11680 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  be the serial ty
11690 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a  pe of the rowid:
116a0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c  .** one of 1, 2,
116b0 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20   3, 4, 5, 6, 8, 
116c0 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67  or 9 - the integ
116d0 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  er serial types.
116e0 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74  .** The serial t
116f0 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  ype of the final
11700 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61   rowid will alwa
11710 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62  ys be a single b
11720 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72  yte..** By ignor
11730 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79  ing this last by
11740 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
11750 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63  , we force the c
11760 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20  omparison.** to 
11770 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64  ignore the rowid
11780 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b   at the end of k
11790 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ey1..*/.int sqli
117a0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
117b0 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
117c0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
117d0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
117e0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
117f0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
11800 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
11810 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
11820 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11830 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
11840 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
11850 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
11860 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
11870 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
11880 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
11890 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
118a0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
118b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
118c0 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
118d0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
118e0 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
118f0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
11900 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11910 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
11920 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11930 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
11940 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
11950 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
11960 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
11970 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
11980 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
11990 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
119a0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
119b0 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
119c0 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c   0;.  mem1.zMall
119d0 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78  oc = 0;.  .  idx
119e0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
119f0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
11a00 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
11a10 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
11a20 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47  gs & UNPACKED_IG
11a30 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NORE_ROWID ){.  
11a40 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a    szHdr1--;.  }.
11a50 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
11a60 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77  nfo->nField;.  w
11a70 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
11a80 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
11a90 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
11aa0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
11ab0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
11ac0 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
11ad0 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
11ae0 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
11af0 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
11b00 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
11b10 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
11b20 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe1 );.    if( d
11b30 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69  1>=nKey1 && sqli
11b40 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
11b50 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
11b60 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  1)>0 ) break;.. 
11b70 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
11b80 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
11b90 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
11ba0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
11bb0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
11bc0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
11bd0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
11be0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
11bf0 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
11c00 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
11c10 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
11c20 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
11c30 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  m[i],.          
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79   i<nField ? pKey
11c60 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a  Info->aColl[i] :
11c70 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
11c80 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
11c90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
11ca0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31  ;.  }.  if( mem1
11cb0 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  .zMalloc ) sqlit
11cc0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
11cd0 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69 66 28 20  (&mem1);..  if( 
11ce0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rc==0 ){.    /* 
11cf0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
11d00 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
11d10 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
11d20 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 20 20   fields and.    
11d30 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
11d40 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
11d50 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
11d60 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
11d70 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20 66 6c  NCRKEY.    ** fl
11d80 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
11d90 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
11da0 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
11db0 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20 2a 2a  s larger..    **
11dc0 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
11dd0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
11de0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
11df0 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
11e00 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a 2a 20  prefixes.    ** 
11e10 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
11e20 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68  o be equal.  Oth
11e30 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67  erwise, the long
11e40 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20  er key is the . 
11e50 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41     ** larger.  A
11e60 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
11e70 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
11e80 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
11e90 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  er.    ** if the
11ea0 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  re is a differen
11eb0 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
11ec0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
11ed0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52   & UNPACKED_INCR
11ee0 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  KEY ){.      rc 
11ef0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
11f00 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
11f10 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
11f20 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  FIX_MATCH ){.   
11f30 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d     /* Leave rc==
11f40 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  0 */.    }else i
11f50 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29  f( idx1<szHdr1 )
11f60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
11f70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
11f80 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
11f90 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
11fa0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20  Info->nField.   
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
11fc0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
11fd0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
11fe0 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
11ff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f  eturn rc;.}. ../
12000 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
12010 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
12020 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
12030 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
12040 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
12050 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
12060 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
12070 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
12080 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
12090 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
120a0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
120b0 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
120c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
120d0 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
120e0 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
120f0 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
12100 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
12110 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
12120 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
12130 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
12140 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
12150 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
12160 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
12170 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12180 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75  dbeIdxRowid(BtCu
12190 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
121a0 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
121b0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
121c0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
121d0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
121e0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
121f0 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
12200 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
12210 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
12220 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
12230 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
12240 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
12250 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
12260 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
12270 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
12280 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
12290 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
122a0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
122b0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
122c0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
122d0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
122e0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
122f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
12300 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
12310 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 75 6e 6c  lKey);.  if( unl
12320 69 6b 65 6c 79 28 6e 43 65 6c 6c 4b 65 79 3c 3d  ikely(nCellKey<=
12330 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
12340 37 66 66 66 66 66 66 66 29 20 29 7b 0a 20 20 20  7fffffff) ){.   
12350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12360 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
12370 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
12380 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
12390 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
123a0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 2e 66 6c   entry */.  m.fl
123b0 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62 20  ags = 0;.  m.db 
123c0 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63  = 0;.  m.zMalloc
123d0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
123e0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
123f0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69  tree(pCur, 0, (i
12400 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
12410 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
12420 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
12430 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
12440 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
12450 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
12460 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
12470 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
12480 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
12490 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
124a0 64 72 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  dr==2 );.  testc
124b0 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
124c0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
124d0 79 28 73 7a 48 64 72 3c 32 20 7c 7c 20 28 69 6e  y(szHdr<2 || (in
124e0 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
124f0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
12500 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
12510 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
12520 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
12530 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
12540 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
12550 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
12560 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
12570 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
12580 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
12590 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
125a0 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
125b0 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
125c0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
125d0 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
125e0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
125f0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
12600 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
12610 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
12620 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
12630 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
12640 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
12650 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
12660 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
12670 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
12680 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
12690 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
126a0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
126b0 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
126c0 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
126d0 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
126e0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
126f0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
12700 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
12710 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
12720 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
12730 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
12740 65 28 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 3d  e( m.n-lenRowid=
12750 3d 73 7a 48 64 72 20 29 3b 0a 20 20 69 66 28 20  =szHdr );.  if( 
12760 75 6e 6c 69 6b 65 6c 79 28 6d 2e 6e 2d 6c 65 6e  unlikely(m.n-len
12770 52 6f 77 69 64 3c 73 7a 48 64 72 29 20 29 7b 0a  Rowid<szHdr) ){.
12780 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
12790 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
127a0 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
127b0 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
127c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
127d0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
127e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
127f0 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
12800 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
12810 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
12820 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
12830 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12840 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
12850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12860 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
12870 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
12880 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
12890 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
128a0 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
128b0 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
128c0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
128d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
128e0 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
128f0 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
12900 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f  stcase( m.zMallo
12910 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
12920 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
12930 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
12940 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12950 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
12960 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
12970 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
12980 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
12990 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73   point to agains
129a0 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
129b0 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20  ing in pKey (of 
129c0 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57  length nKey).  W
129d0 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
129e0 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
129f0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
12a00 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
12a10 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
12a20 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
12a30 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
12a40 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53   pKey.  Return S
12a50 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12a60 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20  ess..**.** pKey 
12a70 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
12a80 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
12a90 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
12aa0 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
12ab0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
12ac0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
12ad0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
12ae0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
12af0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
12b00 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
12b10 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
12b20 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
12b30 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
12b40 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
12b50 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
12b60 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
12b70 74 69 72 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  tire key..**.** 
12b80 70 55 6e 70 61 63 6b 65 64 20 6d 61 79 20 62 65  pUnpacked may be
12b90 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 76 65 72   an unpacked ver
12ba0 73 69 6f 6e 20 6f 66 20 70 4b 65 79 2c 6e 4b 65  sion of pKey,nKe
12bb0 79 2e 20 20 49 66 20 70 55 6e 70 61 63 6b 65 64  y.  If pUnpacked
12bc0 20 69 73 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20   is.** supplied 
12bd0 69 74 20 69 73 20 75 73 65 64 20 69 6e 20 70 6c  it is used in pl
12be0 61 63 65 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79  ace of pKey,nKey
12bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12c00 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
12c10 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  e(.  VdbeCursor 
12c20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
12c30 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
12c40 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
12c50 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
12c60 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
12c70 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ,  /* Unpacked v
12c80 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 61  ersion of pKey a
12c90 6e 64 20 6e 4b 65 79 20 2a 2f 0a 20 20 69 6e 74  nd nKey */.  int
12ca0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
12cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
12cc0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
12cd0 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
12ce0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
12cf0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
12d00 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
12d10 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
12d20 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c  .  Mem m;..  sql
12d30 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
12d40 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
12d50 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
12d60 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
12d70 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
12d80 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
12d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12da0 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d 20  K;.  }.  m.db = 
12db0 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30  0;.  m.flags = 0
12dc0 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20  ;.  m.zMalloc = 
12dd0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
12de0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
12df0 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
12e00 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
12e10 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
12e20 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
12e30 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
12e40 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61  ( pUnpacked->fla
12e50 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47  gs & UNPACKED_IG
12e60 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20  NORE_ROWID );.  
12e70 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
12e80 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
12e90 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
12ea0 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
12eb0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
12ec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12ed0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12ee0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
12ef0 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
12f00 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
12f10 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
12f20 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
12f30 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
12f40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
12f50 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
12f60 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
12f70 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
12f80 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
12f90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12fa0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
12fb0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
12fc0 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
12fd0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
12fe0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
12ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
13000 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
13010 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
13020 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
13030 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
13040 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
13050 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
13060 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
13070 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
13080 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
13090 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
130a0 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
130b0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
130c0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
130d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
130e0 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
130f0 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
13100 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
13110 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
13120 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
13130 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
13140 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
13150 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
13160 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
13170 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
13180 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
13190 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
131a0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
131b0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
131c0 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
131d0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
131e0 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
131f0 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
13200 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
13210 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
13220 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
13230 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
13240 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
13250 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
13260 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
13270 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
13280 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
13290 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
132a0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
132b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
132c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
132d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
132e0 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
132f0 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
13300 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
13310 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.