/ Hex Artifact Content
Login

Artifact b48b0af5acd527ffe31a6da4f61971f7bd0bec0b:


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 35 30 20 32  eaux.c,v 1.450 2
02c0: 30 30 39 2f 30 34 2f 31 30 20 31 32 3a 35 35 3a  009/04/10 12:55:
02d0: 31 37 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  17 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 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
63c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
63d0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
63e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
63f0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
6400: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
6410: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
6420: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34     z = displayP4
6430: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
6440: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70  2);.    if( z!=p
6450: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
6460: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
6470: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31  tStr(pMem, z, -1
6480: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
6490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
64a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
64b0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
64c0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
64d0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
64e0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
64f0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
6500: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
6510: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6520: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b  _TEXT;.    pMem+
6530: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
6540: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
6550: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
6560: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
6570: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
6580: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
6590: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
65a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
65b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
65c0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
65d0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
65e0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
65f0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
6600: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
6610: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
6620: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
6630: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
6640: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
6650: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
6660: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
6670: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
6680: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
6690: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
66a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
66b0: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
66c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  t ){.        pMe
66d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
66e0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
66f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70       pMem->z = p
6700: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  Op->zComment;.  
6710: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
6720: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6730: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
6740: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
6750: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
6760: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
6770: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
6780: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
6790: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
67a0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
67b0: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
67d0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
67e0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
67f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
6800: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
6810: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
6820: 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61   8 - 5*(p->expla
6830: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63  in-1);.    p->rc
6840: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6850: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
6860: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
6870: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
6880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
6890: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
68a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
68b0: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
68c0: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
68d0: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
68e0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
68f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
6900: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
6910: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
6920: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
6930: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  p;.  if( nOp<1 )
6940: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
6950: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
6960: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
6970: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
6980: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
6990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
69a0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77  pOp->p4.z;.    w
69b0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
69c0: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
69d0: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a      printf("SQL:
69e0: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20   [%s]\n", z);.  
69f0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
6a00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6a10: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
6a20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6a30: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
6a40: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
6a50: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
6a60: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
6a70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6a80: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
6a90: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6aa0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6ab0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
6ac0: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
6ad0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
6ae0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
6af0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
6b00: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
6b10: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
6b20: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
6b30: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
6b40: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
6b50: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
6b60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
6b70: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
6b80: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
6b90: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
6ba0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
6bb0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
6bc0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
6bd0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6be0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
6bf0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
6c00: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
6c10: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
6c20: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
6c30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6c40: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
6c50: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
6c60: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
6c70: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
6c80: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
6c90: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
6ca0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
6cb0: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
6cc0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
6cd0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6ce0: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69   space from a fi
6cf0: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 2e  xed size buffer.
6d00: 20 20 4d 61 6b 65 20 2a 70 70 20 70 6f 69 6e 74    Make *pp point
6d10: 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63   to the.** alloc
6d20: 61 74 65 64 20 73 70 61 63 65 2e 20 20 28 4e 6f  ated space.  (No
6d30: 74 65 3a 20 20 70 70 20 69 73 20 61 20 63 68 61  te:  pp is a cha
6d40: 72 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  r* rather than a
6d50: 20 76 6f 69 64 2a 2a 20 74 6f 0a 2a 2a 20 77 6f   void** to.** wo
6d60: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 6f  rk around the po
6d70: 69 6e 74 65 72 20 61 6c 69 61 73 69 6e 67 20 72  inter aliasing r
6d80: 75 6c 65 73 20 6f 66 20 43 2e 29 20 20 2a 70 70  ules of C.)  *pp
6d90: 20 73 68 6f 75 6c 64 20 69 6e 69 74 69 61 6c 6c   should initiall
6da0: 79 0a 2a 2a 20 62 65 20 7a 65 72 6f 2e 20 20 49  y.** be zero.  I
6db0: 66 20 2a 70 70 20 69 73 20 6e 6f 74 20 7a 65 72  f *pp is not zer
6dc0: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
6dd0: 61 74 20 74 68 65 20 73 70 61 63 65 20 68 61 73  at the space has
6de0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
6df0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
6e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6e10: 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   noop..**.** nBy
6e20: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
6e30: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
6e40: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
6e50: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 20 74   *ppFrom point t
6e60: 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  o available spac
6e70: 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74  e and pEnd point
6e80: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
6e90: 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  the.** available
6ea0: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70   space..**.** *p
6eb0: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74  nByte is a count
6ec0: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
6ed0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
6ee0: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
6ef0: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
6f00: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
6f10: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
6f20: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74  ace in *ppFrom t
6f30: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
6f40: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
6f50: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
6f60: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
6f70: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
6f80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
6f90: 6c 6f 63 53 70 61 63 65 28 0a 20 20 63 68 61 72  locSpace(.  char
6fa0: 20 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20   *pp,           
6fb0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 74 20   /* IN/OUT: Set 
6fc0: 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pp to point to 
6fd0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
6fe0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
6ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7000: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
7010: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75   allocate */.  u
7020: 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20  8 **ppFrom,     
7030: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41      /* IN/OUT: A
7040: 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70  llocate from *pp
7050: 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45  From */.  u8 *pE
7060: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
7070: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
7080: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
7090: 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66   of *ppFrom buff
70a0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42  er */.  int *pnB
70b0: 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  yte          /* 
70c0: 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  If allocation ca
70d0: 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e  nnot be made, in
70e0: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
70f0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
7100: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
7110: 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b  MENT(*ppFrom) );
7120: 0a 20 20 69 66 28 20 28 2a 28 76 6f 69 64 2a 2a  .  if( (*(void**
7130: 29 70 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  )pp)==0 ){.    n
7140: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
7150: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  yte);.    if( (p
7160: 45 6e 64 20 2d 20 2a 70 70 46 72 6f 6d 29 3e 3d  End - *ppFrom)>=
7170: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  nByte ){.      *
7180: 28 76 6f 69 64 2a 2a 29 70 70 20 3d 20 28 76 6f  (void**)pp = (vo
7190: 69 64 20 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20  id *)*ppFrom;.  
71a0: 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e      *ppFrom += n
71b0: 42 79 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Byte;.    }else{
71c0: 0a 20 20 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  .      *pnByte +
71d0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20  = nByte;.    }. 
71e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70   }.}../*.** Prep
71f0: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
7200: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
7210: 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ion.  This invol
7220: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
7230: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
7240: 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64   stack space and
7250: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
7260: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
7270: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
7280: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
7290: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
72a0: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
72b0: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
72c0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
72d0: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
72e0: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  is is the only w
72f0: 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42  ay to move a VDB
7300: 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  E from VDBE_MAGI
7310: 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42  C_INIT to.** VDB
7320: 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a  E_MAGIC_RUN..**.
7330: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7340: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6d   may be called m
7350: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e  ore than once on
7360: 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61   a single virtua
7370: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68  l machine..** Th
7380: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69 73 20  e first call is 
7390: 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d 70 69  made while compi
73a0: 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 61  ling the SQL sta
73b0: 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71 75 65  tement. Subseque
73c0: 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20  nt.** calls are 
73d0: 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f 66 20  made as part of 
73e0: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 72  the process of r
73f0: 65 73 65 74 74 69 6e 67 20 61 20 73 74 61 74 65  esetting a state
7400: 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65  ment to be.** re
7410: 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f 6d 20  -executed (from 
7420: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
7430: 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68 65 20  3_reset()). The 
7440: 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72  nVar, nMem, nCur
7450: 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78  sor .** and isEx
7460: 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65 72 73  plain parameters
7470: 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73 65 64   are only passed
7480: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 73 20   correct values 
7490: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a  the first time.*
74a0: 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  * the function i
74b0: 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62  s called. On sub
74c0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66  sequent calls, f
74d0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  rom sqlite3_rese
74e0: 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20  t(), nVar.** is 
74f0: 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d  passed -1 and nM
7500: 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e 64 20  em, nCursor and 
7510: 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20 61 6c  isExplain are al
7520: 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a  l passed zero..*
7530: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7540: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
7550: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7570: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69   The VDBE */.  i
7580: 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20  nt nVar,        
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
75a0: 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73   Number of '?' s
75b0: 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ee in the SQL st
75c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
75d0: 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20   nMem,          
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
75f0: 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20  umber of memory 
7600: 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74  cells to allocat
7610: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  e */.  int nCurs
7620: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
7630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7640: 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  of cursors to al
7650: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  locate */.  int 
7660: 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20  isExplain       
7670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7680: 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41 49  ue if the EXPLAI
7690: 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72  N keywords is pr
76a0: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  esent */.){.  in
76b0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
76c0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61  db = p->db;..  a
76d0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
76e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
76f0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
7700: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
7710: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
7720: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
7730: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
7740: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
7750: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
7760: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
7770: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
7780: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
7790: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
77a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f  _MAGIC_RUN;..  /
77b0: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
77c0: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
77d0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
77e0: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
77f0: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
7800: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
7810: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
7820: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
7830: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
7840: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
7850: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
7860: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
7870: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ce for.  ** Vdbe
7880: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
7890: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
78a0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
78b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
78c0: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
78d0: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
78e0: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
78f0: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
7900: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
7910: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
7920: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7930: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
7940: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
7950: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
7960: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
7970: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
7980: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
7990: 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65  ce for memory re
79a0: 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72  gisters, SQL var
79b0: 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72  iables, VDBE cur
79c0: 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61  sors and .  ** a
79d0: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68  n array to marsh
79e0: 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  al SQL function 
79f0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20 54 68  arguments in. Th
7a00: 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20  is is only done 
7a10: 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
7a20: 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ime this functio
7a30: 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  n is called for 
7a40: 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20 6e 6f  a given VDBE, no
7a50: 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 2a  t when it is.  *
7a60: 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  * being called f
7a70: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  rom sqlite3_rese
7a80: 74 28 29 20 74 6f 20 72 65 73 65 74 20 74 68 65  t() to reset the
7a90: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
7aa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56 61  ..  */.  if( nVa
7ab0: 72 3e 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c  r>=0 && !db->mal
7ac0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7ad0: 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38 20   u8 *zCsr = (u8 
7ae0: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
7af0: 5d 3b 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20  ];.    u8 *zEnd 
7b00: 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b  = (u8 *)&p->aOp[
7b10: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 0a 20 20  p->nOpAlloc];.  
7b20: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
7b30: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
7b40: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
7b50: 65 72 20 6f 66 20 61 72 67 73 20 70 61 73 73 65  er of args passe
7b60: 64 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63  d to a user func
7b70: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 73  tion. */.    res
7b80: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
7b90: 26 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  &nArg);.    if( 
7ba0: 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65  isExplain && nMe
7bb0: 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d  m<10 ){.      nM
7bc0: 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20  em = 10;.    }. 
7bd0: 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72     zCsr += (zCsr
7be0: 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20   - (u8*)0)&7;.  
7bf0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
7c00: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a  BYTE_ALIGNMENT(z
7c10: 43 73 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Csr) );.    if( 
7c20: 7a 45 6e 64 3c 7a 43 73 72 20 29 20 7a 45 6e 64  zEnd<zCsr ) zEnd
7c30: 20 3d 20 7a 43 73 72 3b 0a 0a 20 20 20 20 64 6f   = zCsr;..    do
7c40: 20 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   {.      memset(
7c50: 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43  zCsr, 0, zEnd-zC
7c60: 73 72 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  sr);.      nByte
7c70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 6c 6c 6f   = 0;.      allo
7c80: 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70  cSpace((char*)&p
7c90: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
7ca0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
7cb0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
7cc0: 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65        allocSpace
7cd0: 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 56 61 72  ((char*)&p->aVar
7ce0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
7cf0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
7d00: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
7d10: 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72  allocSpace((char
7d20: 2a 29 26 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  *)&p->apArg, nAr
7d30: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
7d40: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
7d50: 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  yte);.      allo
7d60: 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26 70  cSpace((char*)&p
7d70: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
7d80: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
7d90: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
7da0: 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70  );.      allocSp
7db0: 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61  ace((char*)&p->a
7dc0: 70 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20  pCsr, .         
7dd0: 20 20 20 20 20 20 20 20 6e 43 75 72 73 6f 72 2a          nCursor*
7de0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
7df0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
7e00: 2c 20 26 6e 42 79 74 65 0a 20 20 20 20 20 20 29  , &nByte.      )
7e10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74  ;.      if( nByt
7e20: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e ){.        p->
7e30: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
7e40: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
7e50: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Byte);.      }. 
7e60: 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70       zCsr = p->p
7e70: 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64  Free;.      zEnd
7e80: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
7e90: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  .    }while( nBy
7ea0: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
7eb0: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20  cFailed );..    
7ec0: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
7ed0: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rsor;.    if( p-
7ee0: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70  >aVar ){.      p
7ef0: 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20  ->nVar = nVar;. 
7f00: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
7f10: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
7f20: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
7f30: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
7f40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
7f50: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
7f60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7f70: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
7f80: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
7fb0: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
7fc0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  */.      p->nMem
7fd0: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
7fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
7ff0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
8000: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f  em-1 */.      fo
8010: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
8020: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
8030: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
8040: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
8050: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
8060: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
8070: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
8080: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
8090: 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65  or(n=1; n<p->nMe
80a0: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; n++){.    ass
80b0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e  ert( p->aMem[n].
80c0: 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65  db==db );.  }.#e
80d0: 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20  ndif..  p->pc = 
80e0: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
80f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
8100: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
8110: 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  bort;.  p->expla
8120: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
8130: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
8140: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
8150: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
8160: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
8170: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
8180: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
8190: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
81a0: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
81b0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
81c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
81d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
81e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
81f0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
8200: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
8210: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20  cycles = 0;.    
8220: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
8230: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
8240: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
8250: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
8260: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
8270: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
8280: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
8290: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
82a0: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
82b0: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
82c0: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
82d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
82e0: 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  }.  if( pCx->pBt
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 28 70 43 78 2d 3e 70  treeClose(pCx->p
8310: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
8320: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
8330: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
8340: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
8350: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
8360: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
8370: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
8380: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
8390: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
83a0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
83b0: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
83c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
83d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
83e0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
83f0: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
8400: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
8410: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
8420: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
8430: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
8440: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
8450: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
8460: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
8470: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
8480: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
8490: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
84a0: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
84b0: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
84c0: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  r);.    (void)sq
84d0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
84e0: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
84f0: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
8500: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8510: 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64  !pCx->ephemPseud
8520: 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  oTable ){.    sq
8530: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
8540: 62 2c 20 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a  b, pCx->pData);.
8550: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
8560: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  se all cursors e
8570: 78 63 65 70 74 20 66 6f 72 20 56 54 61 62 20 63  xcept for VTab c
8580: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
8590: 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20  currently.** in 
85a0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
85b0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
85c0: 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56  orsExceptActiveV
85d0: 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  tabs(Vdbe *p){. 
85e0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
85f0: 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75  >apCsr==0 ) retu
8600: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
8610: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
8620: 29 7b 0a 20 20 20 20 56 64 62 65 43 75 72 73 6f  ){.    VdbeCurso
8630: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
8640: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20  [i];.    if( pC 
8650: 26 26 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65  && (!p->inVtabMe
8660: 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74  thod || !pC->pVt
8670: 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  abCursor) ){.   
8680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
8690: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
86a0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b  .      p->apCsr[
86b0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
86c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
86d0: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
86e0: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
86f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
8700: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
8710: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
8720: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
8730: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
8740: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
8750: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
8760: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
8770: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
8780: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
8790: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
87a0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
87b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
87c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
87d0: 3e 64 62 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  >db;.  Mem *pMem
87e0: 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
87f0: 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56  orsExceptActiveV
8800: 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 70  tabs(p);.  for(p
8810: 4d 65 6d 3d 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  Mem=&p->aMem[1],
8820: 20 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d   i=1; i<=p->nMem
8830: 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a  ; i++, pMem++){.
8840: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
8850: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
8860: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8870: 33 52 6f 77 53 65 74 43 6c 65 61 72 28 70 4d 65  3RowSetClear(pMe
8880: 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20  m->u.pRowSet);. 
8890: 20 20 20 7d 0a 20 20 20 20 4d 65 6d 53 65 74 54     }.    MemSetT
88a0: 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45  ypeFlag(pMem, ME
88b0: 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  M_Null);.  }.  r
88c0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
88d0: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
88e0: 4d 65 6d 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63  Mem);.  if( p->c
88f0: 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20  ontextStack ){. 
8900: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8910: 28 64 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53  (db, p->contextS
8920: 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  tack);.  }.  p->
8930: 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30  contextStack = 0
8940: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
8950: 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  ackDepth = 0;.  
8960: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54  p->contextStackT
8970: 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  op = 0;.  sqlite
8980: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
8990: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
89a0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
89b0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
89c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
89d0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
89e0: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
89f0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
8a00: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
8a10: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
8a20: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
8a30: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
8a40: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
8a50: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
8a60: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
8a70: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
8a80: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
8a90: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
8aa0: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
8ab0: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
8ac0: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
8ad0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
8ae0: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
8af0: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
8b00: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
8b10: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  e;.  int n;.  sq
8b20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
8b30: 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  b;..  releaseMem
8b40: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
8b50: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
8b60: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
8b70: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8b80: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
8b90: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
8ba0: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
8bb0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  nResColumn = nRe
8bc0: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
8bd0: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
8be0: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
8bf0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8c00: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
8c10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
8c20: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
8c30: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
8c40: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
8c50: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
8c60: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
8c70: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
8c80: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
8c90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
8ca0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8cb0: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
8cc0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
8cd0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
8ce0: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
8cf0: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
8d00: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
8d10: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
8d20: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
8d30: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
8d40: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
8d50: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
8d60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
8d70: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
8d80: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
8d90: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
8da0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
8db0: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
8dc0: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
8dd0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
8de0: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
8df0: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
8e00: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
8e10: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
8e20: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
8e30: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
8e40: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8e50: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8e60: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
8e90: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
8ea0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
8ed0: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
8ee0: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
8ef0: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f10: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
8f20: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
8f30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8f40: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
8f50: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8f60: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
8f70: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
8f80: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
8f90: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
8fa0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
8fb0: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
8fc0: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
8fd0: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
8fe0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
8ff0: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
9000: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
9010: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
9020: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
9030: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
9050: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
9060: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
9070: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9080: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
9090: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
90a0: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
90b0: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
90c0: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
90d0: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
90e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
90f0: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
9100: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
9110: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
9120: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
9130: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
9140: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
9150: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
9160: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9170: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
9180: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
9190: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
91a0: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
91b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
91c0: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
91d0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
91e0: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
91f0: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
9200: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
9210: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
9220: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
9230: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
9240: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
9250: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
9260: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
9270: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
9280: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
9290: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
92a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
92b0: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
92c0: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
92d0: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
92e0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
92f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
9300: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
9310: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
9320: 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  0;..  /* Before 
9330: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
9340: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
9350: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
9360: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
9370: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
9380: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
9390: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
93a0: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
93b0: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
93c0: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
93d0: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
93e0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
93f0: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
9400: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
9410: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
9420: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
9430: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
9440: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
9450: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
9460: 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72  Sync(db, &p->zEr
9470: 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21  rMsg);.  if( rc!
9480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
94a0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
94b0: 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
94c0: 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
94d0: 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
94e0: 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
94f0: 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
9500: 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
9510: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
9520: 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
9530: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
9540: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
9550: 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
9560: 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
9570: 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
9580: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
9590: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
95a0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
95b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
95c0: 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
95d0: 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
95e0: 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
95f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
9600: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
9610: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
9620: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9630: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
9640: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
9650: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
9660: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
9670: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
9680: 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  s++;.    }.  }..
9690: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
96a0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
96b0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
96c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
96d0: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
96e0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
96f0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
9700: 61 63 6b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ack ){.    asser
9710: 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  t( (db->flags & 
9720: 53 51 4c 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73  SQLITE_CommitBus
9730: 79 29 3d 3d 30 20 29 3b 0a 20 20 20 20 64 62 2d  y)==0 );.    db-
9740: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
9750: 5f 43 6f 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20  _CommitBusy;.   
9760: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
9770: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
9780: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
9790: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
97a0: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28  ommitArg);.    (
97b0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
97c0: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 64 62  tyOn(db);.    db
97d0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
97e0: 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 3b 0a 20  TE_CommitBusy;. 
97f0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
9800: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9810: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
9820: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
9830: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
9840: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
9850: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
9860: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
9870: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
9880: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
9890: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
98a0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
98b0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
98c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
98d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
98e0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
98f0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
9900: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
9910: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
9920: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
9930: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
9940: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
9950: 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
9960: 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
9970: 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
9980: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
9990: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
99a0: 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
99b0: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
99c0: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
99d0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
99e0: 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
99f0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
9a00: 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
9a10: 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
9a20: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
9a30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9a40: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9a50: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9a60: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9a70: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
9a80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
9a90: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
9aa0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
9ab0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
9ac0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
9ad0: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
9ae0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
9af0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
9b00: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
9b10: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
9b20: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
9b30: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
9b40: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
9b50: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
9b60: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
9b70: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
9b80: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
9b90: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
9ba0: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
9bb0: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
9bc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
9bd0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
9be0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
9bf0: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
9c00: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
9c10: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
9c20: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
9c30: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
9c40: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9c50: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
9c60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9c70: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9c80: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
9c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9ca0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9cb0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
9cc0: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
9cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9ce0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
9cf0: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
9d00: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
9d10: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
9d20: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
9d30: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
9d40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
9d50: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
9d60: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
9d70: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
9d80: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
9d90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
9da0: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
9db0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
9dc0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
9dd0: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
9de0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
9df0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
9e00: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
9e10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9e20: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
9e30: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
9e40: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
9e50: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
9e60: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
9e70: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
9e80: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
9e90: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
9ea0: 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a  int res;..    /*
9eb0: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
9ec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
9ed0: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
9ee0: 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
9ef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9f00: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
9f10: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
9f20: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
9f30: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
9f40: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a  Random);.      z
9f50: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
9f60: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
9f70: 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69  mj%08X", zMainFi
9f80: 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66  le, iRandom&0x7f
9f90: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69  ffffff);.      i
9fa0: 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20  f( !zMaster ){. 
9fb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9fc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9fd0: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
9fe0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
9ff0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
a000: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
a010: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
a020: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
a030: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
a040: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a050: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
a060: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
a070: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
a080: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a090: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
a0a0: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
a0b0: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
a0c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
a0d0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
a0e0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
a0f0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
a100: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
a110: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
a120: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
a130: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a140: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
a160: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
a170: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
a180: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
a190: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
a1a0: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
a1b0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
a1c0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
a1d0: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
a1e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a1f0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
a200: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
a210: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
a220: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
a230: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a240: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
a250: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
a260: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
a270: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
a280: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
a290: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
a2a0: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
a2b0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
a2c0: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
a2d0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
a2e0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
a2f0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
a300: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
a310: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
a320: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
a330: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
a340: 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  ;   /* Ignore th
a350: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
a360: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
a370: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a380: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
a390: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
a3a0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
a3b0: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
a3c0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
a3d0: 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20  if( zFile[0]==0 
a3e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
a3f0: 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20  Ignore :memory: 
a400: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
a410: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
a420: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
a430: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
a440: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
a450: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
a460: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a470: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a480: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
a490: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
a4a0: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
a4b0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
a4c0: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
a4d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
a4e0: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
a4f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a500: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a510: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
a520: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
a530: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
a540: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
a550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
a560: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a570: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
a580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
a590: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a5a0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a5b0: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
a5c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
a5d0: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
a5e0: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
a5f0: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
a600: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
a610: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a620: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
a630: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
a640: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
a650: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
a660: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
a670: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
a680: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
a690: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
a6a0: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
a6b0: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
a6c0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
a6d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
a6e0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
a6f0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
a700: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
a710: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a720: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
a730: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
a740: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
a750: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
a760: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
a770: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
a780: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
a790: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
a7a0: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
a7b0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
a7c0: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
a7d0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
a7e0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
a7f0: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
a800: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
a810: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
a820: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
a830: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
a840: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
a850: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
a860: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
a870: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
a880: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
a890: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
a8a0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
a8b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
a8c0: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
a8d0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
a8e0: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
a8f0: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
a900: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
a910: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
a920: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
a930: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
a940: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
a950: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
a960: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
a970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
a980: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
a990: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
a9a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a9b0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
a9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a9d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
a9e0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
a9f0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
aa00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
aa10: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
aa20: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  pMaster);.    if
aa30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aa40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aa50: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
aa60: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
aa70: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
aa80: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
aa90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
aaa0: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
aab0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
aac0: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
aad0: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
aae0: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
aaf0: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
ab00: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
ab10: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ab20: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
ab30: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
ab40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ab50: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
ab60: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
ab70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
ab80: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
ab90: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
aba0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
abb0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
abc0: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
abd0: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
abe0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
abf0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
ac00: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
ac10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
ac20: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
ac30: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
ac40: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
ac50: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
ac60: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
ac70: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
ac80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
ac90: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
aca0: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
acb0: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
acc0: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
acd0: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
ace0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
acf0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
ad00: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
ad10: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
ad20: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
ad30: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
ad40: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
ad50: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
ad60: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
ad70: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
ad80: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
ad90: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
ada0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
adb0: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
adc0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
add0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
ade0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
adf0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ae00: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ae10: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
ae20: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ae30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ae40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ae50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ae60: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
ae70: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
ae80: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
ae90: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
aea0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
aeb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
aec0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
aed0: 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
aee0: 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43  ite3.activeVdbeC
aef0: 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  nt count variabl
af00: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
af10: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
af20: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
af30: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
af40: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
af50: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
af60: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
af70: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
af80: 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
af90: 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
afa0: 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
afb0: 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
afc0: 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
afd0: 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
afe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
aff0: 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
b000: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
b010: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
b020: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
b030: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
b040: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
b050: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
b060: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
b070: 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  te = 0;.  p = db
b080: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
b090: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
b0a0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
b0b0: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
b0c0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
b0d0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
b0e0: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
b0f0: 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Write++;.    }. 
b100: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
b110: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
b120: 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64  nt==db->activeVd
b130: 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  beCnt );.  asser
b140: 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77  t( nWrite==db->w
b150: 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  riteVdbeCnt );.}
b160: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
b170: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b180: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
b190: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
b1a0: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
b1b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
b1c0: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
b1d0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
b1e0: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
b1f0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
b200: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
b210: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
b220: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
b230: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
b240: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
b250: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
b260: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
b270: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
b280: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
b290: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
b2a0: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
b2b0: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
b2c0: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
b2d0: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
b2e0: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
b2f0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
b300: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
b310: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
b320: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
b330: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
b340: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
b350: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
b360: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
b370: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
b380: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
b390: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
b3a0: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
b3b0: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
b3c0: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
b3d0: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
b3e0: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
b3f0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
b400: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
b410: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
b420: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
b430: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
b440: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
b450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
b460: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b470: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
b480: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
b490: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
b4a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
b4b0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
b4c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
b4d0: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
b4e0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
b4f0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
b500: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
b510: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
b520: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
b530: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b540: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
b550: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
b560: 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
b570: 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
b580: 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
b590: 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
b5a0: 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
b5b0: 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
b5c0: 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
b5d0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
b5e0: 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
b5f0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
b600: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
b610: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
b620: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
b630: 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
b640: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
b650: 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
b660: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
b670: 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a   is commtted..**
b680: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
b690: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
b6a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
b6b0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
b6c0: 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
b6d0: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
b6e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
b6f0: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
b700: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
b710: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
b720: 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
b730: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b740: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
b750: 69 53 74 61 74 65 6d 65 6e 74 20 26 26 20 64 62  iStatement && db
b760: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->nStatement ){.
b770: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
b780: 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
b790: 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
b7a0: 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
b7b0: 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
b7c0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
b7d0: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
b7e0: 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
b7f0: 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
b800: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
b810: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
b820: 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
b830: 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
b840: 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
b850: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
b860: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
b870: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
b880: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
b890: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
b8a0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
b8b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
b8c0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
b8d0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
b8e0: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
b8f0: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
b900: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
b910: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
b920: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
b930: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
b940: 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
b950: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
b960: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
b970: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
b980: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
b990: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
b9a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
b9b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b9d0: 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
b9e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b9f0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
ba00: 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
ba10: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  ement = 0;.  }. 
ba20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ba30: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
ba40: 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75  s compiled to su
ba50: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
ba60: 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62  he mode and to b
ba70: 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a  e threadsafe,.**
ba80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62   this routine ob
ba90: 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20  tains the mutex 
baa0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
bab0: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
bac0: 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
bad0: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
bae0: 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
baf0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
bb00: 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 0a   In doing so it.
bb10: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
bb20: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
bb30: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
bb40: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
bb50: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
bb60: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
bb70: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
bb80: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
bb90: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
bba0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
bbb0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
bbc0: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
bbd0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
bbe0: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
bbf0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
bc00: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
bc10: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
bc20: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
bc30: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
bc40: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
bc50: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
bc60: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
bc70: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
bc80: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 20 4f  d with the VM. O
bc90: 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79 20 61 20  f course only a 
bca0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 73 65 20  subset of these 
bcb0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 77 69  structures.** wi
bcc0: 6c 6c 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ll be accessed b
bcd0: 79 20 74 68 65 20 56 4d 2c 20 61 6e 64 20 77 65  y the VM, and we
bce0: 20 63 6f 75 6c 64 20 75 73 65 20 56 64 62 65 2e   could use Vdbe.
bcf0: 62 74 72 65 65 4d 61 73 6b 20 74 6f 20 66 69 67  btreeMask to fig
bd00: 75 72 65 0a 2a 2a 20 74 68 61 74 20 73 75 62 73  ure.** that subs
bd10: 65 74 20 6f 75 74 2c 20 62 75 74 20 74 68 65 72  et out, but ther
bd20: 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67  e is no advantag
bd30: 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a  e to doing so..*
bd40: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
bd50: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
bd60: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
bd70: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
bd80: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
bd90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
bda0: 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  o-op..*/.#ifndef
bdb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
bdc0: 52 45 44 5f 43 41 43 48 45 0a 76 6f 69 64 20 73  RED_CACHE.void s
bdd0: 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41  qlite3VdbeMutexA
bde0: 72 72 61 79 45 6e 74 65 72 28 56 64 62 65 20 2a  rrayEnter(Vdbe *
bdf0: 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  p){.#if SQLITE_T
be00: 48 52 45 41 44 53 41 46 45 0a 20 20 73 71 6c 69  HREADSAFE.  sqli
be10: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
be20: 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74  ayEnter(&p->aMut
be30: 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  ex);.#else.  sql
be40: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
be50: 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e 64 69 66  l(p->db);.#endif
be60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
be70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
be80: 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
be90: 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
bea0: 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
beb0: 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
bec0: 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
bed0: 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
bee0: 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
bef0: 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
bf00: 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
bf10: 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
bf20: 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
bf30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bf40: 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
bf50: 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
bf60: 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
bf70: 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
bf80: 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
bf90: 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
bfa0: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
bfb0: 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
bfc0: 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
bfd0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
bfe0: 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
bff0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
c000: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
c010: 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
c020: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
c030: 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
c040: 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
c050: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
c060: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
c070: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
c080: 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
c090: 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
c0a0: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
c0b0: 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
c0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
c0d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
c0e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c100: 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
c110: 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
c120: 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
c130: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
c140: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
c150: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
c160: 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
c170: 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
c180: 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
c190: 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
c1a0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
c1b0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
c1c0: 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
c1d0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
c1e0: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
c1f0: 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
c200: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
c210: 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
c220: 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
c230: 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
c240: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
c250: 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
c260: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
c270: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
c280: 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
c290: 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
c2a0: 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
c2b0: 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
c2c0: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
c2d0: 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
c2e0: 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
c2f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
c300: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
c310: 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
c320: 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
c330: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
c340: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
c350: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
c360: 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
c370: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
c380: 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
c390: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
c3a0: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43  .  }.  closeAllC
c3b0: 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69  ursorsExceptActi
c3c0: 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69 66  veVtabs(p);.  if
c3d0: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
c3e0: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
c3f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c400: 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
c410: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
c420: 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
c430: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
c440: 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
c450: 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
c460: 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  d */.  if( p->pc
c470: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  >=0 ){.    int m
c480: 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
c490: 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
c4a0: 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
c4b0: 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
c4c0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
c4d0: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
c4e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
c4f0: 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
c500: 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
c510: 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
c520: 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
c530: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
c540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75     sqlite3VdbeMu
c550: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 70 29  texArrayEnter(p)
c560: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
c570: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
c580: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
c590: 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
c5a0: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
c5b0: 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
c5c0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
c5d0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
c5e0: 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
c5f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
c600: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
c610: 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
c620: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
c630: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
c640: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
c650: 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
c660: 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64  -only, we need d
c670: 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74  o no rollback at
c680: 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c   all. Otherwise,
c690: 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65  .      ** procee
c6a0: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
c6b0: 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
c6c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c6d0: 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
c6e0: 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
c6f0: 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
c700: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c710: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
c720: 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
c730: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
c740: 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
c750: 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
c760: 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  LBACK;.         
c770: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
c780: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
c790: 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51  lse if( (mrc==SQ
c7a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
c7b0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a  c==SQLITE_FULL).
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d     && p->usesStm
c7e0: 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
c7f0: 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
c800: 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
c810: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
c820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c830: 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
c840: 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
c850: 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
c860: 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
c870: 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
c880: 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
c890: 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
c8a0: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
c8b0: 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
c8c0: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
c8d0: 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69            invali
c8e0: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
c8f0: 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
c900: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c910: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
c920: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c930: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
c940: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
c950: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
c960: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
c970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c980: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
c990: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
c9a0: 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
c9b0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
c9c0: 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20  ive writer .    
c9d0: 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64  ** VM, then we d
c9e0: 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
c9f0: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
ca00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
ca10: 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
ca20: 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
ca30: 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
ca40: 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
ca50: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
ca60: 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
ca70: 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
ca80: 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
ca90: 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
caa0: 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
cab0: 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
cac0: 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
cad0: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28  >writeVdbeCnt==(
cae0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
caf0: 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c  .     && (db->fl
cb00: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6d  ags & SQLITE_Com
cb10: 6d 69 74 42 75 73 79 29 3d 3d 30 0a 20 20 20 20  mitBusy)==0.    
cb20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
cb30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
cb40: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
cb50: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
cb60: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
cb70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cb80: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
cb90: 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68   is true, and th
cba0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
cbb0: 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  as .        ** s
cbc0: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74  uccessful or hit
cbd0: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
cbe0: 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d  nstraint. This m
cbf0: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
cc00: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
cc10: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  uired..        *
cc20: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 76  /.        rc = v
cc30: 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
cc40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cc50: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
cc60: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cc70: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
cc80: 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
cc90: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  x);.          re
cca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
ccb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ccc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ccd0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
cce0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
ccf0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
cd00: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
cd10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
cd30: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
cd40: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
cd50: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
cd60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
cd70: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
cd80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
cd90: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
cda0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
cdb0: 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
cdc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
cdd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
cde0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
cdf0: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
ce00: 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
ce10: 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
ce20: 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
ce30: 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
ce40: 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
ce50: 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
ce60: 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
ce70: 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
ce80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce90: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
cea0: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
ceb0: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
cec0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
ced0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
cee0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
cef0: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
cf00: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
cf10: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
cf20: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
cf30: 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
cf40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
cf50: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
cf60: 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
cf70: 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
cf80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
cf90: 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
cfa0: 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
cfb0: 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
cfc0: 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
cfd0: 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
cfe0: 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
cff0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
d000: 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
d010: 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
d020: 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
d030: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
d040: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 0a 20   set the error. 
d050: 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 74 68     ** code to th
d060: 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 20 20  e new value..   
d070: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
d080: 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
d090: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
d0a0: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
d0b0: 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
d0c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
d0d0: 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  && (p->rc==SQLIT
d0e0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
d0f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
d100: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
d110: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
d120: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d130: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
d140: 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
d150: 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sg = 0;.      }.
d160: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
d170: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
d180: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
d190: 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
d1a0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
d1b0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
d1c0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
d1d0: 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
d1e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d1f0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
d200: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
d210: 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
d220: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
d230: 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
d240: 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
d250: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
d260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d270: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
d280: 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
d290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d2b0: 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
d2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
d2d0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
d2e0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c   }.  .    /* Rol
d2f0: 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20  lback or commit 
d300: 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67  any schema chang
d310: 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  es that occurred
d320: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
d330: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
d340: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
d350: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
d360: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d370: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
d380: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ema(db, 0);.    
d390: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64    db->flags = (d
d3a0: 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54  b->flags | SQLIT
d3b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
d3c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d3d0: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
d3e0: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
d3f0: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c  BtreeMutexArrayL
d400: 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29  eave(&p->aMutex)
d410: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
d420: 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
d430: 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
d440: 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
d450: 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
d460: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
d470: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
d480: 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20  eVdbeCnt--;.    
d490: 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
d4a0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72   ){.      db->wr
d4b0: 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iteVdbeCnt--;.  
d4c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d4d0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
d4e0: 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  t>=db->writeVdbe
d4f0: 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Cnt );.  }.  p->
d500: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
d510: 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
d520: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
d530: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
d540: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d550: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
d560: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
d570: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
d580: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
d590: 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
d5a0: 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
d5b0: 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
d5c0: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
d5d0: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
d5e0: 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
d5f0: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
d600: 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
d610: 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
d620: 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
d630: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
d640: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
d650: 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
d660: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
d670: 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
d680: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
d690: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
d6a0: 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
d6b0: 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
d6c0: 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
d6d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d6e0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  K;.}.../*.** Eac
d6f0: 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
d700: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
d710: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
d720: 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
d730: 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
d740: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
d750: 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
d760: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
d770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d780: 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
d790: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
d7a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
d7c0: 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
d7d0: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
d7e0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
d7f0: 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
d800: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
d810: 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
d820: 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
d830: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
d840: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
d850: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
d860: 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
d870: 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
d880: 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
d890: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
d8a0: 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
d8b0: 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
d8c0: 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
d8d0: 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
d8e0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
d8f0: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
d900: 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
d910: 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
d920: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
d930: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d940: 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
d950: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
d960: 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
d970: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
d980: 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
d990: 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
d9a0: 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
d9b0: 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
d9c0: 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
d9d0: 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
d9e0: 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
d9f0: 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
da00: 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73  ..  */.  (void)s
da10: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
da20: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
da30: 65 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69  eHalt(p);.  (voi
da40: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
da50: 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ff(db);..  /* If
da60: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
da70: 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
da80: 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
da90: 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
daa0: 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
dab0: 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
dac0: 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
dad0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
dae0: 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
daf0: 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
db00: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
db10: 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
db20: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
db30: 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
db40: 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
db50: 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
db60: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
db70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
db80: 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
db90: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
dba0: 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
dbb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dbc0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
dbd0: 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
dbe0: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
dbf0: 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
dc00: 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
dc10: 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
dc20: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
dc30: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
dc40: 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72  ();.      db->er
dc50: 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20  rCode = p->rc;. 
dc60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
dc70: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
dc80: 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  g);.      p->zEr
dc90: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rMsg = 0;.    }e
dca0: 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  lse if( p->rc ){
dcb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
dcc0: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
dcd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
dce0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
dcf0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
dd00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
dd10: 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
dd20: 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
dd30: 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
dd40: 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
dd50: 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
dd60: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
dd70: 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
dd80: 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
dd90: 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
dda0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
ddb0: 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
ddc0: 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
ddd0: 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
dde0: 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
ddf0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
de00: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
de10: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
de20: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
de30: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
de40: 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
de50: 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
de60: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
de70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
de80: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
de90: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
dea0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
deb0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
dec0: 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
ded0: 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
dee0: 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
def0: 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
df00: 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
df10: 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
df20: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
df30: 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
df40: 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
df50: 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
df60: 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
df70: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
df80: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
df90: 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
dfa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
dfb0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
dfc0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
dfd0: 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
dfe0: 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
dff0: 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
e000: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
e010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e020: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
e030: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
e040: 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c  "%6d %10lld %8ll
e050: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
e060: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
e070: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
e080: 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
e090: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
e0a0: 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
e0b0: 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
e0c0: 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
e0d0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73      );.        s
e0e0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
e0f0: 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
e100: 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
e110: 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
e120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
e130: 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
e140: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
e150: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
e160: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
e170: 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
e180: 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
e190: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
e1a0: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
e1b0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
e1c0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
e1d0: 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
e1e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
e1f0: 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
e200: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
e210: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
e220: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
e230: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e240: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
e250: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
e260: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
e270: 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
e280: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
e290: 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
e2a0: 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
e2b0: 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
e2c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
e2d0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
e2e0: 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20  AGIC_INIT ){.   
e2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
e300: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
e310: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
e320: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e330: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  }../*.** Call th
e340: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
e350: 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e   each auxdata en
e360: 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63  try in pVdbeFunc
e370: 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68   for which.** th
e380: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
e390: 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63  bit in mask is c
e3a0: 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65  lear.  Auxdata e
e3b0: 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31  ntries beyond 31
e3c0: 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64  .** are always d
e3d0: 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65  estroyed.  To de
e3e0: 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74  stroy all auxdat
e3f0: 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20  a entries, call 
e400: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
e410: 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f  with mask==0..*/
e420: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
e430: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
e440: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
e450: 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  nc, int mask){. 
e460: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
e470: 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e  0; i<pVdbeFunc->
e480: 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAux; i++){.    
e490: 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a  struct AuxData *
e4a0: 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e  pAux = &pVdbeFun
e4b0: 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20  c->apAux[i];.   
e4c0: 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28   if( (i>31 || !(
e4d0: 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26  mask&(1<<i))) &&
e4e0: 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20   pAux->pAux ){. 
e4f0: 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
e500: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
e510: 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
e520: 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
e530: 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d     }.      pAux-
e540: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
e550: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
e560: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
e570: 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
e580: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
e590: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
e5a0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
e5b0: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ..  if( p==0 ) r
e5c0: 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
e5d0: 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  >db;.  if( p->pP
e5e0: 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
e5f0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
e600: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
e610: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
e620: 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
e630: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
e640: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
e650: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
e660: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
e670: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
e680: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
e690: 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d      Op *pOp = p-
e6a0: 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >aOp;.    for(i=
e6b0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
e6c0: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
e6d0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
e6e0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
e6f0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
e700: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71  E_DEBUG.      sq
e710: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e720: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
e730: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
e740: 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  }.  }.  releaseM
e750: 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
e760: 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c   p->nVar);.  sql
e770: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e780: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 72 65 6c  ->aLabel);.  rel
e790: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
e7a0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
e7b0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
e7c0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
e7d0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
e7e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
e7f0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
e800: 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  l);.  p->magic =
e810: 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
e820: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
e830: 65 28 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a 20  e(db, p->aOp);. 
e840: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e850: 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20  b, p->pFree);.  
e860: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e870: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , p);.}../*.** I
e880: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
e890: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
e8a0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
e8b0: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
e8c0: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
e8d0: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
e8e0: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
e8f0: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
e900: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
e910: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
e920: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
e930: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
e940: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
e950: 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
e960: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
e970: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
e980: 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b      int res, rc;
e990: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
e9a0: 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69  EST.    extern i
e9b0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
e9c0: 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a  h_count;.#endif.
e9d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
e9e0: 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63  sTable );.    rc
e9f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
ea00: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
ea10: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
ea20: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
ea30: 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
ea40: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ea50: 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64      p->lastRowid
ea60: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d   = keyToInt(p->m
ea70: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20  ovetoTarget);.  
ea80: 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69    p->rowidIsVali
ea90: 64 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b  d = res==0 ?1:0;
eaa0: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
eab0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
eac0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d  ite3BtreeNext(p-
ead0: 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
eae0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
eaf0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
eb00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
eb10: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
eb20: 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
eb30: 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
eb40: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
eb50: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
eb60: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
eb70: 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
eb80: 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  p->pCursor ){.  
eb90: 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a    int hasMoved;.
eba0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
ebb0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
ebc0: 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
ebd0: 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a  or, &hasMoved);.
ebe0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ebf0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
ec00: 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  hasMoved ){.    
ec10: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
ec20: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
ec30: 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77        p->nullRow
ec40: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
ec50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ec60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
ec70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
ec80: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
ec90: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
eca0: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
ecb0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
ecc0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
ecd0: 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
ece0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ecf0: 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
ed00: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
ed10: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
ed20: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
ed30: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
ed40: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
ed50: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
ed60: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
ed70: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
ed80: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
ed90: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
eda0: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
edb0: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
edc0: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
edd0: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
ede0: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
edf0: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
ee00: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
ee10: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
ee20: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
ee30: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
ee40: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
ee50: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
ee60: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
ee70: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
ee80: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
ee90: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
eea0: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
eeb0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
eec0: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
eed0: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
eee0: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
eef0: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
ef00: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
ef10: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
ef20: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
ef30: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
ef40: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
ef50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
ef60: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
ef70: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
ef80: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
ef90: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
efa0: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
efb0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
efc0: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
efd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
eff0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
f000: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
f030: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
f060: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
f070: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
f080: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
f090: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
f0a0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
f0d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
f0e0: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
f100: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
f110: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
f120: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
f130: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
f140: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
f150: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
f180: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
f190: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
f1b0: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
f1c0: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
f1f0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
f200: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
f230: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
f240: 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
f270: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
f280: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
f290: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
f2a0: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
f2b0: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
f2c0: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
f2d0: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
f2e0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
f2f0: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
f300: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
f310: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
f320: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
f330: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
f340: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
f350: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
f360: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
f370: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
f380: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
f390: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
f3a0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
f3b0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
f3c0: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
f3d0: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
f3e0: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
f3f0: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
f400: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
f410: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
f420: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
f430: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
f440: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
f450: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
f460: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
f470: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
f480: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
f490: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
f4a0: 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
f4b0: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
f4c0: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
f4d0: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
f4e0: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
f4f0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
f500: 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20  rn 8+(u32)i;.   
f510: 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f   }.    u = i<0 ?
f520: 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28   -i : i;.    if(
f530: 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e   u<=127 ) return
f540: 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33   1;.    if( u<=3
f550: 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
f560: 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
f570: 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
f580: 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
f590: 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
f5a0: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
f5b0: 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
f5c0: 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
f5d0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
f5e0: 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
f5f0: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
f600: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
f610: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f620: 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
f630: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
f640: 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20   n = pMem->n;.  
f650: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
f660: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
f670: 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
f680: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e    }.  assert( n>
f690: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
f6a0: 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
f6b0: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
f6c0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
f6d0: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
f6e0: 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
f6f0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
f700: 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
f710: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
f720: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f730: 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
f740: 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
f750: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
f760: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
f770: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
f780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
f790: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
f7a0: 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
f7b0: 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
f7c0: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
f7d0: 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
f7e0: 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
f7f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
f800: 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
f810: 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
f820: 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
f830: 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
f840: 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
f850: 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
f860: 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
f870: 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
f880: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
f890: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
f8a0: 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
f8b0: 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
f8c0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
f8d0: 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
f8e0: 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
f8f0: 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
f900: 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
f910: 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
f920: 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
f930: 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
f940: 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
f950: 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
f960: 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
f970: 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
f980: 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
f990: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
f9a0: 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
f9b0: 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
f9c0: 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
f9d0: 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
f9e0: 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
f9f0: 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
fa00: 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
fa10: 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
fa20: 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
fa30: 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
fa40: 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
fa50: 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
fa60: 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
fa70: 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
fa80: 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
fa90: 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
faa0: 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
fab0: 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
fac0: 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
fad0: 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
fae0: 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
faf0: 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
fb00: 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
fb10: 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
fb20: 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
fb30: 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
fb40: 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
fb50: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
fb60: 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
fb70: 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
fb80: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
fb90: 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
fba0: 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
fbb0: 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
fbc0: 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
fbd0: 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
fbe0: 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
fbf0: 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
fc00: 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
fc10: 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
fc20: 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
fc30: 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
fc40: 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
fc50: 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
fc60: 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
fc70: 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
fc80: 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
fc90: 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
fca0: 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
fcb0: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
fcc0: 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
fcd0: 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
fce0: 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
fcf0: 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
fd00: 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
fd10: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
fd20: 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
fd30: 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
fd40: 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
fd50: 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
fd60: 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
fd70: 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
fd80: 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
fd90: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
fda0: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
fdb0: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
fdc0: 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
fdd0: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
fde0: 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
fdf0: 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
fe00: 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
fe10: 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
fe20: 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
fe30: 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
fe40: 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
fe50: 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
fe60: 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
fe70: 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
fe80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
fe90: 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
fea0: 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
feb0: 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
fec0: 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
fed0: 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
fee0: 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
fef0: 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
ff00: 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
ff10: 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
ff20: 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
ff30: 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
ff40: 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
ff50: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
ff60: 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
ff70: 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
ff80: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
ff90: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
ffa0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
ffb0: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
ffc0: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
ffd0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
ffe0: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
fff0: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
10000 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
10010 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
10020 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
10030 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
10040 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
10050 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
10060 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
10070 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
10080 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75  t in buf[].  nBu
10090 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  f must always be
100a0 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  .** large enough
100b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
100c0 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65  ire field.  Exce
100d0 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64  pt, if the field
100e0 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69   is.** a blob wi
100f0 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  th a zero-filled
10100 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b   tail, then buf[
10110 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20  ] might be just 
10120 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a  the right.** siz
10130 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74  e to hold everyt
10140 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20  hing except for 
10150 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
10160 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a  tail.  If buf[].
10170 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65  ** is only big e
10180 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
10190 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69  e non-zero prefi
101a0 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  x, then only wri
101b0 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69  te that.** prefi
101c0 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42  x into buf[].  B
101d0 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c  ut if buf[] is l
101e0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
101f0 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20  old both the.** 
10200 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74  prefix and the t
10210 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74  ail then write t
10220 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65  he prefix and se
10230 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c  t the tail to al
10240 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a  l.** zeros..**.*
10250 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
10260 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
10270 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
10280 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
10290 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
102a0 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
102b0 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
102c0 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
102d0 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
102e0 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
102f0 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
10300 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73  buf[]..*/ .int s
10310 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10320 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74  Put(u8 *buf, int
10330 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   nBuf, Mem *pMem
10340 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
10350 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c  t){.  u32 serial
10360 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
10370 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d  dbeSerialType(pM
10380 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  em, file_format)
10390 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20  ;.  int len;..  
103a0 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
103b0 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
103c0 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
103d0 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
103e0 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69      u64 v;.    i
103f0 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  nt i;.    if( se
10400 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
10410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
10420 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
10430 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
10440 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
10450 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
10460 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
10470 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
10480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10490 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
104a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
104b0 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
104c0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
104d0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
104e0 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42   assert( len<=nB
104f0 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  uf );.    while(
10500 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
10510 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  f[i] = (u8)(v&0x
10520 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
10530 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
10540 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
10550 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
10560 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
10570 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
10580 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
10590 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
105a0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
105b0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
105d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
105e0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
105f0 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73  type) );.    ass
10600 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42  ert( pMem->n<=nB
10610 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  uf );.    len = 
10620 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
10630 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
10640 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  , len);.    if( 
10650 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
10660 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
10670 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e  len += pMem->u.n
10680 5a 65 72 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Zero;.      if( 
10690 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20  len>nBuf ){.    
106a0 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a      len = nBuf;.
106b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
106c0 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
106d0 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
106e0 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
106f0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
10700 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
10710 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
10720 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
10730 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
10740 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
10750 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
10760 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
10770 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
10780 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
10790 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
107a0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
107b0 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
107c0 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
107d0 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
107e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
107f0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
10800 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
10810 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
10820 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
10830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10840 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
10850 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
10860 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
10890 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
108a0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
108b0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
108c0 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
108d0 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
108e0 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
108f0 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
10900 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
10910 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
10920 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
10930 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
10940 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
10950 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
10960 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10970 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
10980 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
10990 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
109a0 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
109b0 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
109c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
109d0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
109e0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
109f0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
10a00 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
10a10 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
10a20 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
10a30 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
10a40 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
10a50 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
10a60 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
10a70 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
10a80 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
10a90 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
10aa0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
10ab0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
10ac0 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
10ad0 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
10ae0 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
10af0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
10b00 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
10b10 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
10b20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
10b30 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
10b40 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
10b50 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
10b60 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
10b70 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
10b80 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
10b90 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
10ba0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
10bb0 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
10bc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
10bd0 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
10be0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
10bf0 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
10c00 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
10c10 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
10c20 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
10c30 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
10c40 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
10c50 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
10c60 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
10c70 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
10c80 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
10c90 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
10ca0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
10cb0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
10cc0 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
10cd0 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
10ce0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
10cf0 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
10d00 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
10d10 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
10d20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
10d30 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
10d40 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
10d50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10d60 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
10d70 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
10d80 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
10d90 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
10da0 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
10db0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
10dc0 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
10dd0 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
10de0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
10df0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
10e00 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
10e10 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
10e20 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
10e30 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
10e40 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
10e50 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
10e60 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
10e70 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
10e80 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
10e90 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
10ea0 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
10eb0 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
10ec0 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
10ed0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
10ee0 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
10ef0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
10f00 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
10f10 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
10f20 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
10f30 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
10f40 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
10f50 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
10f60 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
10f70 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
10f80 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
10f90 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
10fa0 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
10fb0 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
10fc0 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
10fd0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
10fe0 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
10ff0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
11000 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
11010 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
11020 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
11030 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
11040 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
11050 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
11060 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
11070 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
11080 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
11090 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
110a0 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
110b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
110c0 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
110d0 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
110e0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
110f0 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
11100 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
11110 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
11120 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
11130 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
11140 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
11150 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
11160 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
11170 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
11180 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
11190 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
111a0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
111b0 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  t: {.      int l
111c0 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
111d0 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
111e0 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
111f0 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
11200 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
11210 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
11220 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
11230 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
11240 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
11250 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
11260 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
11270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11280 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
11290 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
112a0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
112b0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
112c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
112d0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  0;.}.../*.** Giv
112e0 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
112f0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
11300 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
11310 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65   parse the.** re
11320 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61  cord into a Unpa
11330 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
11340 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20  ture.  Return a 
11350 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
11360 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  at structure..**
11370 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
11380 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70  function might p
11390 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62  rovide szSpace b
113a0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
113b0 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63  * space at pSpac
113c0 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63  e.  This space c
113d0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f  an be used to ho
113e0 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  ld the returned.
113f0 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63  ** VDbeParsedRec
11400 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66  ord structure if
11410 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
11420 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a  ugh.  If it is.*
11430 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68  * not big enough
11440 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69  , space is obtai
11450 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
11460 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  _malloc()..**.**
11470 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
11480 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62  ructure should b
11490 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61  e closed by a ca
114a0 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
114b0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
114c0 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a  edRecord()..*/ .
114d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
114e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
114f0 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
11500 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
11510 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
11520 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
11530 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
11540 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
11550 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11560 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
11570 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
11580 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
11590 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
115a0 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  rd */.  char *pS
115b0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 2f  pace,          /
115c0 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
115d0 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68  e available to h
115e0 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  old the object *
115f0 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20  /.  int szSpace 
11600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11610 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
11620 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
11630 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
11640 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
11650 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11660 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63   *)pKey;.  Unpac
11670 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 2f  kedRecord *p;  /
11680 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64 20 72  * The unpacked r
11690 65 63 6f 72 64 20 74 68 61 74 20 77 65 20 77 69  ecord that we wi
116a0 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  ll return */.  i
116b0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
116c0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61     /* Memory spa
116d0 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  ce needed to hol
116e0 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20 2a 2f  d p, in bytes */
116f0 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33 32 20  .  int d;.  u32 
11700 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20  idx;.  u16 u;   
11710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
11720 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
11730 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
11740 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  dr;.  Mem *pMem;
11750 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20  .  int nOff;    
11760 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
11770 73 65 20 70 53 70 61 63 65 20 62 79 20 74 68 69  se pSpace by thi
11780 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79 74 65  s much to 8-byte
11790 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 0a   align it */.  .
117a0 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 28    nOff = (8 - ((
117b0 70 53 70 61 63 65 20 2d 20 28 63 68 61 72 2a 29  pSpace - (char*)
117c0 30 29 26 37 29 29 20 26 20 37 3b 0a 20 20 70 53  0)&7)) & 7;.  pS
117d0 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20 20  pace += nOff;.  
117e0 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66 3b  szSpace -= nOff;
117f0 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
11800 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
11810 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
11820 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
11830 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
11840 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
11850 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  e ){.    p = sql
11860 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
11870 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
11880 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  yte);.    if( p=
11890 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
118a0 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
118b0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45  PACKED_NEED_FREE
118c0 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   | UNPACKED_NEED
118d0 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c 73  _DESTROY;.  }els
118e0 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  e{.    p = (Unpa
118f0 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70 61  ckedRecord*)pSpa
11900 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  ce;.    p->flags
11910 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   = UNPACKED_NEED
11920 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20  _DESTROY;.  }.  
11930 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
11940 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
11950 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
11960 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d  nField + 1;.  p-
11970 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 28  >aMem = pMem = (
11980 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
11990 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
119a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
119b0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
119c0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
119d0 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
119e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
119f0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
11a00 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
11a10 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
11a20 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69  zHdr && u<p->nFi
11a30 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73  eld ){.    u32 s
11a40 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
11a50 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
11a60 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20  t32(&aKey[idx], 
11a70 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
11a80 20 20 69 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26    if( d>=nKey &&
11a90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11aa0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
11ab0 5f 74 79 70 65 29 3e 30 20 29 20 62 72 65 61 6b  _type)>0 ) break
11ac0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
11ad0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
11ae0 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
11af0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
11b00 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
11b10 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61  0;.    pMem->zMa
11b20 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20  lloc = 0;.    d 
11b30 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
11b40 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
11b50 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
11b60 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
11b70 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20  ;.    u++;.  }. 
11b80 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
11b90 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
11ba0 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
11bb0 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  = u;.  return (v
11bc0 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oid*)p;.}../*.**
11bd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
11be0 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65  stroys a Unpacke
11bf0 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a  dRecord object.*
11c00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11c10 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
11c20 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52  Record(UnpackedR
11c30 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
11c40 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
11c50 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
11c60 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29  D_NEED_DESTROY )
11c70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
11c80 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a       Mem *pMem;.
11c90 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
11ca0 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70  Mem=p->aMem; i<p
11cb0 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70  ->nField; i++, p
11cc0 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Mem++){.        
11cd0 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
11ce0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  c ){.          s
11cf0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
11d00 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
11d10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11d20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
11d30 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
11d40 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20  NEED_FREE ){.   
11d50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11d60 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  (p->pKeyInfo->db
11d70 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
11d80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11d90 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
11da0 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
11db0 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
11dc0 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
11dd0 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
11de0 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
11df0 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
11e00 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
11e10 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
11e20 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
11e30 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
11e40 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
11e50 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
11e60 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
11e70 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
11e80 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
11e90 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   th OP_MakeRecor
11ea0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
11eb0 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
11ec0 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
11ed0 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
11ee0 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
11ef0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
11f00 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
11f10 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
11f20 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
11f30 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
11f40 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
11f50 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20  lds..** The key 
11f60 77 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64  with fewer field
11f70 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d  s is usually com
11f80 70 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20  pares less than 
11f90 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b  the .** longer k
11fa0 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20  ey.  However if 
11fb0 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  the UNPACKED_INC
11fc0 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50  RKEY flags in pP
11fd0 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61  Key2 is set.** a
11fe0 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72  nd the common pr
11ff0 65 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c  efixes are equal
12000 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c  , then key1 is l
12010 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a  ess than key2..*
12020 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41  * Or if the UNPA
12030 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49  CKED_MATCH_PREFI
12040 58 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  X flag is set an
12050 64 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61  d the prefixes a
12060 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65  re.** equal, the
12070 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63  n the keys are c
12080 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
12090 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65  equal and.** the
120a0 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68   parts beyond th
120b0 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20  e common prefix 
120c0 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  are ignored..**.
120d0 2a 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  ** If the UNPACK
120e0 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
120f0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
12100 6e 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  n the last byte 
12110 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  of.** the header
12120 20 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e   of pKey1 is ign
12130 6f 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ored.  It is ass
12140 75 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20  umed that pKey1 
12150 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b  is.** an index k
12160 65 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64  ey, and thus end
12170 73 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76  s with a rowid v
12180 61 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20  alue.  The last 
12190 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68  byte.** of the h
121a0 65 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65  eader will there
121b0 66 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69  fore be the seri
121c0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
121d0 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20  owid:.** one of 
121e0 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36  1, 2, 3, 4, 5, 6
121f0 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20  , 8, or 9 - the 
12200 69 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74  integer serial t
12210 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72  ypes..** The ser
12220 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
12230 66 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c  final rowid will
12240 20 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e   always be a sin
12250 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20  gle byte..** By 
12260 69 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61  ignoring this la
12270 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
12280 65 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20  eader, we force 
12290 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  the comparison.*
122a0 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
122b0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
122c0 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74   of key1..*/.int
122d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
122e0 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
122f0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
12300 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
12310 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
12320 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
12330 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
12340 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69  ht key */.){.  i
12350 6e 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  nt d1;          
12360 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
12370 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
12380 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
12390 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
123a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
123b0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
123c0 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
123d0 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
123e0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
123f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
12400 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
12410 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69  i = 0;.  int nFi
12420 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  eld;.  int rc = 
12430 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
12440 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
12450 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
12460 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
12470 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
12480 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
12490 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
124a0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
124b0 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
124c0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
124d0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
124e0 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c  o->db;.  mem1.fl
124f0 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e  ags = 0;.  mem1.
12500 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a  zMalloc = 0;.  .
12510 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
12520 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
12530 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
12540 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32  r1;.  if( pPKey2
12550 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
12560 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
12570 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b  ){.    szHdr1--;
12580 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20  .  }.  nField = 
12590 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
125a0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
125b0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
125c0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  y2->nField ){.  
125d0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
125e0 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
125f0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
12600 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
12610 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
12620 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
12630 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
12640 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
12650 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
12660 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
12670 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12680 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
12690 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
126a0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
126b0 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
126c0 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
126d0 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
126e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
126f0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
12700 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
12710 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
12720 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
12730 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
12740 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
12750 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
12760 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f        i<nField ?
12790 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
127a0 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
127b0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
127c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
127d0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    i++;.  }.  if(
127e0 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20   mem1.zMalloc ) 
127f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
12800 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20  lease(&mem1);.. 
12810 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
12820 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
12830 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
12840 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
12850 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
12860 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  .    ** all the 
12870 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
12880 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
12890 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43  al. If the UNPAC
128a0 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 20 20  KED_INCRKEY.    
128b0 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ** flag is set, 
128c0 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74  then break the t
128d0 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b  ie by treating k
128e0 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20  ey2 as larger.. 
128f0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41     ** If the UPA
12900 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
12910 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  H flag is set, t
12920 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f  hen keys with co
12930 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20  mmon prefixes.  
12940 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65    ** are conside
12950 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e  red to be equal.
12960 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
12970 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74   longer key is t
12980 68 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  he .    ** large
12990 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e  r.  As it happen
129a0 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69  s, the pPKey2 wi
129b0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ll always be the
129c0 20 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a 20 69   longer.    ** i
129d0 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66  f there is a dif
129e0 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a  ference..    */.
129f0 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
12a00 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
12a10 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
12a20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d    rc = -1;.    }
12a30 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
12a40 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
12a50 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29  D_PREFIX_MATCH )
12a60 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
12a70 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d 65   rc==0 */.    }e
12a80 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48  lse if( idx1<szH
12a90 64 72 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  dr1 ){.      rc 
12aa0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
12ab0 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
12ac0 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69  >aSortOrder && i
12ad0 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
12ae0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
12af0 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
12b00 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
12b10 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d     rc = -rc;.  }
12b20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
12b30 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  . ../*.** pCur p
12b40 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
12b50 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
12b60 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
12b70 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
12b80 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
12b90 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
12ba0 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
12bb0 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
12bc0 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
12bd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
12be0 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
12bf0 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
12c00 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
12c10 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
12c20 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
12c30 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
12c40 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
12c50 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
12c60 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
12c70 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
12c80 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
12c90 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
12ca0 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
12cb0 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
12cc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
12cd0 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
12ce0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
12cf0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
12d00 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
12d10 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
12d20 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
12d30 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
12d40 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
12d50 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
12d60 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
12d70 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
12d80 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
12d90 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
12da0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
12db0 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
12dc0 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
12dd0 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
12de0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
12df0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
12e00 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
12e10 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
12e20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
12e30 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
12e40 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66  &nCellKey);.  if
12e50 28 20 75 6e 6c 69 6b 65 6c 79 28 6e 43 65 6c 6c  ( unlikely(nCell
12e60 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
12e70 65 79 3e 30 78 37 66 66 66 66 66 66 66 29 20 29  ey>0x7fffffff) )
12e80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12e90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12ea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
12eb0 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
12ec0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
12ed0 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
12ee0 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20   m.flags = 0;.  
12ef0 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d  m.db = 0;.  m.zM
12f00 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20  alloc = 0;.  rc 
12f10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
12f20 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
12f30 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
12f40 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
12f50 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
12f60 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
12f70 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
12f80 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
12f90 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
12fa0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
12fb0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
12fc0 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
12fd0 28 20 73 7a 48 64 72 3d 3d 32 20 29 3b 0a 20 20  ( szHdr==2 );.  
12fe0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
12ff0 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
13000 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 32 20 7c  likely(szHdr<2 |
13010 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
13020 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
13030 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
13040 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
13050 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
13060 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
13070 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
13080 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
13090 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
130a0 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
130b0 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
130c0 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
130d0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
130e0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
130f0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
13100 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
13110 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
13120 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
13130 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
13140 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
13150 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
13160 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
13170 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
13180 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
13190 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
131a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
131b0 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
131c0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
131d0 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
131e0 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
131f0 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
13200 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
13210 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
13220 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
13230 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
13240 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
13250 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
13260 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
13270 73 74 63 61 73 65 28 20 6d 2e 6e 2d 6c 65 6e 52  stcase( m.n-lenR
13280 6f 77 69 64 3d 3d 73 7a 48 64 72 20 29 3b 0a 20  owid==szHdr );. 
13290 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 6d 2e   if( unlikely(m.
132a0 6e 2d 6c 65 6e 52 6f 77 69 64 3c 73 7a 48 64 72  n-lenRowid<szHdr
132b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
132c0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
132d0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
132e0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
132f0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
13300 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
13310 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13320 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
13330 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
13340 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
13350 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
13360 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
13370 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
13380 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13390 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
133a0 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
133b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
133c0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
133d0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
133e0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
133f0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
13400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13410 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
13420 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
13430 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
13440 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
13450 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
13460 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
13470 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
13480 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
13490 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
134a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
134b0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
134c0 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
134d0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
134e0 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
134f0 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
13500 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
13510 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
13520 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
13530 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
13540 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
13550 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
13560 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
13570 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
13580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
13590 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
135a0 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
135b0 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
135c0 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
135d0 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
135e0 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
135f0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
13600 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
13610 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
13620 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
13630 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
13640 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
13650 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
13660 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
13670 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
13680 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
13690 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
136a0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
136b0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 6d  *.** pUnpacked m
136c0 61 79 20 62 65 20 61 6e 20 75 6e 70 61 63 6b 65  ay be an unpacke
136d0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65  d version of pKe
136e0 79 2c 6e 4b 65 79 2e 20 20 49 66 20 70 55 6e 70  y,nKey.  If pUnp
136f0 61 63 6b 65 64 20 69 73 0a 2a 2a 20 73 75 70 70  acked is.** supp
13700 6c 69 65 64 20 69 74 20 69 73 20 75 73 65 64 20  lied it is used 
13710 69 6e 20 70 6c 61 63 65 20 6f 66 20 70 4b 65 79  in place of pKey
13720 2c 6e 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ,nKey..*/.int sq
13730 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
13740 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75  ompare(.  VdbeCu
13750 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
13760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
13770 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
13780 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
13790 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
137a0 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63  acked,  /* Unpac
137b0 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ked version of p
137c0 4b 65 79 20 61 6e 64 20 6e 4b 65 79 20 2a 2f 0a  Key and nKey */.
137d0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
137f0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
13800 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
13810 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
13820 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
13830 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
13840 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
13850 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
13860 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
13870 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
13880 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43  llKey);.  if( nC
13890 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
138a0 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
138b0 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
138c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
138d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e  ITE_OK;.  }.  m.
138e0 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67  db = 0;.  m.flag
138f0 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c  s = 0;.  m.zMall
13900 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  oc = 0;.  rc = s
13910 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
13920 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
13930 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
13940 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
13950 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
13960 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
13970 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
13980 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
13990 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
139a0 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
139b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
139c0 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
139d0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
139e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
139f0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
13a00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13a10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13a20 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
13a30 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
13a40 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
13a50 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
13a60 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
13a70 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13a80 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
13a90 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
13aa0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
13ab0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
13ac0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
13ad0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13ae0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
13af0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
13b00 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
13b10 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
13b20 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
13b30 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
13b40 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
13b50 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
13b60 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
13b70 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
13b80 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
13b90 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
13ba0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
13bb0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
13bc0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
13bd0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
13be0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
13bf0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
13c00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13c10 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
13c20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
13c30 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
13c40 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
13c50 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
13c60 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
13c70 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
13c80 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
13c90 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
13ca0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
13cb0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
13cc0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
13cd0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
13ce0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
13cf0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
13d00 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
13d10 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
13d20 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
13d30 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
13d40 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
13d50 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
13d60 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
13d70 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
13d80 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
13d90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13da0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
13db0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
13dc0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
13dd0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
13de0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
13df0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
13e00 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
13e10 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
13e20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
13e30 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
13e40 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
13e50 0a 7d 0a                                         .}.