/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 79cf42b70e211a52d664fc4d585ee2da0a64deac:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61  also needs to ma
13a0: 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a  rk all btrees.**
13b0: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
13c0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
13d0: 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75  zWhere string mu
13e0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74  st have been obt
13f0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1400: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
1410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1420: 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70  l take ownership
1430: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
1440: 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69  d memory..*/.voi
1450: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  d sqlite3VdbeAdd
1460: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64  ParseSchemaOp(Vd
1470: 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20  be *p, int iDb, 
1480: 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20  char *zWhere){. 
1490: 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64   int j;.  int ad
14a0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14b0: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72  AddOp3(p, OP_Par
14c0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
14d0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
14e0: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
14f0: 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  ddr, zWhere, P4_
1500: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
1510: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
1520: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
1530: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
1540: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
1550: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1560: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1570: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
1580: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
1590: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
15a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
15c0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
15d0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
15e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15f0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1600: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1610: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1620: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1630: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1640: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1650: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1660: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1670: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1680: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
1690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16a0: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
16b0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
16c0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
16d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
16e0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
16f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1700: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1710: 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
1720: 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33  PTR(p4), P4_INT3
1730: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  2);.  return add
1740: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
1750: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
1760: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
1770: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1780: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
1790: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
17a0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
17b0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
17c0: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
17d0: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
17e0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
17f0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1800: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
1810: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
1820: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
1830: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
1840: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
1850: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
1860: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
1870: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
1880: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
1890: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
18a0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
18b0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
18c0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
18d0: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
18e0: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
18f0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1900: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
1910: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
1920: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
1930: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
1940: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
1950: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
1960: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1970: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
1980: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
1990: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
19a0: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
19b0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
19c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
19d0: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
19e0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  ){.  int i = p->
19f0: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
1a00: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1a10: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1a20: 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31  .  if( (i & (i-1
1a30: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ))==0 ){.    p->
1a40: 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  aLabel = sqlite3
1a50: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
1a60: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  p->db, p->aLabel
1a70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31            (i*2+1
1aa0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  )*sizeof(p->aLab
1ab0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  el[0]));.  }.  i
1ac0: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1ad0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
1ae0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
1af0: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
1b00: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
1b10: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
1b20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1b30: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
1b40: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
1b50: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
1b60: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
1b70: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1b80: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
1b90: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
1ba0: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
1bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1bc0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
1bd0: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
1be0: 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20  int j = -1-x;.  
1bf0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1c00: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1c10: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
1c20: 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62  >=0 && j<p->nLab
1c30: 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  el );.  if( p->a
1c40: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
1c50: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e  aLabel[j] = p->n
1c60: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
1c70: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
1c80: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
1c90: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
1ca0: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1cb0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
1cc0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
1cd0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
1ce0: 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   1;.}..#ifdef SQ
1cf0: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
1d00: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
1d10: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
1d20: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1d30: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
1d40: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
1d50: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1d60: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
1d70: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
1d80: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
1d90: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
1da0: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
1db0: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
1dc0: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
1dd0: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
1de0: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
1df0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1e00: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
1e10: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
1e20: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
1e30: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
1e40: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
1e50: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
1e80: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
1e90: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
1ea0: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
1eb0: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
1ec0: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
1ed0: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
1ee0: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
1ef0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
1f00: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
1f10: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
1f20: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
1f30: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
1f40: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
1f50: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1f60: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
1f70: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1f80: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
1f90: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
1fa0: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
1fb0: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
1fc0: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
1fd0: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
1fe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ff0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2000: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
2010: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
2020: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2030: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
2040: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
2050: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2070: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
2080: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
2090: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
20a0: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
20b0: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
20c0: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
20d0: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
20e0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
20f0: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
2100: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
2110: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
2120: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
2130: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
2140: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
2150: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
2160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
2170: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
2180: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
2190: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
21a0: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
21b0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
21c0: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
21d0: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
21e0: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
21f0: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
2200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
2210: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
2220: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
2230: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
2240: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
2250: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
2260: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
2270: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
2280: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
2290: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
22a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
22b0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22c0: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
22d0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
22e0: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
22f0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
2300: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2310: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
2320: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
2330: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
2340: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
2350: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
2360: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
2370: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
2380: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
2390: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
23a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
23b0: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
23c0: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
23d0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
23e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23f0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2410: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
2420: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
2430: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2440: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
2450: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
2460: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
2470: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
2480: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
2490: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
24a0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
24b0: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
24c0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
24d0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
24e0: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
24f0: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
2500: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2510: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
2520: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
2530: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2540: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2550: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
2560: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
2570: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2580: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2590: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
25a0: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
25b0: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
25c0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
25d0: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
25e0: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
25f0: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
2600: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a   constraint).**.
2610: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
2620: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
2630: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
2640: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
2650: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
2660: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
2670: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
2680: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
2690: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
26a0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
26b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
26c0: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
26d0: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
26e0: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
26f0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
2700: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
2710: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
2720: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
2730: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
2740: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
2750: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
2760: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2770: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2780: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
2790: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
27a0: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f  asAbort = 0;.  O
27b0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
27c0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
27d0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
27e0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
27f0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
2800: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2810: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2820: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
2830: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
2840: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
2850: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
2860: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
2870: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
2880: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
2890: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28a0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
28b0: 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d       || (opcode=
28c0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
28d0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
28e0: 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64  Op->p2==1) .#end
28f0: 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  if.     || ((opc
2900: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
2910: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
2920: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
2930: 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54   (pOp->p1==SQLIT
2940: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2950: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
2960: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
2970: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
2980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2990: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
29a0: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
29b0: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
29c0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
29d0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
29e0: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
29f0: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
2a00: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
2a10: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
2a20: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
2a30: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
2a40: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
2a50: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
2a60: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
2a70: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
2a80: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
2a90: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
2aa0: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
2ab0: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
2ac0: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
2ad0: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
2ae0: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
2af0: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
2b00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2b10: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2b20: 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rt );.}.#endif /
2b30: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
2b40: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
2b50: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
2b60: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
2b70: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2b80: 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67   program looking
2b90: 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74   for P2 values t
2ba0: 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  hat are negative
2bb0: 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74  .** on jump inst
2bc0: 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  ructions.  Each 
2bd0: 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20  such value is a 
2be0: 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20  label.  Resolve 
2bf0: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20  the.** label by 
2c00: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76  setting the P2 v
2c10: 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72  alue to its corr
2c20: 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ect non-zero val
2c30: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ue..**.** This r
2c40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2c50: 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20   once after all 
2c60: 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65  opcodes have bee
2c70: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
2c80: 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78  * Variable *pMax
2c90: 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20  FuncArgs is set 
2ca0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  to the maximum v
2cb0: 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61  alue of any P2 a
2cc0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61  rgument .** to a
2cd0: 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f  n OP_Function, O
2ce0: 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f  P_AggStep or OP_
2cf0: 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20  VFilter opcode. 
2d00: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
2d10: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d  .** sqlite3VdbeM
2d20: 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69  akeReady() to si
2d30: 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  ze the Vdbe.apAr
2d40: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  g[] array..**.**
2d50: 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20   The Op.opflags 
2d60: 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20  field is set on 
2d70: 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  all opcodes..*/.
2d80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
2d90: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
2da0: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
2db0: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  ncArgs){.  int i
2dc0: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  ;.  int nMaxArgs
2dd0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
2de0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
2df0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
2e00: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
2e10: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72  dOnly = 1;.  for
2e20: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2e30: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2e40: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2e50: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2e60: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f  >opcode;..    pO
2e70: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
2e80: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
2e90: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
2ea0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
2eb0: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
2ec0: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b  e==OP_AggStep ){
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
2ee0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
2ef0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
2f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f10: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e  (opcode==OP_Tran
2f20: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2f30: 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 65  p2!=0) || opcode
2f40: 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a 20  ==OP_Vacuum ){. 
2f50: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
2f60: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2f70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2f80: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
2f90: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2fa0: 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  VUpdate ){.     
2fb0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
2fc0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2fd0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2fe0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2ff0: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
3000: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
3010: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
3020: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
3030: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
3040: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
3050: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
3060: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
3070: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
3080: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3090: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
30a0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
30b0: 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 6f 70 63  ==OP_Next || opc
30c0: 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e 65  ode==OP_SorterNe
30d0: 78 74 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  xt ){.      pOp-
30e0: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
30f0: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b  qlite3BtreeNext;
3100: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3110: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3120: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3130: 70 63 6f 64 65 3d 3d 4f 50 5f 50 72 65 76 20 29  pcode==OP_Prev )
3140: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e  {.      pOp->p4.
3150: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3160: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
3170: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3180: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3190: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31a0: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
31b0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
31c0: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
31d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
31e0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
31f0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
3200: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
3210: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
3220: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3230: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
3240: 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65  bel);.  p->aLabe
3250: 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46  l = 0;..  *pMaxF
3260: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
3270: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
3280: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
3290: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
32a0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
32b0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
32c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
32d0: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
32e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
32f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3300: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
3310: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
3320: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
3330: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
3340: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
3350: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
3360: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
3370: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
3380: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3390: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
33a0: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
33b0: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
33c0: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
33d0: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
33e0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
33f0: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
3400: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
3410: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
3420: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
3430: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
3440: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
3450: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
3460: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
3470: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
3480: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
3490: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
34a0: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
34b0: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
34c0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
34d0: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
34e0: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
34f0: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
3500: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
3510: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
3520: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
3530: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
3540: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
3550: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
3560: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
3570: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
3580: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
3590: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
35a0: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
35b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
35c0: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
35d0: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
35e0: 61 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65  assert( p->btree
35f0: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  Mask==0 );..  re
3600: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3610: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3620: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
3630: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
3640: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
3650: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
3660: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
3670: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
3680: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3690: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
36a0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
36b0: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
36c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
36d0: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
36e0: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
36f0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3700: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3710: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3720: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3730: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3740: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
3750: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
3760: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
3770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3780: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3790: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
37a0: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
37b0: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
37c0: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
37d0: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
37e0: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
37f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3800: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3810: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3820: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
3830: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
3840: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
3850: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
3860: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
3870: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
3880: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3890: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
38a0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
38b0: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
38c0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
38d0: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
38e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38f0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3910: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3920: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
3930: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3940: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
3950: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
3960: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
3970: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3980: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3990: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
39a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
39b0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
39c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
39d0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
39e0: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
39f0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3a00: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3a10: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
3a30: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
3a40: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3a50: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
3a60: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3a70: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3a80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3a90: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3aa0: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3ab0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3ac0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ae0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3af0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3b00: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3b10: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3b20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b30: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
3b40: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
3b50: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3b60: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3b70: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
3b80: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3b90: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
3ba0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3bb0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3bc0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
3bd0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3be0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3bf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3c00: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
3c10: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
3c20: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
3c30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3c40: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
3c50: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
3c60: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3c70: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
3c80: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
3c90: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3ca0: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
3cb0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3cc0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3cd0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
3ce0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3cf0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
3d00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3d10: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
3d20: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
3d30: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
3d40: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
3d50: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
3d60: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
3d70: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
3d80: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3d90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
3da0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
3db0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
3dc0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
3dd0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3de0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
3df0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
3e00: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3e10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
3e20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3e30: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
3e40: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
3e50: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
3e60: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3e70: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
3e80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
3e90: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
3ea0: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
3eb0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
3ec0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3ed0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
3ee0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
3ef0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
3f00: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
3f10: 72 74 28 20 61 64 64 72 3e 3d 30 20 7c 7c 20 70  rt( addr>=0 || p
3f20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3f30: 65 64 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  ed );.  if( addr
3f40: 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  >=0 ) sqlite3Vdb
3f50: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3f60: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
3f70: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
3f80: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
3f90: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
3fa0: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
3fb0: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
3fc0: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
3fd0: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
3fe0: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
3ff0: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
4000: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
4010: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
4020: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
4030: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
4040: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
4050: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
4060: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4070: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
4080: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4090: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
40a0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
40b0: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
40c0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
40d0: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
40e0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
40f0: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
4100: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
4110: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
4120: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
4130: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
4140: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
4150: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
4160: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
4170: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
4180: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
4190: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
41a0: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
41b0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
41c0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
41d0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
41e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
41f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4200: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4220: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
4230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4240: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4250: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
4260: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4270: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4280: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
4290: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
42a0: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
42b0: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
42c0: 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p4;.        free
42d0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
42e0: 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d  n(db, pVdbeFunc-
42f0: 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  >pFunc);.       
4300: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4310: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4320: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
4330: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
4340: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
4360: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
4370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4380: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
4390: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
43a0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
43b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
43c0: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
43d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
43e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
43f0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  EM: {.        if
4400: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4410: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
4420: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
4430: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
4440: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
4450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4460: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
4470: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  )p4;.          s
4480: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4490: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
44a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
44b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
44c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
44d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
44e0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
44f0: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
4500: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4510: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
4520: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
4530: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
4540: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4550: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4560: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
4570: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
4580: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
4590: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
45a0: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
45b0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
45c0: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
45d0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
45e0: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
45f0: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
4600: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
4610: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
4620: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
4630: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
4640: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
4650: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
4660: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
4670: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
4680: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
4690: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
46a0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
46b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
46c0: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
46d0: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
46e0: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
46f0: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
4700: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4710: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
4720: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
4730: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
4740: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
4750: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
4760: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
4770: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
4780: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
4790: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
47a0: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
47b0: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
47c0: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
47d0: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
47e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
47f0: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
4800: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
4810: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
4820: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
4830: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
4840: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
4850: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
4860: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
4870: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
4880: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73  P_Noop.*/.void s
4890: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
48a0: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
48b0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
48c0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
48d0: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
48e0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
48f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4900: 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28  >db;.    freeP4(
4910: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4920: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
4930: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
4940: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
4950: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
4960: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a   = OP_Noop;.  }.
4970: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4980: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4990: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
49a0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
49b0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
49c0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
49d0: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
49e0: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
49f0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4a00: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4a10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4a20: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
4a30: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
4a40: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
4a50: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
4a60: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
4a70: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4a80: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4a90: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4aa0: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4ab0: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4ac0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4ad0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4ae0: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4af0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4b00: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4b10: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4b20: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4b30: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
4b40: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
4b50: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
4b60: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
4b70: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
4b80: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
4b90: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4ba0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4bb0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4bc0: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4bd0: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4be0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4bf0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4c00: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4c10: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4c20: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4c30: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4c40: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4c50: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4c60: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4c70: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4c80: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4ca0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4cb0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4cc0: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4cd0: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4ce0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4cf0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4d00: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4d10: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4d20: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4d30: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4d40: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4d50: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4d60: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4d70: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4d80: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4d90: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4da0: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4db0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4dc0: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4dd0: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4de0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4df0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4e00: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4e10: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4e20: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4e30: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4e40: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4e50: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4e60: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4e70: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4e80: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4e90: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4ea0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4eb0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4ec0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4ed0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4ee0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4ef0: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4f00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4f10: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4f20: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4f30: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4f40: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4f50: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4f60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4f70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4f80: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4f90: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4fa0: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
4fb0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
4fc0: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
4fd0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4fe0: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
4ff0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5000: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
5010: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
5020: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
5030: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
5040: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
5050: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
5060: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
5070: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
5080: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
5090: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
50a0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
50b0: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
50c0: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
50d0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
50e0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
50f0: 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20  else if( zP4==0 
5100: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5110: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
5120: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5130: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
5140: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
5150: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
5160: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
5170: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
5180: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
5190: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
51a0: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
51b0: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
51c0: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
51d0: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
51e0: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
51f0: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
5200: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
5210: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74 65  llocRaw(0, nByte
5220: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
5230: 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
5240: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
5250: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38  Info ){.      u8
5260: 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20   *aSortOrder;.  
5270: 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72      memcpy((char
5280: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c  *)pKeyInfo, zP4,
5290: 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64 29   nByte - nField)
52a0: 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64  ;.      aSortOrd
52b0: 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  er = pKeyInfo->a
52c0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
52d0: 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20   if( aSortOrder 
52e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  ){.        pKeyI
52f0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
5300: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5310: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
5320: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
5330: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
5340: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
5350: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
5360: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
5370: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5380: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
5390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
53a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
53b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ed = 1;.      pO
53c0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
53d0: 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  OTUSED;.    }.  
53e0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
53f0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5400: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5410: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5420: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5430: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
5440: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
5450: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
5460: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5470: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5480: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
5490: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
54a0: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
54b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
54c0: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
54d0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
54e0: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
54f0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5500: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5510: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
5520: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
5530: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
5540: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
5550: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
5560: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
5570: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
5580: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
5590: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
55a0: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
55b0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
55c0: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
55d0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
55e0: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
55f0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
5600: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
5610: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
5620: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
5630: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
5640: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
5650: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
5660: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
5670: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
5680: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
5690: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
56a0: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
56b0: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
56c0: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
56d0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
56e0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
56f0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
5700: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
5710: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
5720: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
5730: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
5740: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
5750: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
5760: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5770: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5780: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
5790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
57a0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
57b0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57c0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
57d0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57e0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
57f0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5800: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
5810: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5820: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
5830: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5840: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5850: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5860: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
5870: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
5880: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
5890: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
58a0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
58b0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
58c0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
58d0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
58e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
58f0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5900: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
5910: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5920: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
5930: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
5940: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
5950: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
5960: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
5970: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5980: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
5990: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
59a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
59b0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
59c0: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
59d0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
59e0: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
59f0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
5a00: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
5a10: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
5a20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5a30: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5a40: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
5a50: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
5a60: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
5a70: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
5a80: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
5a90: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5aa0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5ab0: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5ac0: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
5ad0: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
5ae0: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
5af0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
5b00: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
5b10: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
5b20: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5b30: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5b40: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5b50: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5b60: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5b70: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5b80: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5b90: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5ba0: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5bb0: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5bc0: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5bd0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5be0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5bf0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5c00: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5c10: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5c20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5c30: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5c40: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5c50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5c60: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5c70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5c80: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5c90: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5ca0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5cb0: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5cc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5cd0: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5ce0: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5cf0: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5d00: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5d10: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5d20: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5d30: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5d40: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5d50: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5d60: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5d70: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5d80: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5d90: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5da0: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5db0: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5dc0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5dd0: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5de0: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5df0: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5e00: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5e10: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5e20: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5e30: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5e40: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5e50: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5e60: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
5e70: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
5e80: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
5e90: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
5ea0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
5eb0: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
5ec0: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
5ed0: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
5ee0: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
5ef0: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
5f00: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20  c VdbeOp dummy; 
5f10: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d   /* Ignore the M
5f20: 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75  SVC warning abou
5f30: 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72  t no initializer
5f40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
5f50: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5f60: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5f70: 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65   addr<0 ){.#ifde
5f80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5f90: 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ACE.    if( p->n
5fa0: 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  Op==0 ) return (
5fb0: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
5fc0: 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20  #endif.    addr 
5fd0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5fe0: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
5ff0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6000: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
6010: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6020: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
6030: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6040: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
6050: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
6060: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
6070: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
6080: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6090: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
60a0: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
60b0: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
60c0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
60d0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
60e0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
60f0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6100: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
6110: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
6120: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
6130: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
6140: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
6150: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
6160: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
6170: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
6180: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
6190: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
61a0: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
61b0: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
61c0: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
61d0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
61e0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
61f0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6200: 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61  O_STATIC:.    ca
6210: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6220: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
6230: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
6240: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
6250: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
6260: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6270: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6280: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
6290: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
62a0: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
62b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
62c0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
62d0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
62e0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
62f0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6300: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
6310: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
6320: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
6330: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
6340: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6350: 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  0(pColl->zName);
6360: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
6370: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
6380: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6390: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
63a0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
63b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
63c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
63d0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
63e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
63f0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6400: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
6410: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
6420: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
6430: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
6440: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6450: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
6460: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
6470: 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20  Name,n+1);.     
6480: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
6490: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
64a0: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
64b0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
64c0: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c  zTemp[i],",nil",
64d0: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  4);.          i 
64e0: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
6500: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
6510: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
6520: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
6530: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
6540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6550: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
6560: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
6570: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
6580: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
6590: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
65a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
65b0: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
65c0: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
65d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
65e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
65f0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
6600: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
6610: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
6620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6630: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6640: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
6650: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
6660: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
6670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6680: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
6690: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
66a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
66b0: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
66c0: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
66d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
66f0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
6700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6710: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
6720: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
6730: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6740: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
6750: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
6760: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6770: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
6780: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
6790: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
67a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
67b0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
67c0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
67d0: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
67e0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
67f0: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
6800: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
6810: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
6820: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6830: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6850: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6860: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  emp, "%lld", pMe
6870: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
6880: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6890: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
68a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
68b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
68c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
68d0: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  ", pMem->r);.   
68e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
68f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
6900: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
6910: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6920: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
6930: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ULL");.      }el
6940: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
6950: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
6960: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
6970: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
6980: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
6990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
69b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
69c0: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
69d0: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
69e0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
69f0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
6a00: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
6a10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6a20: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
6a30: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
6a40: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
6a50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6a60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6a70: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
6a80: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
6a90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6aa0: 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72  p, zTemp, "intar
6ab0: 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ray");.      bre
6ac0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ad0: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
6ae0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6af0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6b00: 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61  , zTemp, "progra
6b10: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
6b20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6b30: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
6b40: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6b50: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
6b60: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6b70: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
6b80: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
6b90: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
6ba0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
6bb0: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
6bc0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
6be0: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
6bf0: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
6c00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
6c10: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
6c20: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
6c30: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
6c40: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
6c50: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
6c60: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
6c70: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
6c80: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
6c90: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
6ca0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
6cb0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
6cc0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
6cd0: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
6ce0: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
6cf0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
6d00: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
6d10: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
6d20: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
6d30: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
6d40: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
6d50: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
6d60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6d70: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
6d80: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
6d90: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
6da0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
6db0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
6dc0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
6dd0: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
6de0: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
6df0: 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d  8 );.  p->btreeM
6e00: 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
6e10: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21  )1)<<i;.  if( i!
6e20: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
6e30: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
6e40: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6e50: 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  .    p->lockMask
6e60: 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29   |= ((yDbMask)1)
6e70: 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  <<i;.  }.}..#if 
6e80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6e90: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
6ea0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
6eb0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
6ec0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
6ed0: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
6ee0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6ef0: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
6f00: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
6f10: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
6f20: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
6f30: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
6f40: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6f50: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
6f60: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
6f70: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
6f80: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
6f90: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
6fa0: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
6fb0: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
6fc0: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
6fd0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6fe0: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
6ff0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
7000: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
7010: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
7020: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
7030: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
7040: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
7050: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
7060: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
7070: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
7080: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
7090: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
70a0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
70b0: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
70c0: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
70d0: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
70e0: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
70f0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7100: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
7110: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
7120: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
7130: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
7140: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
7150: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
7160: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
7170: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7180: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
7190: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
71a0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
71b0: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
71c0: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
71d0: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
71e0: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
71f0: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
7200: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
7210: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
7220: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
7230: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
7240: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
7250: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
7260: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7270: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
7280: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
7290: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
72a0: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
72b0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
72c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
72d0: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
72e0: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
72f0: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7300: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7310: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7320: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
7330: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
7340: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
7350: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
7360: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
7370: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
7380: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7390: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
73a0: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
73b0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
73c0: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
73d0: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
73e0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
73f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7400: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
7410: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7420: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
7430: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7440: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
7450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
7460: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
7470: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
7480: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
7490: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
74a0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
74b0: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76  dbeEnter()..*/.v
74c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
74d0: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
74e0: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
74f0: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7500: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
7510: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
7520: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
7530: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
7540: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7550: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
7560: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
7570: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
7580: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
7590: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
75a0: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
75b0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
75c0: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
75d0: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
75e0: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
75f0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7600: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
7610: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7620: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
7630: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
7640: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
7650: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7660: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
7670: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
7680: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7690: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
76a0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
76b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
76c0: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
76d0: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
76e0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
76f0: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
7700: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7710: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
7720: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
7730: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
7740: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
7750: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
7760: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
7770: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
7780: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
7790: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
77a0: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
77b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
77c0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
77d0: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
77e0: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
77f0: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
7800: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7810: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
7820: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
7830: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
7840: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
7850: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
7860: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
7870: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7880: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
7890: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
78a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
78b0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
78c0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
78d0: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
78e0: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
78f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7900: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
7910: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
7920: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
7930: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7940: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
7950: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
7960: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
7970: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7980: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
79a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
79b0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
79c0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
79d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
79e0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
79f0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7a00: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7a10: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7a20: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7a30: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
7a40: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
7a50: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
7a60: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
7a70: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
7a80: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
7a90: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
7aa0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
7ab0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
7ac0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
7ad0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7ae0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7af0: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7b00: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7b10: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7b20: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7b30: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7b40: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7b50: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7b60: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7b70: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
7b80: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
7b90: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
7ba0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
7bb0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
7bc0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
7bd0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7be0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7bf0: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7c00: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7c10: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7c20: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7c30: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7c40: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7c50: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7c60: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7c70: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7c80: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
7c90: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
7ca0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
7cb0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
7cc0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
7cd0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7ce0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7cf0: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7d00: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7d10: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7d20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7d30: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7d40: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7d50: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7d60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7d70: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7d80: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7d90: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7da0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7db0: 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20  = MEM_Invalid;. 
7dc0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
7dd0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
7de0: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
7df0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
7e00: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7e10: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
7e20: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
7e30: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
7e40: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
7e50: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
7e60: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
7e70: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
7e80: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
7e90: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
7ea0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
7eb0: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
7ec0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
7ed0: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7ee0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7ef0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7f00: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7f10: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
7f20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
7f30: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7f40: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
7f50: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7f60: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
7f70: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
7f80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
7f90: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
7fa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7fb0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
7fc0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
7fd0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
7fe0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7ff0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
8000: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
8010: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
8020: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
8030: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
8040: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
8050: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
8060: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
8070: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
8080: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
8090: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
80a0: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
80b0: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
80c0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
80d0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
80e0: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
80f0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
8100: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
8110: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
8120: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
8130: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
8140: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
8150: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
8160: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
8170: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
8180: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8190: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
81a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
81b0: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
81c0: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
81d0: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
81e0: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
81f0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
8200: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
8210: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
8220: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
8250: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8280: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
8290: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
82a0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
82b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
82c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
82d0: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
82e0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
82f0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
8300: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
8310: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
8320: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
8330: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
8360: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
8370: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
8380: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8390: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
83a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
83b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
83c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
83f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
8400: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8410: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
8420: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8430: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
8440: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
8450: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
8460: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
8470: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
8480: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
8490: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
84a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
84b0: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
84c0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
84d0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
84e0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
84f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8500: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
8510: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
8520: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
8530: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
8540: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
8550: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
8560: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
8570: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
8580: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
8590: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
85a0: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
85b0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
85c0: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
85d0: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
85e0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
85f0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
8600: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
8610: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8620: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
8630: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
8640: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
8650: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
8660: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
8670: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8680: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
8690: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
86a0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
86b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
86c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
86d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
86e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
86f0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
8700: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
8710: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
8720: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
8730: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
8740: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
8750: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
8760: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
8770: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
8780: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
8790: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
87a0: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
87b0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
87c0: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
87d0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
87e0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
87f0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
8800: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
8810: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
8820: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8830: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
8840: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
8850: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
8860: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
8870: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
8880: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
8890: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
88a0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
88b0: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
88c0: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
88d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
88e0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
88f0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
8900: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
8910: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
8920: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
8930: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
8940: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8950: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
8960: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
8970: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
8980: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
8990: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
89a0: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
89b0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
89c0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
89d0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
89e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
89f0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8a00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
8a10: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
8a20: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
8a30: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
8a40: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
8a50: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
8a60: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
8a70: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
8a80: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
8a90: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
8aa0: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
8ab0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
8ac0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
8ad0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
8ae0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
8af0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
8b00: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
8b10: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
8b20: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
8b30: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
8b40: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
8b50: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
8b60: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
8b70: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
8b80: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8b90: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
8ba0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
8bb0: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
8bc0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
8bd0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8be0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
8bf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8c00: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
8c10: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
8c20: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
8c30: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
8c40: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
8c50: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8c60: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
8c70: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
8c80: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
8c90: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
8ca0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
8cb0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
8cc0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
8cd0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
8ce0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
8cf0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
8d00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
8d10: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
8d20: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
8d30: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
8d40: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
8d50: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
8d60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
8d70: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
8d80: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
8d90: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
8da0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
8db0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
8dc0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
8dd0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
8de0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
8df0: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
8e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8e10: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8e20: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8e30: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8e40: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8e50: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8e60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
8e70: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
8ea0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
8eb0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
8ec0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8ed0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
8ee0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8ef0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
8f00: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
8f10: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8f20: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
8f30: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8f40: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8f50: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8f60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8f70: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
8f80: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
8f90: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
8fa0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8fb0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
8fc0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
8fd0: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
8fe0: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
8ff0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
9000: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
9010: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
9020: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
9030: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
9040: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
9050: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
9060: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
9070: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
9080: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
9090: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
90a0: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
90b0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
90c0: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
90d0: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
90e0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
90f0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
9100: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
9110: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
9120: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
9130: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
9140: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
9150: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
9160: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9170: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
9180: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
9190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
91a0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
91b0: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
91c0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
91d0: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
91e0: 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  te, 1) ){.      
91f0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
9200: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
9210: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
9220: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
9230: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
9240: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
9250: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
9260: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
9270: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
9280: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
9290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
92a0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
92b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
92c0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
92d0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
9300: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9310: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
9320: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
9330: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9340: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
9350: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
9360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
9380: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
9390: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
93a0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
93b0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
93c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
93d0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
93e0: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9400: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P3 */.    pMem
9410: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9420: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
9430: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
9440: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
9450: 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b  (pMem, 32, 0) ){
9460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9470: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
9480: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
9490: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
94a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
94b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
94c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
94d0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
94e0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
94f0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
9500: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
9510: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
9520: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
9530: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
9540: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
9550: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
9560: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9570: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
9580: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
9590: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
95a0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
95b0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
95c0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
95d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
95e0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
95f0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9600: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
9610: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
9620: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
9630: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
9640: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9650: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
9660: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
9670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
9680: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
9690: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
96a0: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
96b0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
96c0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
96d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
96e0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
96f0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
9700: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
9710: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9720: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
9730: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
9740: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
9750: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
9760: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9770: 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  G.      if( pOp-
9780: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
9790: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
97a0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
97b0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
97c0: 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d  m->z = pOp->zCom
97d0: 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  ment;.        pM
97e0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
97f0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
9800: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
9810: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
9820: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  8;.        pMem-
9830: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
9840: 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  EXT;.      }else
9850: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
9860: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
9870: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
98a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   */.        pMem
98b0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
98c0: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
98d0: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
98e0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
98f0: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
9900: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
9910: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
9920: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9930: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
9940: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
9950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
9960: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9970: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
9980: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9990: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
99a0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
99b0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
99c0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
99d0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
99e0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
99f0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
9a00: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
9a10: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
9a20: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
9a30: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
9a40: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
9a50: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
9a60: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
9a70: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
9a80: 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34  har *z = pOp->p4
9a90: 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73  .z;.    while( s
9aa0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
9ab0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69  ) ) z++;.    pri
9ac0: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
9ad0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
9ae0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
9af0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9b00: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
9b10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
9b20: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
9b30: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
9b40: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
9b50: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
9b60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
9b70: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
9b80: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
9b90: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
9ba0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
9bb0: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
9bc0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
9bd0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
9be0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
9bf0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
9c00: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
9c10: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
9c20: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
9c30: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
9c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
9c50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
9c60: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
9c70: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
9c80: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
9c90: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
9ca0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
9cb0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
9cc0: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
9cd0: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
9ce0: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
9cf0: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
9d00: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
9d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
9d20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
9d30: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
9d40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
9d50: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
9d60: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
9d70: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
9d80: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
9d90: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
9da0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
9db0: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  OTRACE */../*.**
9dc0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
9dd0: 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a  from a fixed siz
9de0: 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74  e buffer and ret
9df0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9e00: 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20  .** that space. 
9e10: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
9e20: 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
9e30: 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ble, return NULL
9e40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66  ..**.** The pBuf
9e50: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
9e60: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
9e70: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69  of a pointer whi
9e80: 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69  ch will.** recei
9e90: 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72  ve the new memor
9ea0: 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d  y.  pBuf is norm
9eb0: 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ally NULL.  If p
9ec0: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
9ed0: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
9ee0: 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68  t memory space h
9ef0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
9f00: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
9f10: 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  at.** this routi
9f20: 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c  ne should not al
9f30: 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d  locate any new m
9f40: 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75  emory.  When pBu
9f50: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
9f60: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70   simply return p
9f70: 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63  Buf.  Only alloc
9f80: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73  ate new memory s
9f90: 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a  pace when pBuf.*
9fa0: 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
9fb0: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
9fc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
9fd0: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
9fe0: 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69  *.** *ppFrom poi
9ff0: 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65  nts to available
a000: 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20   space and pEnd 
a010: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e  points to the en
a020: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69  d of the.** avai
a030: 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68  lable space.  Wh
a040: 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f  en space is allo
a050: 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69  cated, *ppFrom i
a060: 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a  s advanced past.
a070: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
a080: 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  e allocated spac
a090: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65  e..**.** *pnByte
a0a0: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
a0b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
a0c0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
a0d0: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
a0e0: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
a0f0: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
a100: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
a110: 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74  n *ppFrom to sat
a120: 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75  isfy the.** requ
a130: 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  est, then increm
a140: 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74  ent *pnByte by t
a150: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
a160: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
a170: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
a180: 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42  pace(.  void *pB
a190: 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf,          /* 
a1a0: 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69  Where return poi
a1b0: 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f  nter will be sto
a1c0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  red */.  int nBy
a1d0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
a1e0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a1f0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
a200: 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20    u8 **ppFrom,  
a210: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
a220: 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20  : Allocate from 
a230: 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20  *ppFrom */.  u8 
a240: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
a250: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a260: 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
a270: 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62  end of *ppFrom b
a280: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
a290: 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20  pnByte          
a2a0: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
a2b0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
a2c0: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
a2d0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
a2e0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
a2f0: 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29  IGNMENT(*ppFrom)
a300: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29   );.  if( pBuf )
a310: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20   return pBuf;.  
a320: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
a330: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a  Byte);.  if( &(*
a340: 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c  ppFrom)[nByte] <
a350: 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42  = pEnd ){.    pB
a360: 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46  uf = (void*)*ppF
a370: 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d  rom;.    *ppFrom
a380: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c   += nByte;.  }el
a390: 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20  se{.    *pnByte 
a3a0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20  += nByte;.  }.  
a3b0: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
a3c0: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
a3d0: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
a3e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
a3f0: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
a400: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
a410: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a420: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
a430: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
a440: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
a450: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
a460: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
a470: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
a480: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a490: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
a4a0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
a4b0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
a4c0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
a4d0: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
a4e0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
a4f0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
a500: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
a510: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
a520: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
a530: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
a540: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
a550: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
a560: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
a570: 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =1; i<p->nMem; i
a580: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
a590: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
a5a0: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
a5b0: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
a5c0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
a5d0: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
a5e0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
a5f0: 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  rt;.  p->magic =
a600: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
a610: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
a620: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
a630: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
a640: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
a650: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
a660: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
a670: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
a680: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
a690: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
a6a0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
a6b0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
a6c0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
a6d0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
a6e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
a6f0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
a700: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
a710: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
a720: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
a730: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
a740: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
a750: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
a760: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
a770: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
a780: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20  ing stack space 
a790: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
a7a0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
a7b0: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
a7c0: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
a7d0: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
a7e0: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
a7f0: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
a800: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
a810: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
a820: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
a830: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61  ay be called exa
a840: 63 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63  ct once on a eac
a850: 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  h virtual machin
a860: 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  e..** After this
a870: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a880: 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  ed the VM has be
a890: 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e  en "packaged" an
a8a0: 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f  d is ready.** to
a8b0: 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69   run.  After thi
a8c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a8d0: 6c 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c  led, futher call
a8e0: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
a8f0: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
a900: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
a910: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
a920: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
a930: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
a940: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
a950: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
a960: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
a970: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
a980: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
a990: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
a9a0: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
a9b0: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
a9c0: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
a9d0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
a9e0: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
a9f0: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
aa00: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
aa10: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
aa20: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
aa30: 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
aa40: 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
aa50: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
aa60: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
aa90: 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
aaa0: 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
aab0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
aac0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
aad0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
ab00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
ab10: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
ab40: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
ab50: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
ab60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ab70: 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
ab80: 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
ab90: 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
abc0: 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
abd0: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
ac00: 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
ac10: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
ac20: 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20   nOnce;         
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac40: 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65  umber of OP_Once
ac50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f   instructions */
ac60: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ac90: 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b  r */.  u8 *zCsr;
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
acc0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
acd0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  location */.  u8
ace0: 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *zEnd;         
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad00: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
ad10: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
ad20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad40: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68       /* How much
ad50: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73   extra memory is
ad60: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73   needed */..  as
ad70: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
ad80: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
ad90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ada0: 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
adb0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
adc0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
add0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
ade0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
adf0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
ae00: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
ae10: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
ae20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
ae30: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
ae40: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
ae50: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
ae60: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
ae70: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
ae80: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
ae90: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
aea0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
aeb0: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
aec0: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
aed0: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
aee0: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
aef0: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
af00: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
af10: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
af20: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
af30: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
af40: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
af50: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
af60: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
af70: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
af80: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
af90: 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  e for.  ** VdbeC
afa0: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
afb0: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
afc0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
afd0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
afe0: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
aff0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
b000: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
b010: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
b020: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
b030: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
b040: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b050: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
b060: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
b070: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
b080: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
b090: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
b0a0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
b0b0: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67  e for memory reg
b0c0: 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69  isters, SQL vari
b0d0: 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73  ables, VDBE curs
b0e0: 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e  ors and .  ** an
b0f0: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61   array to marsha
b100: 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  l SQL function a
b110: 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a  rguments in..  *
b120: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29  /.  zCsr = (u8*)
b130: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
b140: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
b150: 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61   avaliable for a
b160: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a  llocation */.  z
b170: 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  End = (u8*)&p->a
b180: 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  Op[p->nOpAlloc];
b190: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
b1a0: 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72  past end of zCsr
b1b0: 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65  [] */..  resolve
b1c0: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
b1d0: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
b1e0: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
b1f0: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
b200: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
b210: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
b220: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
b230: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
b240: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
b250: 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c  }.  memset(zCsr,
b260: 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a   0, zEnd-zCsr);.
b270: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
b280: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61  - (u8*)0)&7;.  a
b290: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
b2a0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
b2b0: 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  ) );.  p->expire
b2c0: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
b2d0: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
b2e0: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
b2f0: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
b300: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a  llocated in two.
b310: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
b320: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
b330: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
b340: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
b350: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
b360: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
b370: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
b380: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
b390: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
b3a0: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
b3b0: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
b3c0: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
b3d0: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
b3e0: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
b3f0: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20  ill in the rest 
b400: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c  using a fresh al
b410: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
b420: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
b430: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
b440: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
b450: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
b460: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
b470: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
b480: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b490: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
b4a0: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
b4b0: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68  y.  ** reduce th
b4c0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
b4d0: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
b4e0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
b4f0: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
b500: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   nByte = 0;.    
b510: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
b520: 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  pace(p->aMem, nM
b530: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  em*sizeof(Mem), 
b540: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b550: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  yte);.    p->aVa
b560: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
b570: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
b580: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
b590: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b5a0: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
b5b0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41  llocSpace(p->apA
b5c0: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
b5d0: 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  Mem*), &zCsr, zE
b5e0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b5f0: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
b600: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
b610: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
b620: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
b630: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b640: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
b650: 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e  pace(p->apCsr, n
b660: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
b670: 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20  beCursor*),.    
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e        &zCsr, zEn
b6a0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b6b0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
b6c0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e  llocSpace(p->aOn
b6d0: 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26  ceFlag, nOnce, &
b6e0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
b6f0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  te);.    if( nBy
b700: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  te ){.      p->p
b710: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
b720: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
b730: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
b740: 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65   zCsr = p->pFree
b750: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43  ;.    zEnd = &zC
b760: 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68  sr[nByte];.  }wh
b770: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
b780: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b790: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
b7a0: 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b   = (u16)nCursor;
b7b0: 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  p->nOnceFlag 
b7c0: 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70  = nOnce;.  if( p
b7d0: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  ->aVar ){.    p-
b7e0: 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
b7f0: 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Var;.    for(n=0
b800: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
b810: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b820: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
b830: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  l;.      p->aVar
b840: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
b850: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
b860: 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  azVar ){.    p->
b870: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
b880: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
b890: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
b8a0: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
b8b0: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
b8c0: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
b8d0: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
b8e0: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
b8f0: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
b900: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
b910: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
b920: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
b930: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
b940: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
b950: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
b960: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
b970: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
b980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
b990: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
b9a0: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
b9b0: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
b9c0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
b9d0: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
b9e0: 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20  MEM_Invalid;.   
b9f0: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
ba00: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
ba10: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
ba20: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
ba30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
ba40: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
ba50: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
ba60: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
ba70: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
ba80: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
ba90: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
baa0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
bab0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
bac0: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
bad0: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
bae0: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
baf0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
bb00: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
bb10: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
bb20: 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  x);.  if( pCx->p
bb30: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
bb40: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
bb50: 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68  >pBt);.    /* Th
bb60: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
bb70: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
bb80: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
bb90: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
bba0: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
bbb0: 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ve. */.  }else i
bbc0: 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  f( pCx->pCursor 
bbd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
bbe0: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
bbf0: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
bc00: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
bc10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
bc20: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56  LE.  if( pCx->pV
bc30: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  tabCursor ){.   
bc40: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
bc50: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
bc60: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75  r = pCx->pVtabCu
bc70: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rsor;.    const 
bc80: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
bc90: 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70  pModule = pCx->p
bca0: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
bcb0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
bcc0: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
bcd0: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
bce0: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
bcf0: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
bd00: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
bd10: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
bd20: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
bd30: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
bd40: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
bd50: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
bd60: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
bd70: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
bd80: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
bd90: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
bda0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
bdb0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
bdc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
bdd0: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
bde0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
bdf0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
be00: 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63  me->v;.  v->aOnc
be10: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
be20: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
be30: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
be40: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
be50: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
be60: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
be70: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
be80: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
be90: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
bea0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
beb0: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
bec0: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
bed0: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
bee0: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
bef0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
bf00: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
bf10: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
bf20: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
bf30: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
bf40: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
bf50: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
bf60: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
bf70: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
bf80: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
bf90: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
bfa0: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
bfb0: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
bfc0: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
bfd0: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
bfe0: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
bff0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
c000: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
c010: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
c020: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
c030: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
c040: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
c050: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
c060: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
c070: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
c080: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
c090: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
c0a0: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
c0b0: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
c0c0: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
c0d0: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
c0e0: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
c0f0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
c100: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
c110: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
c120: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
c130: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
c140: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
c150: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
c160: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
c170: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
c180: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
c190: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
c1a0: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
c1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
c1c0: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
c1d0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
c1e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
c1f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c200: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
c210: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c220: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
c230: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
c240: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
c250: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
c260: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
c270: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
c280: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
c290: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
c2a0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
c2b0: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
c2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
c2d0: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
c2e0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
c2f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c300: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
c310: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
c320: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
c330: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
c340: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
c350: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
c360: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
c370: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
c380: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
c390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c3a0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
c3b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c3c0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
c3d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
c3e0: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
c3f0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
c400: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
c410: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
c420: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
c430: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
c440: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
c450: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
c460: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
c470: 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
c480: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
c490: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
c4a0: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
c4b0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
c4c0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
c4d0: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
c4e0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
c4f0: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61  .flags==MEM_Inva
c500: 6c 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lid );.  }.#endi
c510: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
c520: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
c530: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
c540: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
c550: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
c560: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
c570: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
c580: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
c590: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
c5a0: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
c5b0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
c5c0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
c5d0: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
c5e0: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
c5f0: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
c600: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
c610: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
c620: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
c630: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
c640: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
c650: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
c660: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
c670: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
c680: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
c690: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
c6a0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
c6b0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c6c0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
c6d0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c6e0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
c6f0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
c700: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
c710: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
c720: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
c730: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c740: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
c750: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
c760: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
c770: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
c780: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
c790: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
c7a0: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
c7b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
c7c0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
c7d0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
c7e0: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
c7f0: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
c800: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
c810: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
c820: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
c830: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
c840: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c850: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
c860: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
c870: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
c880: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
c890: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
c8a0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
c8b0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
c8c0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
c8d0: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
c8e0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
c8f0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
c900: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
c910: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
c920: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
c930: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
c940: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
c950: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
c960: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
c970: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
c980: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
c990: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
c9a0: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
c9b0: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
c9c0: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
c9d0: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
c9e0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
c9f0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ca00: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
ca30: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
ca40: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
ca70: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
ca80: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
ca90: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cab0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
cac0: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
cad0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
cae0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
caf0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
cb00: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
cb10: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
cb20: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
cb30: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
cb40: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
cb50: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
cb60: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
cb70: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
cb80: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
cb90: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
cba0: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
cbb0: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
cbc0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
cbd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
cbe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
cbf0: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
cc00: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
cc10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cc20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
cc30: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
cc40: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
cc50: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
cc60: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
cc70: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
cc80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
cc90: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
cca0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
ccb0: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
ccc0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
ccd0: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
cce0: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
ccf0: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
cd00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cd10: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
cd20: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
cd30: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
cd40: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
cd50: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
cd60: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
cd70: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
cd80: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
cd90: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
cda0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
cdb0: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
cdc0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
cdd0: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
cde0: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
cdf0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
ce00: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
ce10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
ce20: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
ce30: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
ce40: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
ce50: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
ce60: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
ce70: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
ce80: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
ce90: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
cea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
ceb0: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
cec0: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
ced0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cee0: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
cef0: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
cf00: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
cf10: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
cf20: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
cf30: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
cf40: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
cf50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cf60: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
cf70: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
cf80: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
cf90: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
cfa0: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
cfb0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
cfc0: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
cfd0: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
cfe0: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
cff0: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
d000: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
d010: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
d020: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d030: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
d040: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
d050: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
d060: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
d070: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
d080: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
d090: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
d0a0: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
d0b0: 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a   &p->zErrMsg);..
d0c0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
d0d0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
d0e0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
d0f0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
d100: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
d110: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
d120: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
d130: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
d140: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
d150: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
d160: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
d170: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
d180: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
d190: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
d1a0: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
d1b0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
d1c0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
d1d0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
d1e0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
d1f0: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
d200: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
d210: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d220: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d230: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
d240: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d250: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d260: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
d270: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
d280: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
d290: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
d2a0: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
d2b0: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ++;.      rc = s
d2c0: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
d2d0: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
d2e0: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
d2f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d300: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d310: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
d320: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d330: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
d340: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
d350: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
d360: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
d370: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
d380: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
d390: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
d3a0: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
d3b0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
d3c0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
d3d0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d3e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d3f0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
d400: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
d410: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
d420: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
d430: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
d440: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
d450: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
d460: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
d470: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
d480: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
d490: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
d4a0: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
d4b0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
d4c0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
d4d0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d4e0: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
d4f0: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
d500: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
d510: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
d520: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
d530: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
d540: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
d550: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
d560: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
d570: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
d580: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
d590: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
d5a0: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
d5b0: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
d5c0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
d5d0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
d5e0: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
d5f0: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
d600: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
d610: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d620: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
d630: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
d640: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
d650: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
d660: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d670: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
d680: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
d690: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d6a0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
d6b0: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
d6c0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
d6d0: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
d6e0: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
d6f0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
d700: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
d710: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
d720: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
d730: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
d740: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
d750: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
d760: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
d770: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
d780: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
d790: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
d7a0: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
d7b0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d7c0: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
d7d0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
d7e0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d7f0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d800: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d810: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d820: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d830: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d840: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d850: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d860: 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
d870: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d880: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d890: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
d8a0: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
d8b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d8c0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
d8d0: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
d8e0: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
d8f0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
d900: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
d910: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
d920: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d930: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
d940: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
d950: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
d960: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
d970: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
d980: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
d990: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
d9a0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
d9b0: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
d9c0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
d9d0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
d9e0: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
d9f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
da00: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
da10: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
da20: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
da30: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
da40: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
da50: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
da60: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
da70: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
da80: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
da90: 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
daa0: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
dab0: 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
dac0: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
dad0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
dae0: 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
daf0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
db00: 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
db10: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
db20: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
db30: 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
db40: 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
db50: 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
db60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
db70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a  NOMEM;.    do {.
db80: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
db90: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
dba0: 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
dbb0: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
dbc0: 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
dbd0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
dbe0: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
dbf0: 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
dc00: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
dc10: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
dc20: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
dc30: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
dc40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
dc50: 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
dc60: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
dc70: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
dc80: 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
dc90: 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
dca0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
dcb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
dcc0: 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
dcd0: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
dce0: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
dcf0: 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
dd00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
dd10: 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
dd20: 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
dd30: 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
dd40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
dd70: 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
dd80: 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
dd90: 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
dda0: 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
ddb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ddc0: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
ddd0: 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
dde0: 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
ddf0: 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
de00: 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
de10: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
de20: 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
de30: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
de40: 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
de50: 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
de60: 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
de70: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
de80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
de90: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
dea0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
deb0: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
dec0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
ded0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dee0: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
def0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
df00: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
df10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
df20: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
df30: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
df40: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
df50: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
df60: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
df70: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
df80: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
df90: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
dfa0: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
dfb0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
dfc0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
dfd0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
dfe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
dff0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e000: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e010: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e020: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e030: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
e040: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
e050: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
e060: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
e070: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
e080: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
e090: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
e0a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
e0b0: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
e0c0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
e0d0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e0e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
e0f0: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
e100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
e110: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
e120: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
e130: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
e140: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
e150: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
e160: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
e170: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
e180: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
e190: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e1a0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e1b0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e1c0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e1d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e1e0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
e1f0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
e200: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
e210: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
e220: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
e230: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
e240: 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
e250: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
e260: 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
e270: 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
e280: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
e290: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
e2a0: 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
e2b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
e2c0: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
e2d0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
e2e0: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
e2f0: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
e300: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
e310: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e320: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
e330: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
e340: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
e350: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
e360: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
e370: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e380: 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
e390: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e3a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e3b0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
e3c0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
e3d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e3e0: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
e3f0: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
e400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e410: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
e420: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e430: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
e440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e450: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
e460: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e470: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
e480: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
e490: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
e4a0: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
e4b0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
e4c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
e4d0: 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d  Sync .     && 0=
e4e0: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
e4f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e500: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
e510: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
e520: 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
e530: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
e540: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
e550: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
e560: 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
e570: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
e580: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
e590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
e5a0: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
e5b0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
e5c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e5d0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e5e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e5f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
e600: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
e610: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
e620: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
e630: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
e640: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
e650: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
e660: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
e670: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
e680: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
e690: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
e6a0: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
e6b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e6c0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
e6d0: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
e6e0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
e6f0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
e700: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
e710: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e720: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
e730: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
e740: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
e750: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e760: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
e770: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
e780: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
e790: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
e7a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e7b0: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
e7c0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e7d0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
e7e0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
e7f0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
e800: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e810: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e820: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e830: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
e840: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e850: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e860: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e880: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e890: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
e8a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e8b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e8c0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
e8d0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
e8e0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
e8f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e900: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e910: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e920: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e930: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e940: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
e950: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e960: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
e970: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
e980: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
e990: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
e9a0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
e9b0: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
e9c0: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
e9d0: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
e9e0: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
e9f0: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
ea00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ea10: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
ea20: 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
ea30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ea40: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
ea50: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
ea60: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
ea70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ea80: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
ea90: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
eaa0: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
eab0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
eac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
ead0: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
eae0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
eaf0: 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
eb00: 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
eb10: 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
eb20: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
eb30: 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
eb40: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
eb50: 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
eb60: 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
eb70: 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
eb80: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
eb90: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
eba0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
ebb0: 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
ebc0: 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
ebd0: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
ebe0: 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
ebf0: 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
ec00: 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
ec10: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
ec20: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
ec30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
ec40: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
ec50: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
ec60: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
ec70: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
ec80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
ec90: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
eca0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
ecb0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ecc0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ecd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
ece0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
ecf0: 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
ed00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
ed10: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
ed20: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
ed30: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
ed40: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
ed50: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
ed60: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
ed70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ed80: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
ed90: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
eda0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
edb0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
edc0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
edd0: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
ede0: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
edf0: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
ee00: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
ee10: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
ee20: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
ee30: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
ee40: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
ee50: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
ee60: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
ee70: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
ee80: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
ee90: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
eea0: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
eeb0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
eec0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
eed0: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
eee0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
eef0: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
ef00: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
ef10: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
ef20: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
ef30: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
ef40: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
ef50: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
ef60: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
ef70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
ef80: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
ef90: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
efa0: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
efb0: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
efc0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
efd0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
efe0: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
eff0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
f000: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
f010: 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  e==db->writeVdbe
f020: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
f030: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
f040: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
f050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
f060: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
f070: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
f080: 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
f090: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
f0a0: 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
f0b0: 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
f0c0: 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
f0d0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
f0e0: 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
f0f0: 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
f100: 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
f110: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
f120: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
f130: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
f140: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
f150: 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
f160: 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
f170: 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
f180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
f190: 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ommtted..**.** I
f1a0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
f1b0: 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
f1c0: 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
f1d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f1e0: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
f1f0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
f200: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
f210: 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
f220: 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
f230: 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
f240: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
f250: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f260: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
f270: 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
f280: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
f290: 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
f2a0: 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
f2b0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f2c0: 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
f2d0: 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
f2e0: 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
f2f0: 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
f300: 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
f310: 61 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75  ave occured, cau
f320: 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
f330: 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
f340: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
f350: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
f360: 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
f370: 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
f380: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
f390: 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
f3a0: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
f3b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
f3c0: 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
f3d0: 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
f3e0: 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
f3f0: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
f400: 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
f410: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
f420: 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
f430: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
f440: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
f450: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
f460: 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
f470: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
f480: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
f490: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f4a0: 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
f4b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f4c0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
f4d0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
f4e0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
f4f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
f500: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
f510: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
f520: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
f530: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
f540: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
f550: 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
f560: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
f570: 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
f580: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f590: 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
f5a0: 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
f5b0: 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
f5c0: 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
f5d0: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
f5e0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
f5f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f600: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
f610: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
f620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
f630: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
f640: 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
f650: 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  nt = 0;..    if(
f660: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f670: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d  {.      if( eOp=
f680: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
f690: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ACK ){.        r
f6a0: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
f6b0: 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
f6c0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
f6d0: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f6e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f6f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f700: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f710: 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
f720: 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
f730: 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
f740: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
f750: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
f760: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
f770: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
f780: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
f790: 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
f7a0: 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
f7b0: 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
f7c0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
f7d0: 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
f7e0: 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
f7f0: 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
f800: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f810: 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
f820: 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
f830: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f840: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
f850: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
f860: 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
f870: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f880: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
f890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f8a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
f8b0: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
f8c0: 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
f8d0: 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
f8e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
f8f0: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
f900: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
f910: 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
f920: 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
f930: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
f940: 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
f950: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
f960: 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
f970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
f980: 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
f990: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
f9a0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
f9b0: 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
f9c0: 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
f9d0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
f9e0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
f9f0: 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
fa00: 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
fa10: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
fa20: 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e   and write.** an
fa30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
fa40: 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
fa50: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
fa60: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
fa70: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
fa80: 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
fa90: 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
faa0: 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
fab0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
fac0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
fad0: 64 65 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e  deferred && db->
fae0: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29  nDeferredCons>0)
faf0: 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
fb00: 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
fb10: 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e  nt>0) ){.    p->
fb20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
fb30: 54 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65  TRAINT;.    p->e
fb40: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
fb50: 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
fb60: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
fb70: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f  zErrMsg, db, "fo
fb80: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
fb90: 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
fba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
fbc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fbd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
fbe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
fbf0: 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
fc00: 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
fc10: 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
fc20: 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
fc30: 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
fc40: 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
fc50: 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
fc60: 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
fc70: 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
fc80: 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
fc90: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
fca0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
fcb0: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
fcc0: 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
fcd0: 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
fce0: 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
fcf0: 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
fd00: 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
fd10: 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
fd20: 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
fd30: 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
fd40: 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
fd50: 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
fd60: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
fd70: 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
fd80: 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
fd90: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
fda0: 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
fdb0: 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
fdc0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
fdd0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
fde0: 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
fdf0: 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
fe00: 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
fe10: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
fe20: 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
fe30: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
fe40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
fe50: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
fe70: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
fe80: 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
fe90: 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
fea0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
feb0: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
fec0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
fed0: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
fee0: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
fef0: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
ff00: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
ff10: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
ff20: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
ff30: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
ff40: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
ff50: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
ff60: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
ff70: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
ff80: 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
ff90: 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
ffa0: 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
ffb0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
ffc0: 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
ffd0: 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
ffe0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
fff0: 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
10000 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
10010 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
10020 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
10030 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
10040 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
10050 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
10060 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
10070 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
10080 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
10090 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
100a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
100b0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
100c0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
100d0 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
100e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
100f0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
10100 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
10110 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e    }.  if( p->aOn
10120 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28  ceFlag ) memset(
10130 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c  p->aOnceFlag, 0,
10140 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a   p->nOnceFlag);.
10150 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
10160 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
10170 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
10180 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
10190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
101a0 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
101b0 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
101c0 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
101d0 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
101e0 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
101f0 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
10200 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
10210 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
10220 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
10230 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
10240 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
10250 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
10260 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
10270 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
10280 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
10290 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
102a0 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
102b0 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
102c0 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
102d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
102e0 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
102f0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
10300 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
10310 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
10320 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
10330 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73   & 0xff;.    ass
10340 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
10350 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
10360 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72   );  /* This err
10370 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69  or no longer exi
10380 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65  sts */.    isSpe
10390 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
103a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
103b0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
103c0 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
103d0 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
103e0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
103f0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
10400 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
10410 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
10420 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
10430 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
10440 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
10450 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
10460 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
10470 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
10480 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
10490 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
104a0 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
104b0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
104c0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
104d0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
104e0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
104f0 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
10500 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
10510 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
10520 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
10530 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
10540 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
10550 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
10560 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
10570 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
10580 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
10590 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
105a0 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
105b0 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 69 6c 65  ** occured while
105c0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
105d0 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
105e0 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
105f0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
10600 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
10610 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
10620 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
10630 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
10640 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
10650 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
10660 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
10670 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
10680 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
10690 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
106a0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
106b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
106c0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
106d0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
106e0 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
106f0 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
10700 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
10710 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
10720 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
10730 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
10740 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
10750 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10760 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10770 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
10780 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
10790 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
107a0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
107b0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
107c0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
107d0 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
107e0 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
107f0 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
10800 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
10810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10820 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
10830 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
10840 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
10850 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10860 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
10870 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
10880 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
10890 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
108a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
108b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
108c0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
108d0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
108e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
108f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10910 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
10920 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
10930 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
10940 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
10950 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
10960 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
10970 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
10980 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
10990 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
109a0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
109b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
109c0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
109d0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
109e0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
109f0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
10a00 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
10a10 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
10a20 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
10a30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
10a40 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
10a50 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
10a60 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
10a70 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64    && db->writeVd
10a80 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f  beCnt==(p->readO
10a90 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
10aa0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
10ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
10ac0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10ad0 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
10ae0 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
10af0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10b00 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
10b10 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
10b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10b30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
10b40 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
10b50 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
10b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
10b70 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
10b80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10b90 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
10ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
10bb0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
10bc0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  AINT;.        }e
10bd0 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
10be0 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
10bf0 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
10c00 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
10c10 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
10c20 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
10c30 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
10c40 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
10c50 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
10c60 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
10c70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
10c80 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
10c90 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
10ca0 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
10cb0 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
10cc0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
10cd0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
10ce0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
10cf0 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
10d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10d10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
10d20 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
10d30 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
10d40 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
10d50 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
10d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
10d70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10d80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
10da0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
10db0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
10dc0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
10dd0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
10de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10df0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
10e00 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
10e10 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
10e20 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
10e30 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
10e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10e50 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
10e60 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
10e70 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _OK);.      }.  
10e80 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
10e90 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
10ea0 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
10eb0 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
10ec0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
10ed0 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
10ee0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
10ef0 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
10f00 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
10f10 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
10f20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
10f30 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
10f40 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
10f50 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
10f60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10f70 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
10f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10f90 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
10fa0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
10fb0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
10fc0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
10fd0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
10fe0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
10ff0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
11000 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
11010 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
11020 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
11030 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
11040 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
11050 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
11060 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
11070 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
11080 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
11090 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
110a0 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
110b0 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
110c0 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
110d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
110e0 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
110f0 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
11100 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
11110 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
11120 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
11130 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
11140 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
11150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11160 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
11170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11180 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
11190 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
111a0 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
111b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
111c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
111d0 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
111e0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
111f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
11200 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
11210 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11220 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
11230 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
11240 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
11250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
11260 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
11270 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
11280 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
11290 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
112a0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
112b0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
112c0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
112d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
112e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
112f0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
11300 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
11310 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
11320 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
11330 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
11340 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
11350 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11360 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
11370 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
11380 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
11390 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
113a0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
113b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
113c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
113d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
113e0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
113f0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
11400 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11410 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
11420 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
11430 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
11440 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
11450 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
11460 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
11470 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
11480 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
11490 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
114a0 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
114b0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
114c0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
114d0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
114e0 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
114f0 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20  eVdbeCnt--;.    
11500 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
11510 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72   ){.      db->wr
11520 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iteVdbeCnt--;.  
11530 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
11540 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
11550 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  t>=db->writeVdbe
11560 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Cnt );.  }.  p->
11570 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
11580 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
11590 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
115a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
115b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
115c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
115d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
115e0 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
115f0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
11600 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
11610 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
11620 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
11630 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
11640 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
11650 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
11660 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
11670 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
11680 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
11690 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
116a0 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
116b0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
116c0 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
116d0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
116e0 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
116f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
11700 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
11710 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
11720 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
11730 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
11740 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
11750 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
11760 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
11770 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
11780 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
11790 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
117a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
117b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
117c0 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
117d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
117e0 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
117f0 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
11800 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
11810 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
11820 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
11830 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
11840 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
11850 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
11860 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
11870 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
11880 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
11890 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
118a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
118b0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
118c0 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
118d0 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
118e0 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
118f0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
11900 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
11910 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
11920 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
11930 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
11940 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
11950 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
11960 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
11970 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11980 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
11990 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
119a0 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
119b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
119c0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
119d0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
119e0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
119f0 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c     u8 mallocFail
11a00 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
11a10 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74  ailed;.    sqlit
11a20 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
11a30 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
11a40 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
11a50 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
11a60 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
11a70 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
11a80 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
11a90 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
11aa0 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61  oc();.    db->ma
11ab0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
11ac0 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64  locFailed;.    d
11ad0 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
11ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
11af0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
11b00 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  c, 0);.  }.  ret
11b10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11b20 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
11b30 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
11b40 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
11b50 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
11b60 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
11b70 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
11b80 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
11b90 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
11ba0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
11bb0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
11bc0 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
11bd0 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
11be0 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
11bf0 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
11c00 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
11c10 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
11c20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
11c30 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
11c40 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
11c50 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
11c60 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
11c70 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
11c80 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
11c90 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
11ca0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
11cb0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
11cc0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
11cd0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
11ce0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
11cf0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
11d00 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
11d10 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
11d20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
11d30 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
11d40 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
11d50 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
11d60 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
11d70 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
11d80 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
11d90 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
11da0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
11db0 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
11dc0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
11dd0 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
11de0 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
11df0 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
11e00 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
11e10 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
11e20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
11e30 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
11e40 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
11e50 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
11e60 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
11e70 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
11e80 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
11e90 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
11ea0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
11eb0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
11ec0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  >pc>=0 ){.    sq
11ed0 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
11ee0 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73  rError(p);.    s
11ef0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11f00 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
11f10 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
11f20 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e  ;.    if( p->run
11f30 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78  OnlyOnce ) p->ex
11f40 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  pired = 1;.  }el
11f50 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
11f60 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
11f70 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
11f80 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
11f90 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
11fa0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
11fb0 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
11fc0 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
11fd0 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
11fe0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
11ff0 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
12000 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
12010 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
12020 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
12030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
12040 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
12050 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
12060 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
12070 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
12080 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
12090 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
120a0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
120b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
120c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
120d0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
120e0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
120f0 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
12100 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
12110 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
12120 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
12130 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
12140 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
12150 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
12160 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
12170 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
12180 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
12190 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
121a0 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
121b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
121c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
121d0 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
121e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
121f0 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
12200 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
12210 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
12220 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
12230 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
12240 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
12250 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
12260 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
12270 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
12280 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
12290 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
122a0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
122b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
122c0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
122d0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
122e0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
122f0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
12300 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
12310 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
12320 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
12330 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
12340 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
12350 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
12360 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
12370 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
12380 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
12390 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
123a0 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
123b0 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
123c0 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
123d0 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
123e0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
123f0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12400 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
12410 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
12420 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
12430 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
12440 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
12450 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
12460 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
12470 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12480 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
12490 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
124a0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
124b0 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
124c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
124d0 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
124e0 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
124f0 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
12500 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
12510 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
12520 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12530 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
12540 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
12550 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
12560 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
12570 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
12580 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
12590 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
125a0 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
125b0 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
125c0 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
125d0 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
125e0 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
125f0 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
12600 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
12610 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
12620 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
12630 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
12640 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
12650 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
12660 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
12670 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
12680 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
12690 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
126a0 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
126b0 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
126c0 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
126d0 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29  sk&(((u32)1)<<i)
126e0 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78  )) && pAux->pAux
126f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
12700 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
12710 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
12720 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
12730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12740 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a  pAux->pAux = 0;.
12750 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12760 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
12770 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
12780 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
12790 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
127a0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68   argument..** Th
127b0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
127c0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
127d0 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  on and sqlite3Vd
127e0 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68  beDelete() is th
127f0 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65  at.** VdbeDelete
12800 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20  () also unlinks 
12810 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
12820 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73  e list of VMs as
12830 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
12840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
12850 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
12860 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
12870 65 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  eteObject(sqlite
12880 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
12890 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
128a0 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Sub, *pNext;.  i
128b0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
128c0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
128d0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
128e0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
128f0 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
12900 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
12910 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
12920 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
12930 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
12940 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
12950 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
12960 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
12970 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
12980 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
12990 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
129a0 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
129b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
129c0 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  pSub);.  }.  for
129d0 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69  (i=p->nzVar-1; i
129e0 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65  >=0; i--) sqlite
129f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12a00 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65  zVar[i]);.  vdbe
12a10 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
12a20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
12a30 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12a40 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  (db, p->aLabel);
12a50 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12a60 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
12a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12a80 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
12a90 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12aa0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
12ab0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
12ac0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
12ad0 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65  XPLAIN).  sqlite
12ae0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
12af0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69  Explain);.  sqli
12b00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12b10 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64  >pExplain);.#end
12b20 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
12b30 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
12b40 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
12b50 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
12b60 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12b70 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
12b80 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
12b90 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
12ba0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
12bb0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
12bc0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
12bd0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
12be0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
12bf0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
12c00 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
12c10 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
12c20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
12c30 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
12c40 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
12c50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
12c60 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
12c70 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
12c80 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
12c90 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12ca0 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  teObject(db, p);
12cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
12cc0 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ure the cursor p
12cd0 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61   is ready to rea
12ce0 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72  d or write the r
12cf0 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a  ow to which it.*
12d00 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74  * was last posit
12d10 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ioned.  Return a
12d20 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
12d30 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20  an OOM fault or 
12d40 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65  I/O error.** pre
12d50 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f  vents us from po
12d60 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75  sitioning the cu
12d70 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72  rsor to its corr
12d80 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ect position..**
12d90 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
12da0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
12db0 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
12dc0 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
12dd0 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
12de0 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76   now.  If no mov
12df0 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68  e is pending, ch
12e00 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
12e10 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a  e row has been.*
12e20 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  * deleted out fr
12e30 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
12e40 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61  sor and if it ha
12e50 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20  s, mark the row 
12e60 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77  as.** a NULL row
12e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
12e80 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
12e90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
12ea0 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64   correct row and
12eb0 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a   that row has.**
12ec0 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65   not been delete
12ed0 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
12ee0 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65   the cursor, the
12ef0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
12f00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
12f10 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
12f20 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  sorMoveto(VdbeCu
12f30 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
12f40 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
12f50 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
12f60 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
12f70 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74  ITE_TEST.    ext
12f80 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
12f90 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
12fa0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
12fb0 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
12fc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12fd0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
12fe0 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
12ff0 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
13000 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
13010 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13020 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74   rc;.    p->last
13030 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74  Rowid = p->movet
13040 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28  oTarget;.    if(
13050 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
13060 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13070 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  BKPT;.    p->row
13080 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23  idIsValid = 1;.#
13090 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
130a0 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
130b0 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
130c0 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65  ndif.    p->defe
130d0 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
130e0 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
130f0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
13100 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c  ;.  }else if( AL
13110 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29  WAYS(p->pCursor)
13120 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d   ){.    int hasM
13130 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  oved;.    int rc
13140 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
13150 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
13160 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f  >pCursor, &hasMo
13170 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ved);.    if( rc
13180 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13190 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29    if( hasMoved )
131a0 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65  {.      p->cache
131b0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
131c0 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  TALE;.      p->n
131d0 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ullRow = 1;.    
131e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
131f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13200 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
13210 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
13220 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
13230 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
13240 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
13250 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
13260 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
13270 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
13280 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
13290 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
132a0 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
132b0 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
132c0 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
132d0 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
132e0 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
132f0 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
13300 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
13310 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
13320 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
13330 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
13340 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
13350 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
13360 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
13370 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
13380 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
13390 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
133a0 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
133b0 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
133c0 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
133d0 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
133e0 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
133f0 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
13400 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
13410 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
13420 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
13430 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
13440 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
13450 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
13460 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
13470 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
13480 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
13490 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
134a0 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
134b0 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
134c0 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
134d0 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a  lob seperately..
134e0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
134f0 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
13500 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
13510 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
13520 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
13530 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
13540 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
13550 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
13560 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
13570 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
13580 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
13590 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
135a0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
135b0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
135c0 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
135d0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
135e0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
135f0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13600 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
13630 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13640 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
13650 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
13660 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13670 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
136a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
136b0 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
136d0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
136e0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
136f0 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
13700 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
13710 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13720 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
13750 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
13760 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
13770 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
13780 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
13790 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
137a0 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
137b0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
137c0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
137d0 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
137e0 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
13810 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
13820 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
13830 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
13840 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
13850 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
13860 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
13870 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
13880 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
13890 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
138a0 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
138b0 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
138c0 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
138d0 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
138e0 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
138f0 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
13900 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
13910 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
13920 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
13930 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
13940 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13950 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
13960 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
13970 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
13980 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
13990 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  nt n;..  if( fla
139a0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
139b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
139c0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
139d0 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
139e0 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
139f0 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
13a00 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
13a10 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
13a20 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
13a30 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
13a40 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
13a50 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
13a60 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69  64 u;.    if( fi
13a70 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20  le_format>=4 && 
13a80 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20  (i&1)==i ){.    
13a90 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
13aa0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
13ab0 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66   i<0 ){.      if
13ac0 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29  ( i<(-MAX_6BYTE)
13ad0 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20   ) return 6;.   
13ae0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
13af0 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75  est prevents:  u
13b00 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36   = -(-9223372036
13b10 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20  854775808) */.  
13b20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20      u = -i;.    
13b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
13b40 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
13b50 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
13b60 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
13b70 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
13b80 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
13b90 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
13ba0 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
13bb0 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
13bc0 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
13bd0 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
13be0 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
13bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
13c00 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
13c10 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
13c20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
13c30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13c40 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
13c50 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
13c60 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
13c70 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
13c80 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
13c90 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
13ca0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13cb0 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
13cc0 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
13cd0 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
13ce0 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
13cf0 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
13d00 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
13d10 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
13d20 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
13d30 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
13d40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
13d50 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
13d60 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
13d70 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
13d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
13d90 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
13da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
13db0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
13dc0 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
13dd0 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
13de0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
13df0 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
13e00 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
13e10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
13e20 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
13e30 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
13e40 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
13e50 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
13e60 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
13e70 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
13e80 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
13e90 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
13ea0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
13eb0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
13ec0 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
13ed0 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
13ee0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
13ef0 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
13f00 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
13f10 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
13f20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
13f30 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
13f40 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
13f50 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
13f60 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
13f70 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
13f80 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
13f90 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
13fa0 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
13fb0 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
13fc0 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
13fd0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
13fe0 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
13ff0 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
14000 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
14010 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
14020 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
14030 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
14040 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
14050 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
14060 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
14070 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
14080 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
14090 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
140a0 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
140b0 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
140c0 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
140d0 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
140e0 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
140f0 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
14100 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
14110 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
14120 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
14130 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
14140 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
14150 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
14160 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
14170 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
14180 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
14190 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
141a0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
141b0 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
141c0 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
141d0 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
141e0 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
141f0 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
14200 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
14210 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
14220 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
14230 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
14240 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
14250 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
14260 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
14270 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
14280 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
14290 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
142a0 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
142b0 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
142c0 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
142d0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
142e0 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
142f0 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
14300 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
14310 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
14320 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
14330 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
14340 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
14350 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
14360 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
14370 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
14380 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
14390 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
143a0 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
143b0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
143c0 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
143d0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
143e0 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
143f0 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
14400 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
14410 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
14420 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
14430 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
14440 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
14450 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
14460 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
14470 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
14480 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
14490 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
144a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
144b0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
144c0 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
144d0 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
144e0 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
144f0 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
14500 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
14510 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
14520 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
14530 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
14540 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
14550 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
14560 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
14570 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14580 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
14590 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
145a0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
145b0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
145c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
145d0 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
145e0 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
145f0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
14600 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
14610 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
14620 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
14630 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
14640 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
14650 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
14660 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
14670 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
14680 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
14690 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
146a0 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42  ft in buf[].  nB
146b0 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  uf must always b
146c0 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67  e.** large enoug
146d0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  h to hold the en
146e0 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63  tire field.  Exc
146f0 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c  ept, if the fiel
14700 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77  d is.** a blob w
14710 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  ith a zero-fille
14720 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66  d tail, then buf
14730 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74  [] might be just
14740 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69   the right.** si
14750 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79  ze to hold every
14760 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72  thing except for
14770 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
14780 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d   tail.  If buf[]
14790 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20  .** is only big 
147a0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
147b0 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66  he non-zero pref
147c0 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ix, then only wr
147d0 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ite that.** pref
147e0 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  ix into buf[].  
147f0 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20  But if buf[] is 
14800 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
14810 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a  hold both the.**
14820 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20   prefix and the 
14830 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20  tail then write 
14840 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
14850 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61  et the tail to a
14860 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a  ll.** zeros..**.
14870 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14880 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
14890 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
148a0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
148b0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
148c0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
148d0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
148e0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
148f0 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
14900 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
14910 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
14920 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
14930 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14940 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e  lPut(u8 *buf, in
14950 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  t nBuf, Mem *pMe
14960 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
14970 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  at){.  u32 seria
14980 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
14990 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
149a0 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Mem, file_format
149b0 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  );.  u32 len;.. 
149c0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
149d0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
149e0 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
149f0 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
14a00 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
14a10 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
14a20 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
14a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14a40 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
14a50 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
14a60 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
14a70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
14a80 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
14a90 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
14aa0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14ab0 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
14ac0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
14ad0 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
14ae0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
14af0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
14b00 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28    assert( len<=(
14b10 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  u32)nBuf );.    
14b20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
14b30 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38      buf[i] = (u8
14b40 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
14b50 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
14b60 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
14b70 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
14b80 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
14b90 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
14ba0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
14bb0 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
14bc0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
14bd0 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
14be0 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
14bf0 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
14c00 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14c10 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
14c20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14c30 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b  pMem->n<=nBuf );
14c40 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
14c50 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
14c60 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
14c70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  );.    if( pMem-
14c80 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
14c90 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b  o ){.      len +
14ca0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
14cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
14cc0 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Buf>=0 );.      
14cd0 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e  if( len > (u32)n
14ce0 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
14cf0 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a  en = (u32)nBuf;.
14d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
14d10 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
14d20 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
14d30 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
14d40 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
14d50 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
14d60 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
14d70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
14d80 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
14d90 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
14da0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
14db0 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
14dc0 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
14dd0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
14de0 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
14df0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
14e00 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
14e10 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
14e20 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
14e30 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14e40 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
14e50 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
14e60 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
14e70 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
14e80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
14e90 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
14ea0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
14eb0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
14ee0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
14ef0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
14f00 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
14f10 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
14f20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
14f30 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
14f40 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
14f50 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
14f60 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
14f70 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
14f80 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
14f90 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
14fa0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
14fb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14fc0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
14fd0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14fe0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
14ff0 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
15000 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
15010 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15020 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
15030 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
15040 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
15050 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15060 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
15070 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
15080 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
15090 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
150a0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
150b0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
150c0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
150d0 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
150e0 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
150f0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
15100 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
15110 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
15120 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
15130 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
15140 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15150 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15160 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
15170 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
15180 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
15190 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
151a0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
151b0 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
151c0 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
151d0 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
151e0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
151f0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15200 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
15210 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
15220 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
15230 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15240 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
15250 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
15260 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
15270 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
15280 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
15290 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
152a0 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
152b0 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
152c0 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
152d0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
152e0 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
152f0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15300 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
15310 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
15320 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
15330 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15340 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
15350 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
15360 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
15370 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
15380 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
15390 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
153a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
153b0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
153c0 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
153d0 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
153e0 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
153f0 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
15400 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
15410 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
15420 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
15430 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
15440 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
15450 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
15460 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
15470 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
15480 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
15490 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
154a0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
154b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
154c0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
154d0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
154e0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
154f0 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
15500 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
15510 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
15520 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15530 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
15540 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
15550 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
15560 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
15570 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
15580 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
15590 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
155a0 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
155b0 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
155c0 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
155d0 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
155e0 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
155f0 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
15600 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
15610 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
15620 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
15630 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
15640 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
15650 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
15660 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15670 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
15680 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
15690 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
156a0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
156b0 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
156c0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
156d0 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
156e0 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
156f0 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
15700 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
15710 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
15720 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
15730 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
15740 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
15750 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
15760 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
15770 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
15780 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
15790 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
157a0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
157b0 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
157c0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
157d0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
157e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
157f0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
15800 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c  t: {.      u32 l
15810 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
15820 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
15830 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
15840 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
15850 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
15860 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
15870 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
15880 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
15890 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
158a0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
158b0 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
158c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
158d0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
158e0 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
158f0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
15900 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
15910 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15920 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
15930 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
15940 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
15950 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
15960 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
15970 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
15980 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
15990 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
159a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
159b0 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
159c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
159d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
159e0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
159f0 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
15a00 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
15a10 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
15a20 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
15a30 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
15a40 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
15a50 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
15a60 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
15a70 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
15a80 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
15a90 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
15aa0 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
15ab0 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
15ac0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
15ad0 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
15ae0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
15af0 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
15b00 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
15b10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
15b20 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
15b30 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
15b40 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
15b50 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
15b60 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
15b70 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
15b80 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
15b90 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
15ba0 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
15bb0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
15bc0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
15bd0 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
15be0 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
15bf0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
15c00 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
15c10 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
15c20 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
15c30 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
15c40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15c50 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65       /* Unaligne
15c60 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  d space availabl
15c70 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  e */.  int szSpa
15c80 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
15c90 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15ca0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
15cb0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  tes */.  char **
15cc0 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20  ppFree          
15cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15ce0 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66   Caller should f
15cf0 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ree this pointer
15d00 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
15d10 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
15d20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
15d30 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
15d40 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
15d50 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
15d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15d70 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62  crement pSpace b
15d80 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20  y nOff to align 
15d90 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  it */.  int nByt
15da0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15db0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15dc0 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
15dd0 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20  red for *p */.. 
15de0 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   /* We want to s
15df0 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
15e00 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
15e10 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
15e20 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
15e30 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
15e40 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
15e50 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
15e60 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
15e70 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
15e80 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
15e90 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
15ea0 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
15eb0 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
15ec0 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
15ed0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15ee0 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
15ef0 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  & 7;.  nByte = R
15f00 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
15f10 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20  ackedRecord)) + 
15f20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
15f30 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29  yInfo->nField+1)
15f40 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
15f50 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20  Space+nOff ){.  
15f60 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
15f70 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
15f80 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
15f90 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
15fa0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28  .    *ppFree = (
15fb0 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66  char *)p;.    if
15fc0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
15fd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
15fe0 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
15ff0 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d  d*)&pSpace[nOff]
16000 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
16010 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65  0;.  }..  p->aMe
16020 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61  m = (Mem*)&((cha
16030 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)[ROUND8(siz
16040 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
16050 72 64 29 29 5d 3b 0a 20 20 70 2d 3e 70 4b 65 79  rd))];.  p->pKey
16060 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
16070 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
16080 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
16090 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
160a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
160b0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
160c0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
160d0 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
160e0 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
160f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
16100 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
16110 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
16120 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
16130 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
16140 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
16150 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
16160 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
16170 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
16180 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
16190 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
161a0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
161b0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
161c0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
161d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
161e0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
161f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
16200 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
16210 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
16220 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
16230 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
16240 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
16250 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
16260 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
16270 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
16280 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
16290 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
162a0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
162b0 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
162e0 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
162f0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
16300 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16320 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
16330 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
16340 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
16350 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
16360 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  p->flags = 0;.  
16370 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
16380 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
16390 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
163a0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
163b0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
163c0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
163d0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
163e0 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
163f0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
16400 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16410 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
16420 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
16430 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
16440 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
16450 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
16460 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
16470 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
16480 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
16490 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
164a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
164b0 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
164c0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
164d0 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
164e0 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
164f0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16500 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
16510 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
16520 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
16530 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
16540 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
16550 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
16560 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
16570 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16580 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
16590 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
165a0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
165b0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
165c0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
165d0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
165e0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
165f0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
16600 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
16610 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
16620 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
16630 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
16640 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
16650 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
16660 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
16670 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
16680 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
16690 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
166a0 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
166b0 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
166c0 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
166d0 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
166e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
166f0 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
16700 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
16710 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
16720 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
16730 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
16740 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
16750 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
16760 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
16770 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
16780 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
16790 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
167a0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
167b0 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
167c0 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
167d0 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
167e0 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
167f0 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
16800 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
16810 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
16820 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
16830 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
16840 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
16850 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
16860 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
16870 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
16880 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
16890 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
168a0 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
168b0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
168c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
168d0 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
168e0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
168f0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
16900 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
16910 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
16920 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
16930 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69  ht key */.){.  i
16940 6e 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  nt d1;          
16950 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
16960 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
16970 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
16980 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
16990 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
169a0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
169b0 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
169c0 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
169d0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
169e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
169f0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
16a00 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69  i = 0;.  int nFi
16a10 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  eld;.  int rc = 
16a20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
16a30 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
16a40 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
16a50 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
16a60 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16a70 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
16a80 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
16a90 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
16aa0 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
16ab0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
16ac0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
16ad0 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
16ae0 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
16af0 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
16b00 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
16b10 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
16b20 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
16b30 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  1.zMalloc = 0; )
16b40 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
16b50 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
16b60 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
16b70 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
16b80 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
16b90 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
16ba0 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
16bb0 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
16bc0 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
16bd0 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
16be0 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
16bf0 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
16c00 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
16c10 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
16c20 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
16c30 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
16c40 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
16c50 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
16c60 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
16c70 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
16c80 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
16c90 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
16ca0 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
16cb0 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
16cc0 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
16cd0 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
16ce0 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
16cf0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
16d00 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
16d10 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
16d20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
16d30 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
16d40 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
16d50 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
16d60 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
16d70 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
16d80 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
16d90 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
16da0 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
16db0 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
16dc0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
16dd0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
16de0 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
16df0 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
16e00 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
16e10 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
16e20 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
16e30 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
16e40 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
16e50 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
16e60 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
16e70 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
16e80 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
16e90 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
16ea0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
16eb0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
16ec0 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
16ed0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
16ee0 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
16ef0 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
16f00 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
16f10 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16f20 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
16f30 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
16f40 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
16f50 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
16f60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
16f70 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
16f80 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
16f90 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
16fc0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
16fd0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
16fe0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
16ff0 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
17000 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
17010 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
17020 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
17030 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
17040 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
17050 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
17060 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
17070 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
17080 26 26 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70  && i<nField && p
17090 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
170a0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
170b0 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
170c0 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f    }.    .      /
170d0 2a 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f  * If the PREFIX_
170e0 53 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73  SEARCH flag is s
170f0 65 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64  et and all field
17100 73 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e  s except the fin
17110 61 6c 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  al.      ** rowi
17120 64 20 66 69 65 6c 64 20 77 65 72 65 20 65 71 75  d field were equ
17130 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74  al, then clear t
17140 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48  he PREFIX_SEARCH
17150 20 66 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20   flag and set . 
17160 20 20 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e       ** pPKey2->
17170 72 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c  rowid to the val
17180 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ue of the rowid 
17190 66 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c  field in (pKey1,
171a0 20 6e 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a   nKey1)..      *
171b0 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
171c0 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
171d0 65 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20  e opcode..      
171e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  */.      if( (pP
171f0 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
17200 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
17210 41 52 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b  ARCH) && i==(pPK
17220 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29  ey2->nField-1) )
17230 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17240 28 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26  ( idx1==szHdr1 &
17250 26 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20  & rc );.        
17260 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61  assert( mem1.fla
17270 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
17280 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
17290 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b  flags &= ~UNPACK
172a0 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
172b0 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79 32  ;.        pPKey2
172c0 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75  ->rowid = mem1.u
172d0 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
172e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
172f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
17300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  .  }..  /* No me
17310 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
17320 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
17330 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
17340 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
17350 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
17360 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
17370 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
17380 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
17390 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
173a0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
173b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
173c0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
173d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
173e0 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
173f0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
17400 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
17410 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
17420 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
17430 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
17440 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
17450 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
17460 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  l. If the UNPACK
17470 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20  ED_INCRKEY.  ** 
17480 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
17490 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
174a0 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
174b0 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a   as larger..  **
174c0 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
174d0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
174e0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
174f0 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
17500 70 72 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72  prefixes.  ** ar
17510 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
17520 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72  be equal.  Other
17530 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72  wise, the longer
17540 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a   key is the .  *
17550 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74  * larger.  As it
17560 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50   happens, the pP
17570 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73  Key2 will always
17580 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20   be the longer. 
17590 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20   ** if there is 
175a0 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  a difference..  
175b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  */.  assert( rc=
175c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65  =0 );.  if( pPKe
175d0 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
175e0 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a  CKED_INCRKEY ){.
175f0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d      rc = -1;.  }
17600 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
17610 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
17620 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29  D_PREFIX_MATCH )
17630 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72  {.    /* Leave r
17640 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  c==0 */.  }else 
17650 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
17660 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
17670 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17680 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  }. ../*.** pCur 
17690 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
176a0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
176b0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
176c0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
176d0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
176e0 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
176f0 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
17700 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
17710 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
17720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
17730 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
17740 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
17750 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
17760 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
17770 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
17780 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
17790 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
177a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
177b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
177c0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
177d0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
177e0 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
177f0 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
17800 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
17810 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
17820 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
17830 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
17840 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
17850 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
17860 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
17870 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
17880 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
17890 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
178a0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
178b0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
178c0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
178d0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
178e0 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
178f0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
17900 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a  METER(db);..  /*
17910 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
17920 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
17930 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
17940 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
17950 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
17960 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
17970 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
17980 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
17990 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
179a0 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
179b0 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
179c0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
179d0 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
179e0 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
179f0 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
17a00 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
17a10 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
17a20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
17a30 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17a40 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
17a50 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
17a60 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
17a70 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
17a80 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
17a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17aa0 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
17ab0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
17ac0 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
17ad0 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
17ae0 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
17af0 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
17b00 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
17b10 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
17b20 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
17b30 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
17b40 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73   entry */.  mems
17b50 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
17b60 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
17b70 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
17b80 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69  tree(pCur, 0, (i
17b90 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
17ba0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
17bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17bc0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
17bd0 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
17be0 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
17bf0 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
17c00 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
17c10 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
17c20 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
17c30 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
17c40 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
17c50 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17c60 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
17c70 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
17c80 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
17c90 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
17ca0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
17cb0 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
17cc0 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
17cd0 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
17ce0 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
17cf0 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
17d00 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
17d10 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
17d20 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
17d30 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
17d40 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
17d50 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
17d60 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
17d70 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17d80 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
17d90 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17da0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
17db0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
17dc0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17dd0 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
17de0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17df0 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
17e00 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17e10 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
17e20 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
17e30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
17e40 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
17e50 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
17e60 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
17e70 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
17e80 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
17e90 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
17ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17eb0 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
17ec0 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
17ed0 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
17ee0 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
17ef0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
17f00 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
17f10 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
17f20 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
17f30 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17f40 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
17f50 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
17f60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
17f70 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
17f80 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
17f90 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
17fa0 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
17fb0 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
17fc0 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
17fd0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
17fe0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
17ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
18000 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
18010 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18020 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
18030 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
18040 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
18050 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
18060 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
18070 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
18080 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
18090 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
180a0 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29  ( m.zMalloc!=0 )
180b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
180c0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
180d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
180e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
180f0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
18100 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
18110 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
18120 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
18130 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
18140 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
18150 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
18160 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
18170 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
18180 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
18190 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
181a0 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
181b0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
181c0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
181d0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
181e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
181f0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
18200 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
18210 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
18220 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
18230 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
18240 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
18250 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
18260 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
18270 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
18280 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
18290 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
182a0 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
182b0 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
182c0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
182d0 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
182e0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
182f0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
18300 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
18310 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
18320 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
18330 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73  pare(.  VdbeCurs
18340 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
18350 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
18360 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
18370 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
18380 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
18390 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ked,  /* Unpacke
183a0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
183b0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
183c0 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  nst */.  int *re
183d0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
183e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
183f0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
18400 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
18410 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
18420 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
18430 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
18440 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
18450 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
18460 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
18470 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
18480 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
18490 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
184a0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
184b0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
184c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
184d0 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
184e0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
184f0 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
18500 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
18510 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
18520 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
18530 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
18540 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
18550 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
18560 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
18570 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
18580 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
18590 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
185a0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
185b0 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
185c0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
185d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
185e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
185f0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
18600 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
18610 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
18620 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
18630 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
18640 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
18650 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
18660 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
18670 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
18680 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
18690 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
186a0 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
186b0 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
186c0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
186d0 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
186e0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
186f0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18700 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18720 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18730 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
18740 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
18750 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
18760 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
18770 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
18780 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
18790 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
187a0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
187b0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
187c0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
187d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
187e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
187f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18800 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
18810 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
18820 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
18830 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
18840 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
18850 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
18860 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
18870 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
18880 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
18890 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
188a0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
188b0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
188c0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
188d0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
188e0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
188f0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
18900 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
18910 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18920 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
18930 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
18940 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
18950 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
18960 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
18970 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
18980 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
18990 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
189a0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
189b0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
189c0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
189d0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
189e0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
189f0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
18a00 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
18a10 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
18a20 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
18a30 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
18a40 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
18a50 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
18a60 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
18a70 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
18a80 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
18a90 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
18aa0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
18ab0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
18ac0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
18ad0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
18ae0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
18af0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
18b00 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
18b10 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
18b20 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
18b30 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
18b40 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
18b50 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
18b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18b70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
18b80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
18b90 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
18ba0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
18bb0 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
18bc0 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
18bd0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
18be0 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
18bf0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
18c00 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
18c10 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
18c20 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
18c30 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
18c40 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
18c50 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
18c60 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
18c70 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
18c80 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
18c90 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
18ca0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
18cb0 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
18cc0 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
18cd0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
18ce0 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64  3VdbeGetValue(Vd
18cf0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
18d00 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
18d10 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
18d20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
18d30 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
18d40 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
18d50 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
18d60 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
18d70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18d80 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
18d90 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
18da0 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
18db0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
18dc0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
18dd0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
18de0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
18df0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
18e00 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
18e10 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
18e20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18e30 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
18e40 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
18e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18e60 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
18e70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
18e90 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
18ea0 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
18eb0 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
18ec0 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
18ed0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
18ee0 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
18ef0 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
18f00 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
18f10 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
18f20 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
18f30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18f40 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
18f50 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
18f60 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
18f70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
18f80 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
18f90 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
18fa0 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
18fb0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
18fc0 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
18fd0 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a              -1));.  }.}.