/ Hex Artifact Content
Login

Artifact 017bd2774528220c0c7b85342ad6b114011dfb53:


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 37 36 20 32  eaux.c,v 1.476 2
02c0: 30 30 39 2f 30 37 2f 31 37 20 31 37 3a 32 35 3a  009/07/17 17:25:
02d0: 34 33 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  43 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 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
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 41 4c 57 41 59  nOp;.  if( ALWAY
2620: 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20  S(nOp>0) ){.    
2630: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
2640: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
2650: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
2660: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
2670: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
2680: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
2690: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
26a0: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
26b0: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
26c0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
26d0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
26e0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
26f0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
2700: 30 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  0 && sqlite3Vdbe
2710: 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74  OpcodeHasPropert
2720: 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20  y(pOut->opcode, 
2730: 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20  OPFLG_JUMP) ){. 
2740: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
2750: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
2760: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2770: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
2780: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
2790: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
27a0: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
27b0: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
27c0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
27d0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
27e0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
27f0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
2800: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
2810: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
2820: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2830: 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
2840: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2850: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
2860: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
2870: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
2880: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2890: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
28a0: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
28b0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
28c0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
28d0: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
28e0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
28f0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
2900: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2910: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
2920: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
2930: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
2940: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
2950: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
2960: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
2970: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
2980: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
2990: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
29a0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
29b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
29c0: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  1(Vdbe *p, int a
29d0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
29e0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
29f0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
2a00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
2a10: 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  Op>addr ){.    p
2a20: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d  ->aOp[addr].p1 =
2a30: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2a40: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2a50: 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70  lue of the P2 op
2a60: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2a70: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2a80: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2a90: 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20  e is useful for 
2aa0: 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64  setting a jump d
2ab0: 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  estination..*/.v
2ac0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2ad0: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
2ae0: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2af0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2b00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2b10: 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66   addr>=0 );.  if
2b20: 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b  ( p->nOp>addr ){
2b30: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
2b40: 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p2 = val;.  }.
2b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2b60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2b70: 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P3 operand for 
2b80: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
2b90: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
2ba0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2bb0: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP3(Vdbe *p, int
2bc0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2bd0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
2be0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
2bf0: 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  r>=0 );.  if( p-
2c00: 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20  >nOp>addr ){.   
2c10: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33   p->aOp[addr].p3
2c20: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2c30: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2c40: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20  value of the P5 
2c50: 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20  operand for the 
2c60: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a  most recently.**
2c70: 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e   added operation
2c80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2c90: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
2ca0: 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a  be *p, u8 val){.
2cb0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
2cc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29  ;.  if( p->aOp )
2cd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
2ce0: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d  >nOp>0 );.    p-
2cf0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
2d00: 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  5 = val;.  }.}..
2d10: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2d20: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
2d30: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
2d40: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2d50: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
2d60: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
2d70: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
2d80: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
2d90: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2da0: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
2db0: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
2dc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
2dd0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
2de0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
2df0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
2e00: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
2e10: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
2e20: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
2e30: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
2e40: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
2e50: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
2e60: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
2e70: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
2e80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
2e90: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
2ea0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
2eb0: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
2ec0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
2ed0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
2ee0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2ef0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pDef);.  }.}../
2f00: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
2f10: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
2f20: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2f30: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
2f40: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
2f50: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
2f60: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 73   if( p4 ){.    s
2f70: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
2f80: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
2f90: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
2fa0: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
2fb0: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
2fc0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
2fd0: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
2fe0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20  se P4_KEYINFO:. 
2ff0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
3000: 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73  ARRAY:.      cas
3010: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  e P4_KEYINFO_HAN
3020: 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  DOFF: {.        
3030: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3040: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  , p4);.        b
3050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3060: 20 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45      case P4_VDBE
3070: 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20  FUNC: {.        
3080: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
3090: 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20  unc = (VdbeFunc 
30a0: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72  *)p4;.        fr
30b0: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
30c0: 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e  ion(db, pVdbeFun
30d0: 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  c->pFunc);.     
30e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
30f0: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
3100: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
3110: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3120: 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b  (db, pVdbeFunc);
3130: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3150: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
3160: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3170: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
3180: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
3190: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
31a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
31b0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
31c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
31d0: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
31e0: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
31f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3200: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
3210: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20  ./*.** Change N 
3220: 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67  opcodes starting
3230: 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f   at addr to No-o
3240: 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ps..*/.void sqli
3250: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
3260: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
3270: 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20   addr, int N){. 
3280: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
3290: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
32a0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
32b0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
32c0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69  = p->db;.    whi
32d0: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20  le( N-- ){.     
32e0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
32f0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
3300: 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  .p);.      memse
3310: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
3320: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20  (pOp[0]));.     
3330: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
3340: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f  P_Noop;.      pO
3350: 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p++;.    }.  }.}
3360: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3370: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3380: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
3390: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
33a0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
33b0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
33c0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
33d0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
33e0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
33f0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3400: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3410: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3420: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3430: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3440: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
3450: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
3460: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
3470: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
3480: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
3490: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
34a0: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
34b0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
34c0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
34d0: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
34e0: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
34f0: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
3500: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
3510: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
3520: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
3530: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
3540: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
3550: 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45  *.** If n==P4_KE
3560: 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74  YINFO it means t
3570: 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69  hat zP4 is a poi
3580: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
3590: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  o structure..** 
35a0: 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
35b0: 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  f the KeyInfo st
35c0: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d  ructure into mem
35d0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
35e0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
35f0: 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64  loc, to be freed
3600: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
3610: 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  s finalized..** 
3620: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P4_KEYINFO_HA
3630: 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20  NDOFF indicates 
3640: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20  that zP4 points 
3650: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
3660: 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64  ucture.** stored
3670: 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   in memory that 
3680: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
3690: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
36a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65  ite3_malloc. The
36b0: 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75   .** caller shou
36c0: 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20  ld not free the 
36d0: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77  allocation, it w
36e0: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65  ill be freed whe
36f0: 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a  n the Vdbe is.**
3700: 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a   finalized..** .
3710: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
3720: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
3730: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
3740: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
3750: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
3760: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
3770: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
3780: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
3790: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
37a0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
37b0: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
37c0: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
37d0: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
37e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
37f0: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
3800: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
3810: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
3820: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
3830: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3840: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
3850: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
3860: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
3870: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
3880: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
3890: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
38a0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
38b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
38c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
38d0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
38e0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
38f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
3900: 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e  f (n != P4_KEYIN
3910: 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  FO) {.      free
3920: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
3930: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
3940: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
3950: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3960: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
3970: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
3980: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
3990: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
39a0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
39b0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
39c0: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
39d0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
39e0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
39f0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
3a00: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
3a10: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
3a20: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
3a30: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
3a40: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
3a50: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
3a60: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
3a70: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
3a80: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
3a90: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
3aa0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
3ab0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
3ac0: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
3ad0: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
3ae0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3af0: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
3b00: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3b10: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
3b20: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
3b30: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
3b40: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
3b50: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
3b60: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
3b70: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
3b80: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
3b90: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
3ba0: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
3bb0: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
3bc0: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
3bd0: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
3be0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nfo = sqlite3Mal
3bf0: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
3c00: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
3c10: 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
3c20: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
3c30: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f  ){.      u8 *aSo
3c40: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d  rtOrder;.      m
3c50: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20  emcpy(pKeyInfo, 
3c60: 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  zP4, nByte);.   
3c70: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
3c80: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3c90: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
3ca0: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
3cb0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
3cc0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
3cd0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
3ce0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
3cf0: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
3d00: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
3d10: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
3d20: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
3d30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3d40: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d50: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
3d60: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
3d70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
3d80: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
3d90: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3da0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
3db0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
3dc0: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
3dd0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
3de0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
3df0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
3e00: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3e10: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3e20: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
3e30: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
3e40: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
3e50: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
3e60: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
3e70: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
3e80: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
3e90: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
3ea0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
3eb0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
3ec0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3ed0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3ee0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3ef0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3f00: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
3f10: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3f20: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
3f30: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
3f40: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
3f50: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
3f60: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
3f70: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
3f80: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
3f90: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
3fa0: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
3fb0: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
3fc0: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
3fd0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
3fe0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ff0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
4000: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4010: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
4020: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
4030: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
4040: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
4050: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
4060: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
4070: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
4080: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
4090: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
40a0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
40b0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
40c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
40d0: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
40e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
40f0: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
4100: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
4110: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
4120: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
4130: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
4140: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
4150: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
4160: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
4170: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
4180: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
4190: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
41a0: 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65  ist ap;.  sqlite
41b0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
41c0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72  P_Noop);.  asser
41d0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
41e0: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
41f0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
4200: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
4210: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
4220: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
4230: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
4240: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
4250: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
4260: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4270: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
4280: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
4290: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
42a0: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
42b0: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
42c0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
42d0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
42e0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
42f0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
4300: 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
4310: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f   Return the opco
4320: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61  de for a given a
4330: 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20  ddress.  If the 
4340: 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74  address is -1, t
4350: 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  hen.** return th
4360: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
4370: 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e  inserted opcode.
4380: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
4390: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
43a0: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
43b0: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61   prior to the ca
43c0: 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a  lling of this.**
43d0: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61   routine, then a
43e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75   pointer to a du
43f0: 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20  mmy VdbeOp will 
4400: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  be returned.  Th
4410: 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20  at opcode.** is 
4420: 72 65 61 64 61 62 6c 65 20 61 6e 64 20 77 72 69  readable and wri
4430: 74 61 62 6c 65 2c 20 62 75 74 20 69 74 20 68 61  table, but it ha
4440: 73 20 6e 6f 20 65 66 66 65 63 74 2e 20 20 54 68  s no effect.  Th
4450: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
4460: 6d 6d 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6c  mmy.** opcode al
4470: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
4480: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
4490: 6f 6e 69 6e 67 20 61 66 74 65 72 20 61 20 4f 4f  oning after a OO
44a0: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 0a  M fault without.
44b0: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ** having to che
44c0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
44d0: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
44e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
44f0: 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
4500: 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69  .** About the #i
4510: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4520: 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c  _TRACE:  Normall
4530: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
4540: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a  is never called.
4550: 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70  ** unless p->nOp
4560: 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63  >0.  This is bec
4570: 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65  ause in the abse
4580: 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  nse of SQLITE_OM
4590: 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20  IT_TRACE,.** an 
45a0: 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63  OP_Trace instruc
45b0: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
45c0: 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74  nserted by sqlit
45d0: 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73  e3VdbeGet() as s
45e0: 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20  oon as.** a new 
45f0: 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e  VDBE is created.
4600: 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65    So we are free
4610: 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20   to set addr to 
4620: 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74  p->nOp-1 without
4630: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f  .** having to do
4640: 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61  uble-check to ma
4650: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
4660: 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e   result is non-n
4670: 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20  egative. But.** 
4680: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  if SQLITE_OMIT_T
4690: 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c  RACE is defined,
46a0: 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73   the OP_Trace is
46b0: 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20   omitted and we 
46c0: 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68  do need to.** ch
46d0: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66  eck the value of
46e0: 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65   p->nOp-1 before
46f0: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a   continuing..*/.
4700: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
4710: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
4720: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
4730: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
4740: 6d 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  my;.  assert( p-
4750: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4760: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
4770: 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65   addr<0 ){.#ifde
4780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
4790: 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ACE.    if( p->n
47a0: 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 26  Op==0 ) return &
47b0: 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20  dummy;.#endif.  
47c0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
47d0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
47e0: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
47f0: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
4800: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4810: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
4820: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4830: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  ){.    return &d
4840: 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ummy;.  }else{. 
4850: 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f     return &p->aO
4860: 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a  p[addr];.  }.}..
4870: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4880: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
4890: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
48a0: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
48b0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
48c0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
48d0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
48e0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
48f0: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
4900: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
4910: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
4920: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
4930: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
4940: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
4950: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
4960: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
4970: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
4980: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
4990: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
49a0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
49b0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
49c0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
49d0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
49e0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
49f0: 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65  STATIC:.    case
4a00: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
4a10: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
4a20: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
4a30: 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
4a40: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  .pKeyInfo;.     
4a50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4a60: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4a70: 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b  "keyinfo(%d", pK
4a80: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
4a90: 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74  .      i = sqlit
4aa0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
4ab0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
4ac0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
4ad0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
4ae0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
4af0: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
4b00: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
4b10: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
4b20: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
4b30: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4b40: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
4b50: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e           if( i+n
4b60: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
4b70: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
4b80: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c  zTemp[i],",...",
4b90: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
4ba0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
4bb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65   }.          zTe
4bc0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
4bd0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65           if( pKe
4be0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4bf0: 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  r && pKeyInfo->a
4c00: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a  SortOrder[j] ){.
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
4c20: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
4c30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4c40: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4c50: 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p[i], pColl->zNa
4c60: 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  me,n+1);.       
4c70: 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     i += n;.     
4c80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34     }else if( i+4
4c90: 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  <nTemp-6 ){.    
4ca0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
4cb0: 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29  emp[i],",nil",4)
4cc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
4cd0: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
4ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
4cf0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
4d00: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
4d10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4d20: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
4d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4d40: 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45    case P4_COLLSE
4d50: 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  Q: {.      CollS
4d60: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d  eq *pColl = pOp-
4d70: 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  >p4.pColl;.     
4d80: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4d90: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4da0: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
4db0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
4dc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4dd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4de0: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
4df0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
4e00: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
4e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4e20: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4e30: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
4e40: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
4e50: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
4e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4e70: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
4e80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4e90: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4ea0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  Temp, "%lld", *p
4eb0: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
4ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ed0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
4ee0: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
4ef0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4f00: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
4f10: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
4f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4f30: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
4f40: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4f50: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4f60: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
4f70: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
4f80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4f90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4fa0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
4fb0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
4fc0: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61  p4.pMem;.      a
4fd0: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
4fe0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
4ff0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
5000: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
5010: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
5020: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
5030: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5040: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
5050: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
5060: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
5070: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
5080: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
5090: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
50a0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
50b0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
50d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
50e0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
50f0: 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a  em->r);.      }.
5100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5110: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
5120: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5130: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
5140: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
5150: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
5160: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
5170: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
5180: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
5190: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
51a0: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
51b0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
51c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
51d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
51e0: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
51f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
5200: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
5210: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
5220: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5230: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
5240: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
5250: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
5260: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
5270: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
5280: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
5290: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
52a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
52b0: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
52c0: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
52d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
52e0: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
52f0: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
5300: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
5310: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
5320: 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  *.*/.void sqlite
5330: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
5340: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
5350: 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73    int mask;.  as
5360: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
5370: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
5380: 73 69 7a 65 6f 66 28 75 33 32 29 2a 38 20 29 3b  sizeof(u32)*8 );
5390: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
53a0: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
53b0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61  eMask)*8 );.  ma
53c0: 73 6b 20 3d 20 28 28 75 33 32 29 31 29 3c 3c 69  sk = ((u32)1)<<i
53d0: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65  ;.  if( (p->btre
53e0: 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
53f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65   ){.    p->btree
5400: 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
5410: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
5420: 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26  texArrayInsert(&
5430: 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62  p->aMutex, p->db
5440: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
5450: 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e   }.}...#if defin
5460: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
5470: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
5480: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
5490: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
54a0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
54b0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
54c0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
54d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
54e0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
54f0: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
5500: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
5510: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
5520: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
5530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5540: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
5550: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
5560: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
5570: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
5580: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
5590: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
55a0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
55b0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
55c0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
55d0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
55e0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
55f0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
5600: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
5610: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
5620: 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20  pOp->p5,.#ifdef 
5630: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
5640: 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74     pOp->zComment
5650: 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   ? pOp->zComment
5660: 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20   : "".#else.    
5670: 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b    "".#endif.  );
5680: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
5690: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
56a0: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
56b0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
56c0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
56d0: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
56e0: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
56f0: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
5700: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
5710: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5720: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75  b = p->db;.    u
5730: 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  8 malloc_failed 
5740: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
5750: 65 64 3b 0a 20 20 20 20 66 6f 72 28 70 45 6e 64  ed;.    for(pEnd
5760: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
5770: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  p++){.      asse
5780: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
5790: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
57a0: 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20  1].db );..      
57b0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
57c0: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
57d0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
57e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
57f0: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
5800: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
5810: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
5820: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
5830: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
5840: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
5850: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
5860: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
5870: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
5880: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5890: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
58a0: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
58b0: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
58c0: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
58d0: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
58e0: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
58f0: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
5900: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
5910: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
5920: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
5930: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
5940: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
5950: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
5960: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
5970: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
5980: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
5990: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
59a0: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
59b0: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
59c0: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
59d0: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
59e0: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
59f0: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
5a00: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
5a10: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
5a20: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
5a30: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
5a40: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
5a50: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
5a60: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
5a70: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
5a80: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  /.      if( p->f
5a90: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
5aa0: 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20  M_Dyn) ){.      
5ab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5ac0: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
5ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a    }else if( p->z
5ae0: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
5af0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5b00: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
5b10: 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c  .        p->zMal
5b20: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
5b30: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
5b40: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
5b50: 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f   }.    db->mallo
5b60: 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
5b70: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a  _failed;.  }.}..
5b80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5b90: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
5ba0: 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74  GEMENT.int sqlit
5bb0: 65 33 56 64 62 65 52 65 6c 65 61 73 65 42 75 66  e3VdbeReleaseBuf
5bc0: 66 65 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  fers(Vdbe *p){. 
5bd0: 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e   int ii;.  int n
5be0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Free = 0;.  asse
5bf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5c00: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
5c10: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 69  tex) );.  for(ii
5c20: 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  =1; ii<=p->nMem;
5c30: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20   ii++){.    Mem 
5c40: 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
5c50: 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4d  [ii];.    if( pM
5c60: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
5c70: 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 20 20  RowSet ){.      
5c80: 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65  sqlite3RowSetCle
5c90: 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53  ar(pMem->u.pRowS
5ca0: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
5cb0: 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d  f( pMem->z && pM
5cc0: 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79  em->flags&MEM_Dy
5cd0: 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  n ){.      asser
5ce0: 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29  t( !pMem->xDel )
5cf0: 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d  ;.      nFree +=
5d00: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5d10: 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  Size(pMem->db, p
5d20: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 73  Mem->z);.      s
5d30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
5d40: 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
5d50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
5d60: 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Free;.}.#endif..
5d70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5d80: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
5d90: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
5da0: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
5db0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
5dc0: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
5dd0: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
5de0: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
5df0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
5e00: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
5e10: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
5e20: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
5e30: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
5e40: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
5e50: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
5e60: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
5e70: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
5e80: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
5e90: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
5ea0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
5eb0: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
5ec0: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
5ed0: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
5ee0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
5ef0: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
5f00: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
5f10: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
5f20: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
5f30: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
5f40: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
5f50: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
5f60: 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  LAN..*/.int sqli
5f70: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
5f80: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
5f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5fa0: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  VDBE */.){.  sql
5fb0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5fc0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5fd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5fe0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
5ff0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
6000: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61  p->aMem[1];..  a
6010: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
6020: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
6030: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6040: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
6050: 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d  ert( db->magic==
6060: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
6070: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
6080: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6090: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
60a0: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
60b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
60c0: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
60d0: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
60e0: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
60f0: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
6100: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
6110: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
6120: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
6130: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
6140: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
6150: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
6160: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
6170: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
6180: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
6190: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
61a0: 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  ay(pMem, p->nMem
61b0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  );..  if( p->rc=
61c0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
61d0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
61e0: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
61f0: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
6200: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
6210: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
6220: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
6230: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
6240: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  ed.  */.    db->
6250: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
6260: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
6270: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
6280: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
6290: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
62a0: 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e   i<p->nOp && p->
62b0: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
62c0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
62d0: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
62e0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b  if( i>=p->nOp ){
62f0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
6300: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
6310: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
6320: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
6330: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
6340: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
6350: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
6360: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6370: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
6380: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
6390: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
63a0: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
63b0: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
63c0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
63d0: 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70      Op *pOp = &p
63e0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aOp[i];.    if
63f0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
6400: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
6410: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
6420: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
6430: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
6440: 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  R;.      pMem->u
6450: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
6480: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
6490: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
64a0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
64b0: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
64c0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
64d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
64e0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
64f0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
6500: 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65  ode);  /* Opcode
6510: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
6520: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
6530: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
6540: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6550: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
6560: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
6570: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
6580: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
6590: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
65a0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
65b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
65c0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
65d0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
65e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
65f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
6600: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
6610: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
6620: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
6630: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
6640: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
6650: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
6660: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6680: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
6690: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
66a0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
66b0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
66c0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
66d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
66e0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
66f0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
6700: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70  /* P3 */.      p
6730: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
6740: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
6750: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a    pMem++;.    }.
6760: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
6770: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
6780: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
6790: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
67a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
67b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
67c0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
67d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
67e0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
67f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
6800: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
6810: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
6820: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
6830: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
6840: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
6850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
6860: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
6870: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
6880: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
6890: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
68a0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
68b0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
68c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
68d0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
68e0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
68f0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
6900: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
6910: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
6920: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
6930: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
6940: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6950: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
6960: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
6970: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
6980: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6990: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
69a0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
69b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
69c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
69d0: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
69e0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
69f0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
6a00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6a10: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
6a20: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
6a30: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
6a40: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
6a50: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
6a60: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
6a70: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
6a80: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
6a90: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
6aa0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
6ab0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
6ac0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
6ad0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
6ae0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
6af0: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
6b00: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
6b10: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6b20: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
6b30: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
6b40: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
6b50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
6b60: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
6b70: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
6b80: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
6b90: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
6ba0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
6bd0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
6be0: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
6bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6c00: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
6c10: 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78  n = 8 - 5*(p->ex
6c20: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
6c30: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
6c40: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6c50: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
6c60: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
6c70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
6c80: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
6c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
6ca0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
6cb0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
6cc0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
6cd0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
6ce0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6cf0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
6d00: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
6d10: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
6d20: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
6d30: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
6d40: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
6d50: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
6d60: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
6d70: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
6d80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6d90: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
6da0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
6db0: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
6dc0: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
6dd0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
6de0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
6df0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6e00: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
6e10: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
6e20: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
6e30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
6e40: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
6e50: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
6e60: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
6e70: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
6e80: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
6e90: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
6ea0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
6eb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
6ec0: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
6ed0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
6ee0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
6ef0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
6f00: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
6f10: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
6f20: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
6f30: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
6f40: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
6f50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6f60: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
6f70: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
6f80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
6f90: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
6fa0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
6fb0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
6fc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
6fd0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
6fe0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
6ff0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
7000: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
7010: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
7020: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
7030: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
7040: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
7050: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
7060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
7070: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
7080: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
7090: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
70a0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
70b0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
70c0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
70d0: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
70e0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
70f0: 65 72 2e 20 20 4d 61 6b 65 20 2a 70 70 20 70 6f  er.  Make *pp po
7100: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c  int to the.** al
7110: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 20  located space.  
7120: 28 4e 6f 74 65 3a 20 20 70 70 20 69 73 20 61 20  (Note:  pp is a 
7130: 63 68 61 72 2a 20 72 61 74 68 65 72 20 74 68 61  char* rather tha
7140: 6e 20 61 20 76 6f 69 64 2a 2a 20 74 6f 0a 2a 2a  n a void** to.**
7150: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
7160: 20 70 6f 69 6e 74 65 72 20 61 6c 69 61 73 69 6e   pointer aliasin
7170: 67 20 72 75 6c 65 73 20 6f 66 20 43 2e 29 20 20  g rules of C.)  
7180: 2a 70 70 20 73 68 6f 75 6c 64 20 69 6e 69 74 69  *pp should initi
7190: 61 6c 6c 79 0a 2a 2a 20 62 65 20 7a 65 72 6f 2e  ally.** be zero.
71a0: 20 20 49 66 20 2a 70 70 20 69 73 20 6e 6f 74 20    If *pp is not 
71b0: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
71c0: 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20   that the space 
71d0: 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
71e0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
71f0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
7200: 73 20 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  s a noop..**.** 
7210: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
7220: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7230: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
7240: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
7250: 74 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  t to available s
7260: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
7270: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
7280: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
7290: 62 6c 65 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ble space..**.**
72a0: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
72b0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
72c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
72d0: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
72e0: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
72f0: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
7300: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
7310: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
7320: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
7330: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
7340: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
7350: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
7360: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
7370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7380: 20 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 63   allocSpace(.  c
7390: 68 61 72 20 2a 70 70 2c 20 20 20 20 20 20 20 20  har *pp,        
73a0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
73b0: 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
73c0: 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  to allocated buf
73d0: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
73e0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
73f0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7400: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
7410: 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20    u8 **ppFrom,  
7420: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
7430: 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20  : Allocate from 
7440: 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20  *ppFrom */.  u8 
7450: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
7460: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
7470: 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
7480: 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62  end of *ppFrom b
7490: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
74a0: 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20  pnByte          
74b0: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
74c0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
74d0: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
74e0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
74f0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
7500: 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29  IGNMENT(*ppFrom)
7510: 20 29 3b 0a 20 20 69 66 28 20 28 2a 28 76 6f 69   );.  if( (*(voi
7520: 64 2a 2a 29 70 70 29 3d 3d 30 20 29 7b 0a 20 20  d**)pp)==0 ){.  
7530: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
7540: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
7550: 20 28 70 45 6e 64 20 2d 20 2a 70 70 46 72 6f 6d   (pEnd - *ppFrom
7560: 29 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  )>=nByte ){.    
7570: 20 20 2a 28 76 6f 69 64 2a 2a 29 70 70 20 3d 20    *(void**)pp = 
7580: 28 76 6f 69 64 20 2a 29 2a 70 70 46 72 6f 6d 3b  (void *)*ppFrom;
7590: 0a 20 20 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b  .      *ppFrom +
75a0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 65 6c  = nByte;.    }el
75b0: 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 42 79 74  se{.      *pnByt
75c0: 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  e += nByte;.    
75d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
75e0: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
75f0: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
7600: 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e  cution.  This in
7610: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
7620: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
7630: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
7640: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
7650: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
7660: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
7670: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
7680: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
7690: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
76a0: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
76b0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
76c0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
76d0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
76e0: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20  y way to move a 
76f0: 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d  VDBE from VDBE_M
7700: 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20  AGIC_INIT to.** 
7710: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a  VDBE_MAGIC_RUN..
7720: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
7730: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
7740: 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
7750: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69 72   on a single vir
7760: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
7770: 20 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   The first call 
7780: 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63 6f  is made while co
7790: 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20  mpiling the SQL 
77a0: 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73 65  statement. Subse
77b0: 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61  quent.** calls a
77c0: 72 65 20 6d 61 64 65 20 61 73 20 70 61 72 74 20  re made as part 
77d0: 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  of the process o
77e0: 66 20 72 65 73 65 74 74 69 6e 67 20 61 20 73 74  f resetting a st
77f0: 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a  atement to be.**
7800: 20 72 65 2d 65 78 65 63 75 74 65 64 20 28 66 72   re-executed (fr
7810: 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  om a call to sql
7820: 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20 54  ite3_reset()). T
7830: 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e  he nVar, nMem, n
7840: 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69  Cursor .** and i
7850: 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65 74  sExplain paramet
7860: 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61 73  ers are only pas
7870: 73 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c 75  sed correct valu
7880: 65 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  es the first tim
7890: 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f  e.** the functio
78a0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20  n is called. On 
78b0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
78c0: 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72  , from sqlite3_r
78d0: 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20  eset(), nVar.** 
78e0: 69 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e 64  is passed -1 and
78f0: 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61   nMem, nCursor a
7900: 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72 65  nd isExplain are
7910: 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72 6f   all passed zero
7920: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7930: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
7940: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
7970: 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20    int nVar,     
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f   /* Number of '?
79a0: 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c  ' see in the SQL
79b0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
79c0: 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20  int nMem,       
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  * Number of memo
79f0: 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f  ry cells to allo
7a00: 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  cate */.  int nC
7a10: 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20  ursor,          
7a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7a30: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f  er of cursors to
7a40: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
7a50: 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20  nt isExplain    
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a70: 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50   True if the EXP
7a80: 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73  LAIN keywords is
7a90: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20   present */.){. 
7aa0: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
7ab0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
7ac0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
7ad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
7ae0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
7af0: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
7b00: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
7b10: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
7b20: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
7b30: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
7b40: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
7b50: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
7b60: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
7b70: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
7b80: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
7b90: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
7ba0: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
7bb0: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
7bc0: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
7bd0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
7be0: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
7bf0: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
7c00: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
7c10: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
7c20: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
7c30: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
7c40: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
7c50: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
7c60: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
7c70: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
7c80: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
7c90: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
7ca0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
7cb0: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
7cc0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
7cd0: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
7ce0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
7cf0: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
7d00: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
7d10: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
7d20: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
7d30: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
7d40: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
7d50: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
7d60: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
7d70: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7d80: 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
7d90: 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20   registers, SQL 
7da0: 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20  variables, VDBE 
7db0: 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a  cursors and .  *
7dc0: 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * an array to ma
7dd0: 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69  rshal SQL functi
7de0: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e  on arguments in.
7df0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f   This is only do
7e00: 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  ne the.  ** firs
7e10: 74 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63  t time this func
7e20: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
7e30: 6f 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c  or a given VDBE,
7e40: 20 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a   not when it is.
7e50: 20 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65    ** being calle
7e60: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72  d from sqlite3_r
7e70: 65 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20  eset() to reset 
7e80: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
7e90: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
7ea0: 6e 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59  nVar>=0 && ALWAY
7eb0: 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  S(db->mallocFail
7ec0: 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38  ed==0) ){.    u8
7ed0: 20 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26   *zCsr = (u8 *)&
7ee0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a  p->aOp[p->nOp];.
7ef0: 20 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28      u8 *zEnd = (
7f00: 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e  u8 *)&p->aOp[p->
7f10: 6e 4f 70 41 6c 6c 6f 63 5d 3b 0a 20 20 20 20 69  nOpAlloc];.    i
7f20: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 6e  nt nByte;.    in
7f30: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a  t nArg;       /*
7f40: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
7f50: 6f 66 20 61 72 67 73 20 70 61 73 73 65 64 20 74  of args passed t
7f60: 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  o a user functio
7f70: 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76  n. */.    resolv
7f80: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
7f90: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45  rg);.    if( isE
7fa0: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
7fb0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 6d 20  0 ){.      nMem 
7fc0: 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = 10;.    }.    
7fd0: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
7fe0: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20 20 61  (u8*)0)&7;.    a
7ff0: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
8000: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
8010: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 6e  ) );.    if( zEn
8020: 64 3c 7a 43 73 72 20 29 20 7a 45 6e 64 20 3d 20  d<zCsr ) zEnd = 
8030: 7a 43 73 72 3b 0a 0a 20 20 20 20 64 6f 20 7b 0a  zCsr;..    do {.
8040: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73        memset(zCs
8050: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
8060: 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  ;.      nByte = 
8070: 30 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70  0;.      allocSp
8080: 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61  ace((char*)&p->a
8090: 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
80a0: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
80b0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
80c0: 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63     allocSpace((c
80d0: 68 61 72 2a 29 26 70 2d 3e 61 56 61 72 2c 20 6e  har*)&p->aVar, n
80e0: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Var*sizeof(Mem),
80f0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
8100: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c  Byte);.      all
8110: 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26  ocSpace((char*)&
8120: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
8130: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
8140: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
8150: 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70  );.      allocSp
8160: 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61  ace((char*)&p->a
8170: 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  zVar, nVar*sizeo
8180: 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c  f(char*), &zCsr,
8190: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
81a0: 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65        allocSpace
81b0: 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 70 43 73  ((char*)&p->apCs
81c0: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
81d0: 20 20 20 20 20 6e 43 75 72 73 6f 72 2a 73 69 7a       nCursor*siz
81e0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
81f0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
8200: 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20  nByte.      );. 
8210: 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29       if( nByte )
8220: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46 72  {.        p->pFr
8230: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
8240: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74  llocRaw(db, nByt
8250: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
8260: 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65    zCsr = p->pFre
8270: 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  e;.      zEnd = 
8280: 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20  &zCsr[nByte];.  
8290: 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20    }while( nByte 
82a0: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
82b0: 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70 2d 3e  iled );..    p->
82c0: 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e  nCursor = (u16)n
82d0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
82e0: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20  p->aVar ){.     
82f0: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 75 31 36 29   p->nVar = (u16)
8300: 6e 56 61 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  nVar;.      for(
8310: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
8320: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  ){.        p->aV
8330: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
8340: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
8350: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20  p->aVar[n].db = 
8360: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
8370: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65  }.    if( p->aMe
8380: 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  m ){.      p->aM
8390: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
83a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
83b0: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
83c0: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  ..nMem */.      
83d0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
8400: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
8410: 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c       for(n=1; n<
8420: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
8430: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
8440: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
8450: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  ;.        p->aMe
8460: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
8470: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8480: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8490: 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  BUG.  for(n=1; n
84a0: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
84b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
84c0: 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b  Mem[n].db==db );
84d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
84e0: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
84f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8500: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
8510: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
8520: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
8530: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
8540: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
8550: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
8560: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
8570: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
8580: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
8590: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
85a0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69  tatement = 0;.#i
85b0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
85c0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
85d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
85e0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
85f0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
8600: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
8610: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
8620: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
8630: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
8640: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
8650: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
8660: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
8670: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
8680: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
8690: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
86a0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
86b0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
86c0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
86d0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
86e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
86f0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
8700: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
8710: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
8720: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
8730: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
8740: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
8750: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
8760: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c  y.    ** the cal
8770: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65  l above. */.  }e
8780: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75  lse if( pCx->pCu
8790: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
87a0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
87b0: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
87c0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
87d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
87e0: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
87f0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
8800: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
8810: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
8820: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
8830: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
8840: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
8850: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
8860: 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  Cx->pModule;.   
8870: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
8880: 20 3d 20 31 3b 0a 20 20 20 20 28 76 6f 69 64 29   = 1;.    (void)
8890: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
88a0: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f  (p->db);.    pMo
88b0: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
88c0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 28  abCursor);.    (
88d0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
88e0: 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20  tyOn(p->db);.   
88f0: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
8900: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
8910: 0a 20 20 69 66 28 20 21 70 43 78 2d 3e 65 70 68  .  if( !pCx->eph
8920: 65 6d 50 73 65 75 64 6f 54 61 62 6c 65 20 29 7b  emPseudoTable ){
8930: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8940: 65 65 28 70 2d 3e 64 62 2c 20 70 43 78 2d 3e 70  ee(p->db, pCx->p
8950: 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Data);.  }.}../*
8960: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
8970: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
8980: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
8990: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
89a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
89b0: 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74  ->apCsr==0 ) ret
89c0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
89d0: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
89e0: 2b 29 7b 0a 20 20 20 20 56 64 62 65 43 75 72 73  +){.    VdbeCurs
89f0: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
8a00: 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43  r[i];.    if( pC
8a10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8a20: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
8a30: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d  p, pC);.      p-
8a40: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
8a50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8a60: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
8a70: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
8a80: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
8a90: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
8aa0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
8ab0: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
8ac0: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
8ad0: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
8ae0: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
8af0: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
8b00: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
8b10: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
8b20: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
8b30: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
8b40: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  p(Vdbe *p){.  in
8b50: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
8b60: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 4d 65  db = p->db;.  Me
8b70: 6d 20 2a 70 4d 65 6d 3b 0a 20 20 63 6c 6f 73 65  m *pMem;.  close
8b80: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
8b90: 20 66 6f 72 28 70 4d 65 6d 3d 26 70 2d 3e 61 4d   for(pMem=&p->aM
8ba0: 65 6d 5b 31 5d 2c 20 69 3d 31 3b 20 69 3c 3d 70  em[1], i=1; i<=p
8bb0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 2c 20 70 4d 65  ->nMem; i++, pMe
8bc0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  m++){.    if( pM
8bd0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
8be0: 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 20 20  RowSet ){.      
8bf0: 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65  sqlite3RowSetCle
8c00: 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53  ar(pMem->u.pRowS
8c10: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4d  et);.    }.    M
8c20: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d  emSetTypeFlag(pM
8c30: 65 6d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  em, MEM_Null);. 
8c40: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
8c50: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
8c60: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 69 66  , p->nMem);.  if
8c70: 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  ( p->contextStac
8c80: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
8c90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 63 6f  DbFree(db, p->co
8ca0: 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d  ntextStack);.  }
8cb0: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
8cc0: 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e  ck = 0;.  p->con
8cd0: 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d  textStackDepth =
8ce0: 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74   0;.  p->context
8cf0: 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20  StackTop = 0;.  
8d00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8d10: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
8d20: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
8d30: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
8d40: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
8d50: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
8d60: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
8d70: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
8d80: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
8d90: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
8da0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
8db0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
8dc0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
8dd0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
8de0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
8df0: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
8e00: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
8e10: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
8e20: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
8e30: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
8e40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
8e50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8e60: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
8e70: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
8e80: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
8e90: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
8ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8eb0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
8ec0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
8ed0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
8ee0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
8ef0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8f00: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
8f10: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
8f20: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
8f30: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
8f40: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
8f50: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
8f60: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
8f70: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
8f80: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
8f90: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
8fa0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
8fb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
8fc0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
8fd0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
8fe0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
8ff0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
9000: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
9010: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
9020: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9030: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
9040: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
9050: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
9060: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
9070: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
9080: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
9090: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
90a0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
90b0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
90c0: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
90d0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
90e0: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
90f0: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
9100: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
9110: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
9120: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
9130: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
9140: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
9150: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
9160: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
9170: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
9180: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
9190: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
91a0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
91b0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
91c0: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
91d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
91e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
91f0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
9220: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
9230: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9250: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
9260: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
9270: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
92a0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
92b0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
92c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
92d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
92e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
92f0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
9300: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
9310: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
9320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9330: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
9340: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
9350: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
9360: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
9370: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
9380: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
9390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
93a0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
93b0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
93c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
93d0: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
93e0: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
93f0: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
9400: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9410: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
9420: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
9430: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
9440: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
9450: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
9460: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
9470: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
9480: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
9490: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
94a0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
94b0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
94c0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
94d0: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
94e0: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
94f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9500: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
9510: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
9520: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
9530: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
9540: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
9550: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
9560: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
9570: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
9580: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
9590: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
95a0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
95b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
95c0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
95d0: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
95e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
95f0: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
9600: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
9610: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
9620: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
9630: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
9640: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
9650: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
9660: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
9670: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
9680: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9690: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
96a0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
96b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
96c0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
96d0: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
96e0: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
96f0: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
9700: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
9710: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
9720: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
9730: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
9740: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
9750: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
9760: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
9770: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
9780: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
9790: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
97a0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
97b0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
97c0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
97d0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
97e0: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
97f0: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
9800: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
9810: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
9820: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
9830: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
9840: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
9850: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
9860: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
9870: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
9880: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
9890: 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e  tabSync(db, &p->
98a0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
98b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
98c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
98d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
98e0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
98f0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
9900: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
9910: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
9920: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
9930: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
9940: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
9950: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
9960: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
9970: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
9980: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
9990: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
99a0: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
99b0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
99c0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
99d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
99e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
99f0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
9a00: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
9a10: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
9a20: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
9a30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
9a40: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
9a50: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
9a60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
9a70: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
9a80: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
9a90: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
9aa0: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
9ab0: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
9ac0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
9ad0: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
9ae0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
9af0: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
9b00: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
9b10: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
9b20: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
9b30: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76  llback ){.    (v
9b40: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
9b50: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
9b60: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
9b70: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
9b80: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
9b90: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
9ba0: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
9bb0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
9bc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
9bd0: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
9be0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
9bf0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
9c00: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
9c10: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
9c20: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
9c30: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
9c40: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
9c50: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
9c60: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
9c70: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
9c80: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
9c90: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
9ca0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
9cb0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
9cc0: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
9cd0: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
9ce0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
9cf0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
9d00: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
9d10: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
9d20: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
9d30: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
9d40: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
9d50: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
9d60: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
9d70: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
9d80: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
9d90: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
9da0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
9db0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
9dc0: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
9dd0: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
9de0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
9df0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
9e00: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
9e10: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
9e20: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
9e30: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
9e40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9e50: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9e60: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
9e70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9e80: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
9e90: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
9ea0: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
9eb0: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
9ec0: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
9ed0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
9ee0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
9ef0: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
9f00: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
9f10: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
9f20: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
9f30: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
9f40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
9f50: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
9f60: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
9f70: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
9f80: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
9f90: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
9fa0: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
9fb0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
9fc0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
9fd0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
9fe0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
9ff0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
a000: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
a010: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
a020: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
a030: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
a040: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
a050: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
a060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a070: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
a080: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
a090: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
a0a0: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
a0b0: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
a0c0: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
a0d0: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
a0e0: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
a0f0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a100: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
a110: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
a120: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
a130: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
a140: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a150: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
a160: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
a170: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
a180: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
a190: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
a1a0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
a1b0: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
a1c0: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
a1d0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
a1e0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
a1f0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
a200: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
a210: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
a220: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
a230: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
a240: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
a250: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
a260: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
a270: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a280: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
a290: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
a2a0: 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
a2b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a2c0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
a2d0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
a2e0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
a2f0: 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
a300: 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  .      zMaster =
a310: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a320: 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c  db, "%s-mj%08X",
a330: 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61 6e   zMainFile, iRan
a340: 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b  dom&0x7fffffff);
a350: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
a360: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ter ){.        r
a370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a380: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
a390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a3a0: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
a3b0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
a3c0: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
a3d0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
a3e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a3f0: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
a400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a410: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
a420: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a430: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
a440: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
a450: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
a460: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
a470: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
a480: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
a490: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
a4a0: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
a4b0: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
a4c0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
a4d0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
a4e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
a4f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
a510: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a520: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
a530: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
a540: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
a550: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
a560: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
a570: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
a580: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
a590: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
a5a0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
a5b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
a5c0: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
a5d0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
a5e0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
a5f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
a600: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
a610: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
a620: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
a630: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
a640: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
a650: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
a660: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
a670: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
a680: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
a690: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
a6a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
a6b0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
a6c0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
a6d0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
a6e0: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20       if( i==1 ) 
a6f0: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49  continue;   /* I
a700: 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64  gnore the TEMP d
a710: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
a720: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
a730: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
a740: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
a750: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
a760: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
a770: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
a780: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
a790: 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  e[0]==0 ) contin
a7a0: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a  ue;  /* Ignore :
a7b0: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
a7c0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
a7d0: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
a7e0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
a7f0: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
a800: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
a810: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
a820: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
a830: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
a840: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
a850: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
a860: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
a870: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
a880: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
a890: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
a8a0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a8b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a8c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a8d0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
a8e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a8f0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
a900: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
a910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
a920: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
a930: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
a940: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
a950: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
a960: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
a970: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a980: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
a990: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
a9a0: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
a9b0: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
a9c0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
a9d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
a9e0: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
a9f0: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
aa00: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
aa10: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
aa20: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
aa30: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
aa40: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
aa50: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
aa60: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
aa70: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
aa80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
aa90: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
aaa0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
aab0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
aac0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
aad0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
aae0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
aaf0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ab00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
ab10: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
ab20: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
ab30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
ab40: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
ab50: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
ab60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
ab70: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
ab80: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
ab90: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
aba0: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
abb0: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
abc0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
abd0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
abe0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
abf0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
ac00: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
ac10: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
ac20: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
ac30: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
ac40: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
ac50: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
ac60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ac70: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
ac80: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
ac90: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
aca0: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
acb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
acc0: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
acd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
ace0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
acf0: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
ad00: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
ad10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
ad20: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
ad30: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
ad40: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
ad50: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
ad60: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
ad70: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
ad80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ad90: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
ada0: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
adb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
adc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
add0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
ade0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
adf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ae00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ae10: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
ae20: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ae30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
ae40: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
ae50: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
ae60: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
ae70: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
ae80: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
ae90: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
aea0: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
aeb0: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
aec0: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
aed0: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
aee0: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
aef0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
af00: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
af10: 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
af20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
af30: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
af40: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
af50: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
af60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
af70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
af80: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
af90: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
afa0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
afb0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
afc0: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
afd0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
afe0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
aff0: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
b000: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
b010: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
b020: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
b030: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
b040: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
b050: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
b060: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
b070: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
b080: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
b090: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
b0a0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
b0b0: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
b0c0: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
b0d0: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
b0e0: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
b0f0: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
b100: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
b110: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
b120: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
b130: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
b140: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
b150: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
b160: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
b170: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
b180: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
b190: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
b1a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
b1b0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
b1c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b1d0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
b1e0: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
b1f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
b200: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
b210: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
b220: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
b230: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
b240: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
b250: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
b260: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b270: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
b280: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
b290: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
b2a0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
b2b0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
b2c0: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
b2d0: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
b2e0: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
b2f0: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
b300: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
b310: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
b320: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
b330: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
b340: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
b350: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
b360: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
b370: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
b380: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
b390: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
b3a0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
b3b0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
b3c0: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
b3d0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
b3e0: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
b3f0: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
b400: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
b410: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
b420: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
b430: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
b440: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
b450: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
b460: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
b470: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
b480: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
b490: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
b4a0: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
b4b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
b4c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
b4d0: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
b4e0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
b4f0: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
b500: 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  e==db->writeVdbe
b510: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
b520: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
b530: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
b540: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65  dif../*.** For e
b550: 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20  very Btree that 
b560: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
b570: 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20  ection db which 
b580: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  .** has been mod
b590: 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72  ified, "trip" or
b5a0: 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68   invalidate each
b5b0: 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68   cursor in.** th
b5c0: 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68  at Btree might h
b5d0: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
b5e0: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75  d so that the cu
b5f0: 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65  rsor.** can neve
b600: 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e  r be used again.
b610: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
b620: 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hen a rollback.*
b630: 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68  ** occurs.  We h
b640: 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20  ave to trip all 
b650: 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  the other cursor
b660: 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f  s, even.** curso
b670: 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73  r from other VMs
b680: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61   in different da
b690: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b6a0: 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e  ns,.** so that n
b6b0: 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20  one of them try 
b6c0: 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20  to use the data 
b6d0: 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  at which they.**
b6e0: 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61   were pointing a
b6f0: 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79  nd which now may
b700: 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67   have been chang
b710: 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65  ed due.** to the
b720: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
b730: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61   Remember that a
b740: 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   rollback can de
b750: 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70  lete tables comp
b760: 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72  lete and.** reor
b770: 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20  der rootpages.  
b780: 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  So it is not suf
b790: 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20  ficient just to 
b7a0: 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74  save.** the stat
b7b0: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
b7c0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
b7d0: 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
b7e0: 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  or.** so that it
b7f0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
b800: 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gain..*/.static 
b810: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
b820: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
b830: 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a  Btrees(sqlite3 *
b840: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
b850: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
b860: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
b870: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
b880: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
b890: 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72   p && sqlite3Btr
b8a0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
b8b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
b8c0: 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
b8d0: 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f  rs(p, SQLITE_ABO
b8e0: 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  RT);.    }.  }.}
b8f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
b900: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
b910: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b920: 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
b930: 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
b940: 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
b950: 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
b960: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
b970: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
b980: 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
b990: 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
b9a0: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
b9b0: 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
b9c0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
b9d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
b9e0: 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
b9f0: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
ba00: 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
ba10: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
ba20: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
ba30: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
ba40: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
ba50: 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
ba60: 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
ba70: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
ba80: 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
ba90: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
baa0: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
bab0: 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
bac0: 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
bad0: 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
bae0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
baf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
bb00: 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
bb10: 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
bb20: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
bb30: 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
bb40: 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
bb50: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
bb60: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
bb70: 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
bb80: 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
bb90: 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
bba0: 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
bbb0: 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e   occured, causin
bbc0: 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
bbd0: 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
bbe0: 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
bbf0: 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
bc00: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
bc10: 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
bc20: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
bc30: 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
bc40: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
bc50: 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
bc60: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
bc70: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
bc80: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
bc90: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
bca0: 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
bcb0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
bcc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
bcd0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
bce0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
bcf0: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
bd00: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
bd10: 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
bd20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bd30: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
bd40: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
bd50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
bd60: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
bd70: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
bd80: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
bd90: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
bda0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
bdb0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
bdc0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
bdd0: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
bde0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
bdf0: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
be00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
be10: 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
be20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
be30: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
be40: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
be50: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
be60: 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
be70: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
be80: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
be90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bea0: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
beb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bec0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
bed0: 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
bee0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
bef0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
bf00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
bf10: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
bf20: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
bf30: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
bf40: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
bf50: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
bf60: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
bf70: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
bf80: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
bf90: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
bfa0: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
bfb0: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
bfc0: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
bfd0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
bfe0: 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73 65 74  ing so it.** set
bff0: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
c000: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
c010: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
c020: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
c030: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
c040: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
c050: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
c060: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
c070: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
c080: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
c090: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
c0a0: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
c0b0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
c0c0: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
c0d0: 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69 73 20  eeEnterAll() is 
c0e0: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
c0f0: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
c100: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
c110: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
c120: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
c130: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
c140: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
c150: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c160: 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f 75 72   the VM. Of cour
c170: 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73 65 74  se only a subset
c180: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
c190: 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ures.** will be 
c1a0: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
c1b0: 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75 6c 64  VM, and we could
c1c0: 20 75 73 65 20 56 64 62 65 2e 62 74 72 65 65 4d   use Vdbe.btreeM
c1d0: 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a 2a 2a  ask to figure.**
c1e0: 20 74 68 61 74 20 73 75 62 73 65 74 20 6f 75 74   that subset out
c1f0: 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e  , but there is n
c200: 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 64  o advantage to d
c210: 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49  oing so..**.** I
c220: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
c230: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
c240: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
c250: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
c260: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
c270: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
c280: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c290: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
c2a0: 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  CHE.void sqlite3
c2b0: 56 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e  VdbeMutexArrayEn
c2c0: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ter(Vdbe *p){.#i
c2d0: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
c2e0: 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42 74 72  AFE.  sqlite3Btr
c2f0: 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65  eeMutexArrayEnte
c300: 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 23  r(&p->aMutex);.#
c310: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 42 74  else.  sqlite3Bt
c320: 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d 3e 64  reeEnterAll(p->d
c330: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e  b);.#endif.}.#en
c340: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
c350: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c360: 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
c370: 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
c380: 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
c390: 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
c3a0: 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
c3b0: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
c3c0: 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
c3d0: 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
c3e0: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
c3f0: 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
c400: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
c410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c420: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
c430: 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
c440: 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
c450: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
c460: 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
c470: 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
c480: 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
c490: 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
c4a0: 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
c4b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
c4c0: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
c4d0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
c4e0: 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
c4f0: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
c500: 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
c510: 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
c520: 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
c530: 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
c540: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
c550: 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
c560: 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
c570: 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
c580: 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
c590: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
c5a0: 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
c5b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5d0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
c5e0: 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
c5f0: 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
c600: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
c610: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
c620: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
c630: 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
c640: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
c650: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
c660: 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
c670: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
c680: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
c690: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
c6a0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
c6b0: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
c6c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
c6d0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
c6e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
c6f0: 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
c700: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
c710: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
c720: 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
c730: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
c740: 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
c750: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
c760: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
c770: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
c780: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
c790: 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
c7a0: 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
c7b0: 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
c7c0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
c7d0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
c7e0: 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
c7f0: 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
c800: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
c810: 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
c820: 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
c830: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
c840: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
c850: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c860: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c870: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
c880: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
c890: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
c8a0: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
c8b0: 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
c8c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
c8d0: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
c8e0: 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
c8f0: 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
c900: 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
c910: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
c920: 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  er started */.  
c930: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
c940: 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
c950: 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
c960: 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
c970: 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  */.    int eStat
c980: 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20  ementOp = 0;.   
c990: 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72   int isSpecialEr
c9a0: 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
c9b0: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
c9c0: 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72  f a 'special' er
c9d0: 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c  ror */..    /* L
c9e0: 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75  ock all btrees u
c9f0: 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  sed by the state
ca00: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ment */.    sqli
ca10: 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72 61  te3VdbeMutexArra
ca20: 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  yEnter(p);..    
ca30: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
ca40: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
ca50: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
ca60: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
ca70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
ca80: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc!=SQLITE_IOER
ca90: 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a  R_BLOCKED );  /*
caa0: 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c   This error no l
cab0: 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a  onger exists */.
cac0: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
cad0: 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
cae0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
caf0: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
cb20: 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
cb30: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
cb40: 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
cb50: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
cb60: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
cb70: 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65  as read-only, we
cb80: 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c   need do no roll
cb90: 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68  back at all. Oth
cba0: 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
cbb0: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
cbc0: 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
cbd0: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
cbe0: 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
cbf0: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
cc00: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
cc10: 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
cc20: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
cc30: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
cc40: 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
cc50: 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
cc60: 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
cc70: 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
cc80: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
cc90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cca0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
ccb0: 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
ccc0: 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
ccd0: 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
cce0: 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
ccf0: 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
cd00: 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
cd10: 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
cd20: 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
cd30: 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
cd40: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c  .          inval
cd50: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
cd60: 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
cd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cd80: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
cd90: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
cda0: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
cdb0: 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
cdc0: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
cdd0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
cde0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
cdf0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
ce00: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
ce10: 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
ce20: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
ce30: 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
ce40: 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
ce50: 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
ce60: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
ce70: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
ce80: 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
ce90: 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
cea0: 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
ceb0: 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
cec0: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
ced0: 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
cee0: 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
cef0: 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
cf00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
cf10: 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
cf20: 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
cf30: 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
cf40: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d  ->writeVdbeCnt==
cf50: 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
cf60: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
cf70: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
cf80: 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
cf90: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
cfa0: 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
cfb0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  or) ){.        /
cfc0: 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
cfd0: 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
cfe0: 61 6e 64 20 74 68 65 20 76 64 62 65 20 70 72 6f  and the vdbe pro
cff0: 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20  gram was .      
d000: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
d010: 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
d020: 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  IL' constraint. 
d030: 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
d040: 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mit .        ** 
d050: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
d060: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d070: 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
d080: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
d090: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
d0a0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  USY ){.         
d0b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
d0c0: 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d  exArrayLeave(&p-
d0d0: 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  >aMutex);.      
d0e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d0f0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
d100: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
d110: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d120: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
d130: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d140: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
d150: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d160: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d170: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
d180: 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
d190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d1a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d1b0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
d1c0: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
d1d0: 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
d1e0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
d1f0: 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
d200: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
d210: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d220: 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
d230: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
d240: 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
d250: 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
d260: 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
d270: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
d280: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
d290: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
d2a0: 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
d2b0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
d2c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d2d0: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
d2e0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
d2f0: 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
d300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
d310: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
d320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
d330: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
d340: 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
d350: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
d360: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
d370: 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
d380: 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
d390: 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
d3a0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
d3b0: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
d3c0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
d3d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
d3e0: 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
d3f0: 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
d400: 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
d410: 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
d420: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
d430: 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
d440: 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
d450: 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
d460: 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
d470: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
d480: 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 65  , then set the e
d490: 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  rror.    ** code
d4a0: 20 74 6f 20 74 68 65 20 6e 65 77 20 76 61 6c 75   to the new valu
d4b0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
d4c0: 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
d4d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d4e0: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
d4f0: 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
d500: 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
d510: 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d  f( rc && (p->rc=
d520: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
d530: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >rc==SQLITE_CONS
d540: 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20  TRAINT) ){.     
d550: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
d560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
d570: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
d580: 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  Msg);.        p-
d590: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
d5a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
d5b0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
d5c0: 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
d5d0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
d5e0: 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
d5f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
d600: 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
d610: 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
d620: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
d630: 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
d640: 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
d650: 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
d660: 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
d670: 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
d680: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
d690: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
d6a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
d6b0: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
d6c0: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
d6d0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
d6e0: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
d6f0: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
d700: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
d710: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
d720: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
d730: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
d740: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
d750: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
d760: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
d770: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
d780: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
d790: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
d7a0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
d7b0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
d7c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
d7d0: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
d7e0: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
d7f0: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
d800: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
d810: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
d820: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
d830: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
d840: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
d850: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
d860: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
d870: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
d880: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
d890: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
d8a0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
d8b0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
d8c0: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  nt--;.    if( !p
d8d0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
d8e0: 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62      db->writeVdb
d8f0: 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  eCnt--;.    }.  
d900: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
d910: 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d  tiveVdbeCnt>=db-
d920: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
d930: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
d940: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
d950: 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
d960: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
d970: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
d980: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
d990: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
d9a0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
d9b0: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
d9c0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
d9d0: 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
d9e0: 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
d9f0: 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
da00: 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
da10: 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
da20: 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
da30: 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
da40: 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
da50: 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
da60: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
da70: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
da80: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
da90: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
daa0: 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
dab0: 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
dac0: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69  assert( db->acti
dad0: 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64  veVdbeCnt>0 || d
dae0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
daf0: 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
db00: 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
db10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
db20: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
db30: 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
db40: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
db50: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
db60: 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
db70: 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
db80: 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
db90: 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
dba0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
dbc0: 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
dbd0: 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
dbe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
dbf0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
dc00: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
dc10: 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
dc20: 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
dc30: 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
dc40: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
dc50: 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
dc60: 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
dc70: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
dc80: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
dc90: 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
dca0: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
dcb0: 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
dcc0: 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
dcd0: 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
dce0: 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
dcf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
dd00: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
dd10: 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
dd20: 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
dd30: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
dd40: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
dd50: 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
dd60: 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
dd70: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
dd80: 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
dd90: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
dda0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
ddb0: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
ddc0: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
ddd0: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
dde0: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
ddf0: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
de00: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
de10: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
de20: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
de30: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
de40: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
de50: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
de60: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
de70: 70 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  p);.  (void)sqli
de80: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
de90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
dea0: 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
deb0: 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
dec0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
ded0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
dee0: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
def0: 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
df00: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
df10: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
df20: 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
df30: 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
df40: 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
df50: 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
df60: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
df70: 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
df80: 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
df90: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
dfa0: 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
dfb0: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
dfc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
dfd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
dfe0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
dff0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
e000: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
e010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
e020: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
e030: 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53  ,-1,p->zErrMsg,S
e040: 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54  QLITE_UTF8,SQLIT
e050: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e060: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
e070: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
e080: 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
e090: 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73  = p->rc;.      s
e0a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e0b0: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
e0c0: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
e0d0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
e0e0: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
e0f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
e100: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
e110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
e120: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
e130: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
e140: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
e150: 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
e160: 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
e170: 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
e180: 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
e190: 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
e1a0: 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
e1b0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
e1c0: 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
e1d0: 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
e1e0: 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
e1f0: 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
e200: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
e210: 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
e220: 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
e230: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e240: 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
e250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
e260: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
e270: 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
e280: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
e290: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
e2a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e2b0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
e2c0: 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
e2d0: 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
e2e0: 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
e2f0: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
e300: 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
e310: 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
e320: 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
e330: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
e340: 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
e350: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
e360: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
e370: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
e380: 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
e390: 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
e3a0: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
e3b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
e3c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
e3d0: 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
e3e0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
e3f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
e400: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
e410: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
e420: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
e430: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
e440: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
e450: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
e460: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
e470: 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
e480: 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
e490: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
e4a0: 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
e4b0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
e4c0: 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
e4d0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
e4e0: 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
e4f0: 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
e500: 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
e510: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e520: 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
e530: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
e540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
e550: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
e560: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
e570: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
e580: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74  AGIC_INIT;.  ret
e590: 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
e5a0: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
e5b0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
e5c0: 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
e5d0: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
e5e0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
e5f0: 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
e600: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
e610: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
e620: 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
e630: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
e640: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
e650: 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
e660: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e670: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
e680: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
e690: 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
e6a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
e6b0: 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
e6c0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
e6d0: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
e6e0: 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
e6f0: 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
e700: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
e710: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
e720: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e730: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
e740: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
e750: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
e760: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
e770: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
e780: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
e790: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
e7a0: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
e7b0: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
e7c0: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
e7d0: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
e7e0: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
e7f0: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
e800: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
e810: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
e820: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
e830: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
e840: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
e850: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
e860: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
e870: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
e880: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
e890: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
e8a0: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
e8b0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
e8c0: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75  1 || !(mask&(((u
e8d0: 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70  32)1)<<i))) && p
e8e0: 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
e8f0: 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
e900: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
e910: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
e920: 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
e930: 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
e940: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
e950: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
e960: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
e970: 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
e980: 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
e990: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
e9a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
e9b0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
e9c0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
e9d0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
e9e0: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
e9f0: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
ea00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
ea10: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
ea20: 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
ea30: 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
ea40: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
ea50: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
ea60: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
ea70: 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
ea80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
ea90: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
eaa0: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66   = p->aOp;.    f
eab0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
eac0: 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i++, pOp++){. 
ead0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
eae0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
eaf0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
eb00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
eb10: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
eb20: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
eb30: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
eb40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
eb50: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
eb60: 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
eb70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
eb80: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
eb90: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
eba0: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
ebb0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
ebc0: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
ebd0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
ebe0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
ebf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
ec00: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61  ->zSql);.  p->ma
ec10: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
ec20: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33  _DEAD;.  sqlite3
ec30: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4f  DbFree(db, p->aO
ec40: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
ec50: 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
ec60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
ec70: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
ec80: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
ec90: 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
eca0: 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
ecb0: 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
ecc0: 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
ecd0: 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
ece0: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
ecf0: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
ed00: 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
ed10: 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
ed20: 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
ed30: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
ed40: 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
ed50: 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
ed60: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
ed70: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
ed80: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
ed90: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
eda0: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
edb0: 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
edc0: 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
edd0: 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
ede0: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
edf0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
ee00: 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
ee10: 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
ee20: 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
ee30: 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
ee40: 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
ee50: 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
ee60: 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
ee70: 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
ee80: 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
ee90: 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
eea0: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
eeb0: 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
eec0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
eed0: 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
eee0: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
eef0: 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
ef00: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
ef10: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
ef20: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
ef30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
ef40: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
ef50: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
ef60: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
ef70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
ef80: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
ef90: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
efa0: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
efb0: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
efc0: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
efd0: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
efe0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
eff0: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
f000: 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
f010: 74 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  t;.    p->rowidI
f020: 73 56 61 6c 69 64 20 3d 20 41 4c 57 41 59 53 28  sValid = ALWAYS(
f030: 72 65 73 3d 3d 30 29 20 3f 31 3a 30 3b 0a 20 20  res==0) ?1:0;.  
f040: 20 20 69 66 28 20 4e 45 56 45 52 28 72 65 73 3c    if( NEVER(res<
f050: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  0) ){.      rc =
f060: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
f070: 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72  t(p->pCursor, &r
f080: 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
f090: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
f0a0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
f0b0: 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
f0c0: 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
f0d0: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
f0e0: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
f0f0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
f100: 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
f110: 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  _STALE;.  }else 
f120: 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43  if( ALWAYS(p->pC
f130: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e  ursor) ){.    in
f140: 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20  t hasMoved;.    
f150: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
f160: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
f170: 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ved(p->pCursor, 
f180: 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20  &hasMoved);.    
f190: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
f1a0: 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d  rc;.    if( hasM
f1b0: 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  oved ){.      p-
f1c0: 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
f1d0: 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
f1e0: 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31    p->nullRow = 1
f1f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f200: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f210: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
f220: 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
f230: 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
f240: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
f250: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
f260: 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
f270: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
f280: 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
f290: 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
f2a0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
f2b0: 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
f2c0: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
f2d0: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
f2e0: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
f2f0: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
f300: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
f310: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
f320: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
f330: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
f340: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
f350: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
f360: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
f370: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
f380: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
f390: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
f3a0: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
f3b0: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
f3c0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
f3d0: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
f3e0: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
f3f0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
f400: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
f410: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
f420: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
f430: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
f440: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
f450: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
f460: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
f470: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
f480: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
f490: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
f4a0: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
f4b0: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
f4c0: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
f4d0: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
f4e0: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
f4f0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
f500: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
f510: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
f520: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
f530: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
f540: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
f550: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
f560: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
f570: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
f580: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
f590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
f5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
f5b0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
f5d0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
f5e0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
f600: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
f610: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
f620: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
f630: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
f640: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
f650: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
f680: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
f690: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
f6a0: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
f6b0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
f6c0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
f6f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
f700: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
f720: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
f730: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
f740: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
f750: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
f760: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
f770: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
f790: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
f7a0: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
f7b0: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
f7d0: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
f7e0: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
f7f0: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
f820: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
f830: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
f840: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
f850: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
f860: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
f870: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
f880: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
f890: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
f8a0: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
f8b0: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
f8c0: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
f8d0: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
f8e0: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
f8f0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
f900: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
f910: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
f920: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
f930: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
f940: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
f950: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
f960: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
f970: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
f980: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
f990: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
f9a0: 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
f9b0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
f9c0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
f9d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
f9e0: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
f9f0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
fa00: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
fa10: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
fa20: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
fa30: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
fa40: 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
fa50: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
fa60: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
fa70: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
fa80: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
fa90: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
faa0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
fab0: 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20  +(u32)i;.    }. 
fac0: 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20     u = i<0 ? -i 
fad0: 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  : i;.    if( u<=
fae0: 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  127 ) return 1;.
faf0: 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
fb00: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
fb10: 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
fb20: 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
fb30: 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
fb40: 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
fb50: 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
fb60: 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
fb70: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
fb80: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
fb90: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
fba0: 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
fbb0: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
fbc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
fbd0: 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
fbe0: 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
fbf0: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
fc00: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
fc10: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
fc20: 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
fc30: 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
fc40: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
fc50: 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
fc60: 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
fc70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fc80: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
fc90: 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
fca0: 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
fcb0: 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
fcc0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
fcd0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
fce0: 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
fcf0: 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
fd00: 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
fd10: 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
fd20: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
fd30: 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
fd40: 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
fd50: 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
fd60: 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
fd70: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
fd80: 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
fd90: 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
fda0: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
fdb0: 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
fdc0: 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
fdd0: 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
fde0: 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
fdf0: 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
fe00: 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
fe10: 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
fe20: 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
fe30: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
fe40: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
fe50: 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
fe60: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
fe70: 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
fe80: 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
fe90: 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
fea0: 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
feb0: 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
fec0: 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
fed0: 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
fee0: 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
fef0: 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
ff00: 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
ff10: 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
ff20: 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
ff30: 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
ff40: 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
ff50: 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
ff60: 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
ff70: 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
ff80: 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
ff90: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
ffa0: 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
ffb0: 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
ffc0: 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
ffd0: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
ffe0: 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
fff0: 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
10000 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
10010 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
10020 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
10030 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
10040 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
10050 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
10060 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
10070 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
10080 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
10090 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
100a0 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
100b0 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
100c0 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
100d0 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
100e0 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
100f0 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
10100 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
10110 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
10120 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
10130 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
10140 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
10150 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
10160 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
10170 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
10180 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
10190 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
101a0 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
101b0 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
101c0 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
101d0 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
101e0 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
101f0 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
10200 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
10210 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
10220 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
10230 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
10240 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
10250 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
10260 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
10270 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
10280 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
10290 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
102a0 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
102b0 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
102c0 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
102d0 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
102e0 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
102f0 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
10300 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
10310 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
10320 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
10330 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
10340 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
10350 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
10360 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
10370 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
10380 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
10390 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
103a0 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
103b0 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
103c0 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
103d0 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
103e0 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
103f0 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
10400 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
10410 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
10420 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
10430 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
10440 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
10450 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
10460 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
10470 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
10480 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
10490 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
104a0 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
104b0 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
104c0 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
104d0 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
104e0 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
104f0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
10500 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
10510 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
10520 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
10530 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
10540 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
10550 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
10560 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
10570 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
10580 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
10590 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
105a0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
105b0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
105c0 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
105d0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
105e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
105f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
10600 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
10610 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
10620 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
10630 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
10640 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
10650 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
10660 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
10670 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
10680 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
10690 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
106a0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
106b0 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
106c0 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
106d0 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
106e0 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
106f0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
10700 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
10710 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
10720 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
10730 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
10740 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
10750 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
10760 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
10770 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
10780 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
10790 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
107a0 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
107b0 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
107c0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
107d0 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
107e0 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
107f0 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
10800 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
10810 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
10820 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
10830 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
10840 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
10850 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
10860 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
10870 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
10880 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
10890 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
108a0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
108b0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
108c0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
108d0 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
108e0 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
108f0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
10900 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
10910 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
10920 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
10930 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
10940 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
10950 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
10960 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
10970 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
10980 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
10990 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
109a0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
109b0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
109c0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
109d0 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
109e0 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
109f0 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
10a00 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
10a10 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
10a20 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
10a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
10a40 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
10a50 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
10a60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
10a70 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
10a80 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
10a90 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e  ert( len<=(u32)n
10aa0 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
10ab0 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
10ac0 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
10ad0 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
10ae0 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
10af0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
10b00 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
10b10 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
10b20 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
10b30 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
10b40 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
10b50 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
10b60 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
10b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
10b80 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
10b90 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
10ba0 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
10bb0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
10bc0 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
10bd0 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
10be0 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
10bf0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
10c00 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
10c10 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
10c20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
10c30 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  m->u.nZero;.    
10c40 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d    assert( nBuf>=
10c50 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  0 );.      if( l
10c60 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29  en > (u32)nBuf )
10c70 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
10c80 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20  (u32)nBuf;.     
10c90 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
10ca0 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
10cb0 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
10cc0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10cd0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
10ce0 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
10cf0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
10d00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10d10 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
10d20 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
10d30 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
10d40 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
10d50 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
10d60 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
10d70 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
10d80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
10d90 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
10da0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
10db0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
10dc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10dd0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
10de0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
10df0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
10e00 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
10e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
10e20 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
10e30 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
10e40 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
10e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
10e60 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
10e70 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
10e80 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
10e90 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
10ea0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
10eb0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
10ec0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
10ed0 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
10ee0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
10ef0 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
10f00 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
10f10 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
10f20 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
10f30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10f40 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
10f50 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
10f60 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
10f70 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
10f80 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
10f90 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
10fa0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
10fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
10fc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
10fd0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
10fe0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
10ff0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
11000 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
11010 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
11020 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
11030 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
11040 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
11050 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
11060 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
11070 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
11080 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
11090 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
110a0 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
110b0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
110c0 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
110d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
110e0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
110f0 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
11100 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
11110 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
11120 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
11130 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
11140 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
11150 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
11160 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
11170 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
11180 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
11190 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
111a0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
111b0 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
111c0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
111d0 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
111e0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
111f0 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
11200 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
11210 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
11220 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
11230 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
11240 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
11250 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
11260 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
11270 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
11280 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
11290 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
112a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
112b0 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
112c0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
112d0 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
112e0 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
112f0 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
11300 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
11310 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
11320 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
11330 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
11340 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
11350 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
11360 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
11370 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
11380 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
11390 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
113a0 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
113b0 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
113c0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
113d0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
113e0 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
113f0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
11400 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
11410 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
11420 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
11430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
11440 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
11450 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
11460 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
11470 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
11480 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
11490 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
114a0 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
114b0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
114c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
114d0 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
114e0 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
114f0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
11500 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
11510 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
11520 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
11530 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
11540 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
11550 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
11560 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
11570 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
11580 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
11590 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
115a0 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
115b0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
115c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
115d0 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
115e0 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
115f0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
11600 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
11620 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
11630 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
11640 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
11650 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
11660 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
11670 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
11680 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
11690 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
116a0 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
116b0 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
116c0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
116d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
116e0 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
116f0 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
11700 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
11710 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
11720 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
11730 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
11740 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
11750 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
11760 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
11770 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
11780 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11790 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20        u32 len = 
117a0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
117b0 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
117c0 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
117d0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
117e0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
117f0 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
11800 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
11810 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
11820 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
11830 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
11840 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
11850 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
11860 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
11870 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
11880 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
11890 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
118a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
118b0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
118c0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
118d0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
118e0 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
118f0 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
11900 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
11910 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
11920 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
11930 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
11940 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
11950 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
11960 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
11970 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
11980 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
11990 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
119a0 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
119b0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
119c0 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
119d0 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
119e0 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
119f0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
11a00 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
11a10 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
11a20 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
11a30 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
11a40 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
11a50 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
11a60 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
11a70 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
11a80 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
11a90 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
11aa0 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
11ab0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
11ac0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
11ad0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
11ae0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
11af0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
11b00 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
11b10 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
11b20 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
11b30 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
11b40 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
11b50 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
11b60 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
11b70 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
11b80 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
11b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
11ba0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
11bb0 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74  ilable to hold t
11bc0 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  he object */.  i
11bd0 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20  nt szSpace      
11be0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11bf0 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
11c00 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
11c10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11c20 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
11c30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
11c40 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
11c50 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65  cord *p;  /* The
11c60 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
11c70 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65   that we will re
11c80 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  turn */.  int nB
11c90 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  yte;          /*
11ca0 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65   Memory space ne
11cb0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20  eded to hold p, 
11cc0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
11cd0 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  t d;.  u32 idx;.
11ce0 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
11cf0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
11d00 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
11d10 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
11d20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e   Mem *pMem;.  in
11d30 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t nOff;         
11d40 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53    /* Increase pS
11d50 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75 63  pace by this muc
11d60 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67  h to 8-byte alig
11d70 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a  n it */.  .  /*.
11d80 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    ** We want to 
11d90 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65  shift the pointe
11da0 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68  r pSpace up such
11db0 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79   that it is 8-by
11dc0 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a  te aligned..  **
11dd0 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74   Thus, we need t
11de0 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61  o calculate a va
11df0 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65  lue, nOff, betwe
11e00 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73  en 0 and 7, to s
11e10 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79  hift .  ** it by
11e20 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20  .  If pSpace is 
11e30 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61  already 8-byte a
11e40 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f  ligned, nOff sho
11e50 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a  uld be zero..  *
11e60 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20  /.  nOff = (8 - 
11e70 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
11e80 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29  NT(pSpace) & 7))
11e90 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b   & 7;.  pSpace +
11ea0 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63  = nOff;.  szSpac
11eb0 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79  e -= nOff;.  nBy
11ec0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
11ed0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
11ee0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
11ef0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
11f00 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
11f10 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
11f20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
11f30 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
11f40 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
11f50 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
11f60 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
11f70 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
11f80 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50  _NEED_FREE | UNP
11f90 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
11fa0 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OY;.  }else{.   
11fb0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
11fc0 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20  cord*)pSpace;.  
11fd0 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50    p->flags = UNP
11fe0 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
11ff0 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65  OY;.  }.  p->pKe
12000 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
12010 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
12020 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
12030 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20   + 1;.  p->aMem 
12040 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  = pMem = (Mem*)&
12050 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
12060 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
12070 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
12080 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
12090 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
120a0 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
120b0 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
120c0 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
120d0 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
120e0 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
120f0 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26  & u<p->nField &&
12100 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
12110 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
12120 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
12130 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
12140 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
12150 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
12160 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
12170 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
12180 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
12190 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
121a0 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d   0;.    pMem->zM
121b0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64  alloc = 0;.    d
121c0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
121d0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
121e0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
121f0 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
12200 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a  +;.    u++;.  }.
12210 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
12220 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
12230 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
12240 20 3d 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28   = u;.  return (
12250 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  void*)p;.}../*.*
12260 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
12270 65 73 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b  estroys a Unpack
12280 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e  edRecord object.
12290 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
122a0 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
122b0 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65  edRecord(Unpacke
122c0 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69  dRecord *p){.  i
122d0 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  nt i;.  Mem *pMe
122e0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  m;..  assert( p!
122f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12300 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  p->flags & UNPAC
12310 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
12320 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
12330 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70  Mem=p->aMem; i<p
12340 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70  ->nField; i++, p
12350 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54  Mem++){.    /* T
12360 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
12370 72 64 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e  rd is always con
12380 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 0a  structed by the.
12390 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
123a0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
123b0 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c   function above,
123c0 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c   which makes all
123d0 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  .    ** strings 
123e0 61 6e 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63  and blobs static
123f0 2e 20 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  .  And none of t
12400 68 65 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a  he elements are.
12410 20 20 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e      ** ever tran
12420 73 66 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72  sformed, so ther
12430 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68  e is never anyth
12440 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20  ing to delete.. 
12450 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
12460 56 45 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  VER(pMem->zMallo
12470 63 29 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  c) ) sqlite3Vdbe
12480 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
12490 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66  ;.  }.  if( p->f
124a0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
124b0 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20  NEED_FREE ){.   
124c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
124d0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
124e0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
124f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
12500 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
12510 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
12520 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
12530 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
12540 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
12550 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
12560 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
12570 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
12580 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
12590 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
125a0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
125b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
125c0 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
125d0 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
125e0 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
125f0 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d  eated by th OP_M
12600 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
12610 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
12620 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
12630 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
12640 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
12650 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
12660 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
12670 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  ecord..**.** Key
12680 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
12690 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
126a0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
126b0 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20  r of fields..** 
126c0 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77  The key with few
126d0 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75  er fields is usu
126e0 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65  ally compares le
126f0 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20  ss than the .** 
12700 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77  longer key.  How
12710 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41  ever if the UNPA
12720 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61  CKED_INCRKEY fla
12730 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20  gs in pPKey2 is 
12740 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  set.** and the c
12750 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61  ommon prefixes a
12760 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b  re equal, then k
12770 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
12780 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20   key2..** Or if 
12790 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54  the UNPACKED_MAT
127a0 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69  CH_PREFIX flag i
127b0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72  s set and the pr
127c0 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71  efixes are.** eq
127d0 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65  ual, then the ke
127e0 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ys are considere
127f0 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e  d to be equal an
12800 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62  d.** the parts b
12810 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  eyond the common
12820 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f   prefix are igno
12830 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
12840 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  e UNPACKED_IGNOR
12850 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20  E_ROWID flag is 
12860 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  set, then the la
12870 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
12880 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79  e header of pKey
12890 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49  1 is ignored.  I
128a0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
128b0 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e  t pKey1 is.** an
128c0 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20   index key, and 
128d0 74 68 75 73 20 65 6e 64 73 20 77 69 74 68 20 61  thus ends with a
128e0 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54   rowid value.  T
128f0 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20  he last byte.** 
12900 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 77 69  of the header wi
12910 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
12920 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
12930 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a  of the rowid:.**
12940 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c   one of 1, 2, 3,
12950 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20   4, 5, 6, 8, or 
12960 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20  9 - the integer 
12970 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a  serial types..**
12980 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
12990 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   of the final ro
129a0 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  wid will always 
129b0 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  be a single byte
129c0 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67  ..** By ignoring
129d0 20 74 68 69 73 20 6c 61 73 74 20 62 79 74 65 20   this last byte 
129e0 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c 20 77  of the header, w
129f0 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70  e force the comp
12a00 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e  arison.** to ign
12a10 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 61 74  ore the rowid at
12a20 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31   the end of key1
12a30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12a40 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
12a50 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
12a60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
12a70 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
12a80 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
12a90 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
12aa0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
12ab0 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20  /.){.  int d1;  
12ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
12ad0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
12ae0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
12af0 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
12b00 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
12b10 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
12b20 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
12b30 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
12b40 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
12b50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
12b60 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
12b70 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
12b80 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69   int nField;.  i
12b90 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
12ba0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12bb0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
12bc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12bd0 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
12be0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
12bf0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
12c00 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
12c10 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e  KeyInfo;.  mem1.
12c20 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
12c30 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
12c40 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
12c50 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
12c60 0a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  .  mem1.u.i = 0;
12c70 20 20 2f 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2c    /* not needed,
12c80 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
12c90 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
12ca0 67 20 2a 2f 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c  g */.  mem1.zMal
12cb0 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64  loc = 0;.  .  id
12cc0 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
12cd0 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
12ce0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
12cf0 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
12d00 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
12d10 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20  GNORE_ROWID ){. 
12d20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d     szHdr1--;.  }
12d30 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
12d40 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
12d50 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
12d60 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
12d70 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
12d80 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
12d90 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
12da0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
12db0 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
12dc0 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
12dd0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
12de0 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
12df0 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
12e00 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
12e10 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
12e20 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
12e30 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
12e40 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
12e50 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
12e60 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
12e70 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
12e80 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
12e90 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
12ea0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
12eb0 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
12ec0 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
12ed0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
12ee0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
12ef0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
12f00 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
12f10 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
12f40 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
12f50 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
12f60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  !=0 ){.      bre
12f70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  ak;.    }.    i+
12f80 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20  +;.  }..  /* No 
12f90 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
12fa0 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
12fb0 6e 20 6d 65 6d 31 2e 20 2a 2f 0a 20 20 69 66 28  n mem1. */.  if(
12fc0 20 4e 45 56 45 52 28 6d 65 6d 31 2e 7a 4d 61 6c   NEVER(mem1.zMal
12fd0 6c 6f 63 29 20 29 20 73 71 6c 69 74 65 33 56 64  loc) ) sqlite3Vd
12fe0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
12ff0 6d 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  m1);..  /* If th
13000 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20  e PREFIX_SEARCH 
13010 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
13020 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70  all fields excep
13030 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
13040 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72   rowid field wer
13050 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c  e equal, then cl
13060 65 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53  ear the PREFIX_S
13070 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73  EARCH flag and s
13080 65 74 20 0a 20 20 2a 2a 20 70 50 4b 65 79 32 2d  et .  ** pPKey2-
13090 3e 72 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61  >rowid to the va
130a0 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  lue of the rowid
130b0 20 66 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31   field in (pKey1
130c0 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 2a 2a 20 54  , nKey1)..  ** T
130d0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
130e0 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f  he OP_IsUnique o
130f0 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  pcode..  */.  if
13100 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  ( (pPKey2->flags
13110 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
13120 49 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d  IX_SEARCH) && i=
13130 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  =(pPKey2->nField
13140 2d 31 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  -1) ){.    asser
13150 74 28 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20  t( idx1==szHdr1 
13160 26 26 20 72 63 20 29 3b 0a 20 20 20 20 61 73 73  && rc );.    ass
13170 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20  ert( mem1.flags 
13180 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
13190 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
131a0 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46  = ~UNPACKED_PREF
131b0 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 70  IX_SEARCH;.    p
131c0 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d  PKey2->rowid = m
131d0 65 6d 31 2e 75 2e 69 3b 0a 20 20 7d 0a 0a 20 20  em1.u.i;.  }..  
131e0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
131f0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
13200 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
13210 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
13220 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
13230 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66      ** all the f
13240 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
13250 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
13260 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  l. If the UNPACK
13270 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a  ED_INCRKEY.    *
13280 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  * flag is set, t
13290 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69  hen break the ti
132a0 65 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65  e by treating ke
132b0 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20  y2 as larger..  
132c0 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
132d0 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
132e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
132f0 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
13300 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 20  mon prefixes.   
13310 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72   ** are consider
13320 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20  ed to be equal. 
13330 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
13340 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68  longer key is th
13350 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72  e .    ** larger
13360 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73  .  As it happens
13370 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c  , the pPKey2 wil
13380 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  l always be the 
13390 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a 20 69 66  longer.    ** if
133a0 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66   there is a diff
133b0 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20  erence..    */. 
133c0 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66     if( pPKey2->f
133d0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
133e0 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 20  INCRKEY ){.     
133f0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65   rc = -1;.    }e
13400 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
13410 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
13420 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b  _PREFIX_MATCH ){
13430 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20  .      /* Leave 
13440 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c  rc==0 */.    }el
13450 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64  se if( idx1<szHd
13460 72 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r1 ){.      rc =
13470 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
13480 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
13490 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c  aSortOrder && i<
134a0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
134b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
134c0 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
134d0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
134e0 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a    rc = -rc;.  }.
134f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13500 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
13510 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
13520 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
13530 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
13540 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
13550 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
13560 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
13570 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
13580 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
13590 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
135a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
135b0 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
135c0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
135d0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
135e0 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
135f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
13600 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
13610 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
13620 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
13630 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
13640 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
13650 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
13660 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
13670 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
13680 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
13690 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
136a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
136b0 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
136c0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
136d0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
136e0 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
136f0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
13700 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
13710 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
13720 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
13730 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
13740 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
13750 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
13760 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
13770 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
13780 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
13790 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
137a0 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
137b0 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
137c0 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
137d0 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
137e0 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
137f0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
13800 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
13810 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
13820 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
13830 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
13840 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
13850 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
13860 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
13870 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
13880 73 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  s  .  */.  rc = 
13890 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
138a0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
138b0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
138c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
138d0 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
138e0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
138f0 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
13900 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
13910 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
13920 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
13930 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
13940 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
13950 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
13960 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
13970 6e 74 72 79 20 2a 2f 0a 20 20 6d 2e 66 6c 61 67  ntry */.  m.flag
13980 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62 20 3d 20  s = 0;.  m.db = 
13990 64 62 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20  db;.  m.zMalloc 
139a0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
139b0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
139c0 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  ree(pCur, 0, (in
139d0 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
139e0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
139f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13a00 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
13a10 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
13a20 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
13a30 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
13a40 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
13a50 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
13a60 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
13a70 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
13a80 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
13a90 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
13aa0 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
13ab0 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
13ac0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
13ad0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
13ae0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
13af0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
13b00 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
13b10 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
13b20 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
13b30 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
13b40 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
13b50 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
13b60 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
13b70 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
13b80 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
13b90 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
13ba0 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
13bb0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
13bc0 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
13bd0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
13be0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
13bf0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
13c00 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
13c10 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
13c20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
13c30 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
13c40 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
13c50 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
13c60 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
13c70 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
13c80 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
13c90 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
13ca0 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
13cb0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
13cc0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
13cd0 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
13ce0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13cf0 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
13d00 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
13d10 28 20 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  ( m.n==szHdr+len
13d20 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
13d30 6e 6c 69 6b 65 6c 79 28 6d 2e 6e 3c 73 7a 48 64  nlikely(m.n<szHd
13d40 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
13d50 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
13d60 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
13d70 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
13d80 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
13d90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
13da0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
13db0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13dc0 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
13dd0 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
13de0 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
13df0 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
13e00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
13e10 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
13e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13e30 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
13e40 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
13e50 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
13e60 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
13e70 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
13e80 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
13e90 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
13ea0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
13eb0 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
13ec0 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
13ed0 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63  tcase( m.zMalloc
13ee0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
13ef0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
13f00 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
13f10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
13f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
13f30 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
13f40 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
13f50 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
13f60 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
13f70 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
13f80 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
13f90 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
13fa0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
13fb0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
13fc0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
13fd0 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
13fe0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
13ff0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
14000 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
14010 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
14020 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
14030 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
14040 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
14050 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
14060 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
14070 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
14080 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
14090 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
140a0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
140b0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
140c0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
140d0 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
140e0 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
140f0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
14100 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
14110 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
14120 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
14130 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
14140 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
14150 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
14160 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62  eyCompare(.  Vdb
14170 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
14180 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14190 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
141a0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
141b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
141c0 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e  Unpacked,  /* Un
141d0 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
141e0 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65  f key to compare
141f0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e   against */.  in
14200 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
14210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
14220 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
14230 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
14240 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
14250 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
14260 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
14270 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
14280 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 72 63  ;.  Mem m;..  rc
14290 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
142a0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
142b0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
142c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
142d0 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69   );    /* pCur i
142e0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
142f0 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
14300 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43   fail */.  /* nC
14310 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
14320 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
14330 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
14340 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 61  ecause of the sa
14350 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
14360 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
14370 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
14380 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
14390 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
143a0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
143b0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
143c0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
143d0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
143e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
143f0 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b  .  }.  m.db = 0;
14400 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  .  m.flags = 0;.
14410 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b    m.zMalloc = 0;
14420 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
14430 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
14440 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
14450 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
14460 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
14470 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
14480 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14490 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73  pUnpacked->flags
144a0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f   & UNPACKED_IGNO
144b0 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72  RE_ROWID );.  *r
144c0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
144d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e  RecordCompare(m.
144e0 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65  n, m.z, pUnpacke
144f0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
14500 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
14510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14520 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
14530 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
14540 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
14550 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
14560 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
14570 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
14580 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
14590 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
145a0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
145b0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
145c0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
145d0 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
145e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
145f0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
14600 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
14610 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
14620 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
14630 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
14640 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
14650 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
14660 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
14670 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
14680 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
14690 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
146a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
146b0 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
146c0 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
146d0 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
146e0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
146f0 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
14700 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
14710 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
14720 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
14730 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
14740 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
14750 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
14760 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
14770 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
14780 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
14790 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
147a0 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
147b0 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
147c0 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
147d0 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
147e0 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
147f0 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
14800 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
14810 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
14820 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
14830 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
14840 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
14850 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
14860 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
14870 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
14880 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14890 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
148a0 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
148b0 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
148c0 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
148d0 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
148e0 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
148f0 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
14900 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14910 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
14920 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
14930 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
14940 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
14950 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
14960 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a              rn v->db;.}.