/ Hex Artifact Content
Login

Artifact 417ee0c5677188b3b72a0ccdda5668183e28bb51:


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 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f60: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0f70: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0f90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0fa0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0fb0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0fc0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0fd0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0fe0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0ff0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
1000: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1030: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1050: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1060: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1070: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1080: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1090: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
10a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
10c0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
10e0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
10f0: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1100: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1110: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1120: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1130: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1140: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1150: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1160: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1180: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11a0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
11b0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
11c0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
11d0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
11e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1210: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1230: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1240: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1250: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1260: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1270: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1280: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1290: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
12b0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
12c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
12d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
12f0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1310: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1340: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1350: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1360: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1380: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1390: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
13a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
13b0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
13c0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13e0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
13f0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1410: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1420: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1430: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1440: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1460: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1470: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1490: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
14a0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
14b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
14c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
14d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
14e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1500: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1510: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1520: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1540: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1550: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1560: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1570: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1580: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1590: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
15a0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
15b0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
15c0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
15d0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
15e0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
15f0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1600: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1610: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1620: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1630: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1640: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1650: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1660: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1670: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1680: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1690: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
16a0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
16b0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
16c0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
16d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
16e0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
16f0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1700: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1710: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1720: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1730: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1740: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1750: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1760: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1770: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1780: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1790: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
17a0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17c0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
17d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
17e0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
17f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1800: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1810: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1820: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1830: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1840: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1850: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1870: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1880: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
18c0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
18d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
18e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18f0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1900: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1910: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1920: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1930: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1940: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1950: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1960: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1970: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1980: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1990: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
19a0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
19b0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
19c0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
19d0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
19e0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
19f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1a00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1a20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1a30: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1a40: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1a80: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1a90: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1aa0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1ab0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ac0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64  nOp;.  }.}..#ifd
1ad0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1ae0: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
1af0: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
1b00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1b10: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
1b20: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
1b30: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1b40: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
1b50: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
1b60: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
1b70: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
1b80: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
1b90: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
1ba0: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
1bb0: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
1bc0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1bd0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1be0: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
1bf0: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
1c00: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
1c10: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
1c20: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
1c30: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
1c60: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
1c70: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
1c80: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
1c90: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
1ca0: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
1cb0: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
1cc0: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
1cd0: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
1ce0: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
1cf0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1d00: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
1d10: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
1d20: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
1d30: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
1d50: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
1d60: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
1d70: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
1d80: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
1d90: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1da0: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
1db0: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1dd0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1de0: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
1df0: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1e10: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
1e20: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
1e30: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
1e40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e50: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
1e60: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
1e70: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
1e80: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
1e90: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
1ea0: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
1eb0: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
1ec0: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
1ed0: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
1ee0: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
1ef0: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
1f00: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
1f10: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
1f20: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
1f30: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
1f40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f50: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
1f60: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
1f70: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
1f80: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
1f90: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
1fa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
1fb0: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
1fc0: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
1fd0: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
1fe0: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
1ff0: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2000: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
2010: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
2020: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
2030: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
2040: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
2050: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
2060: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
2070: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
2080: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2090: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
20a0: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
20b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
20c0: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
20d0: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
20e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20f0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2100: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2110: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2120: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
2130: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
2140: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
2150: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
2160: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
2170: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
2180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2190: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
21a0: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
21b0: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
21c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21d0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21e0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
21f0: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2200: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2210: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2220: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
2230: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
2240: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
2250: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
2260: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
2270: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
2280: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2290: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
22a0: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
22b0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
22c0: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
22d0: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
22e0: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
22f0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2300: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2310: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2320: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
2330: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
2340: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
2350: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
2360: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
2370: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
2380: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2390: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
23a0: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
23b0: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
23c0: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
23d0: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
23e0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
23f0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
2400: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
2410: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
2420: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
2430: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
2440: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
2450: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
2460: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
2470: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
2480: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2490: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
24a0: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
24b0: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
24c0: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
24d0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
24e0: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
24f0: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
2500: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
2510: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2520: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2530: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
2540: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
2550: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
2560: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
2570: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
2580: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
2590: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56  ;.  Op *pOp;.  V
25a0: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
25b0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72  .  memset(&sIter
25c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
25d0: 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d  r));.  sIter.v =
25e0: 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70   v;..  while( (p
25f0: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
2600: 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20  &sIter))!=0 ){. 
2610: 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20     int opcode = 
2620: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pOp->opcode;.   
2630: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2640: 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64  Destroy || opcod
2650: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c  e==OP_VUpdate ||
2660: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e   opcode==OP_VRen
2670: 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ame .#ifndef SQL
2680: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
2690: 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70  _KEY.     || (op
26a0: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
26b0: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
26c0: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20   && pOp->p2==1) 
26d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20  .#endif.     || 
26e0: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
26f0: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
2700: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
2710: 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d     && (pOp->p1==
2720: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2730: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
2740: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
2750: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
2760: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
2770: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2780: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
2790: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
27a0: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
27b0: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
27c0: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
27d0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
27e0: 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66  occured..  ** If
27f0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2800: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2810: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
2820: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
2830: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
2840: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
2850: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
2860: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
2870: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2880: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2890: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
28a0: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
28b0: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
28c0: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
28d0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
28e0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
28f0: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2900: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2910: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2920: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2930: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2940: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2950: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2960: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2970: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2980: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2990: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
29a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
29b0: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
29c0: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
29d0: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
29e0: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
29f0: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2a00: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2a10: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2a20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2a30: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2a40: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2a50: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2a60: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2a70: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2a80: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2a90: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2aa0: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2ab0: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2ac0: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2ad0: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2ae0: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2af0: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2b00: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2b10: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2b20: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2b30: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2b40: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2b50: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b70: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2b80: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2b90: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2ba0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2bb0: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2bc0: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2bd0: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2be0: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2bf0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2c00: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
2c10: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
2c20: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
2c30: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
2c40: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
2c50: 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20     pOp->opflags 
2c60: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
2c70: 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b  roperty[opcode];
2c80: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2c90: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20  =OP_Function || 
2ca0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
2cb0: 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ep ){.      if( 
2cc0: 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73  pOp->p5>nMaxArgs
2cd0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2ce0: 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65  p->p5;.    }else
2cf0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d00: 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70  Transaction && p
2d10: 4f 70 2d 3e 70 32 21 3d 30 20 29 7b 0a 20 20 20  Op->p2!=0 ){.   
2d20: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
2d30: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
2d40: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d50: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
2d60: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  f( opcode==OP_VU
2d70: 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69  pdate ){.      i
2d80: 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41  f( pOp->p2>nMaxA
2d90: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
2da0: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 65   pOp->p2;.    }e
2db0: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
2dc0: 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20  OP_VFilter ){.  
2dd0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2de0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20   assert( p->nOp 
2df0: 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20  - i >= 3 );.    
2e00: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
2e10: 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74  ].opcode==OP_Int
2e20: 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20  eger );.      n 
2e30: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
2e40: 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72      if( n>nMaxAr
2e50: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
2e60: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  n;.#endif.    }.
2e70: 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f  .    if( (pOp->o
2e80: 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a  pflags & OPFLG_J
2e90: 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e  UMP)!=0 && pOp->
2ea0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  p2<0 ){.      as
2eb0: 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32  sert( -1-pOp->p2
2ec0: 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  <p->nLabel );.  
2ed0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c      pOp->p2 = aL
2ee0: 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d  abel[-1-pOp->p2]
2ef0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2f00: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
2f10: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  b, p->aLabel);. 
2f20: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a   p->aLabel = 0;.
2f30: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
2f40: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a   = nMaxArgs;.}..
2f50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2f60: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2f70: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2f80: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2f90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2fa0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
2fb0: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
2fc0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2fd0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2fe0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
2ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
3000: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
3010: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3020: 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65   array of opcode
3030: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3040: 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61  h.** the Vdbe pa
3050: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3060: 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69  t argument. It i
3070: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
3080: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
3090: 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74  to arrange for t
30a0: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61  he returned arra
30b0: 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c  y to be eventual
30c0: 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74  ly freed using t
30d0: 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f  he .** vdbeFreeO
30e0: 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f  pArray() functio
30f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  n..**.** Before 
3100: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70  returning, *pnOp
3110: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
3120: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3130: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
3140: 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c  .** array. Also,
3150: 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65   *pnMaxArg is se
3160: 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20  t to the larger 
3170: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
3180: 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65  alue and .** the
3190: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
31a0: 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  es in the Vdbe.a
31b0: 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71  pArg[] array req
31c0: 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65  uired to execute
31d0: 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   the .** returne
31e0: 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64  d program..*/.Vd
31f0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
3200: 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62  eTakeOpArray(Vdb
3210: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c  e *p, int *pnOp,
3220: 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b   int *pnMaxArg){
3230: 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d  .  VdbeOp *aOp =
3240: 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72   p->aOp;.  asser
3250: 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62  t( aOp && !p->db
3260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3270: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
3280: 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  at sqlite3VdbeUs
3290: 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f  esBtree() was no
32a0: 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  t called on this
32b0: 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   VM */.  assert(
32c0: 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d 75 74 65   p->aMutex.nMute
32d0: 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  x==0 );..  resol
32e0: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
32f0: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
3300: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
3310: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
3320: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
3330: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
3340: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
3350: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
3360: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
3370: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
3380: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
3390: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
33a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
33b0: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
33c0: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
33d0: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29  List const *aOp)
33e0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  {.  int addr;.  
33f0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3400: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3410: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  T );.  if( p->nO
3420: 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70  p + nOp > p->nOp
3430: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
3440: 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72  rray(p) ){.    r
3450: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
3460: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  ddr = p->nOp;.  
3470: 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30  if( ALWAYS(nOp>0
3480: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
3490: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
34a0: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
34b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
34c0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
34d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
34e0: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
34f0: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
3500: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
3510: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
3520: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
3530: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
3540: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
3550: 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 73    if( p2<0 && (s
3560: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
3570: 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64  erty[pOut->opcod
3580: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
3590: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
35a0: 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b  Out->p2 = addr +
35b0: 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20   ADDR(p2);.     
35c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35d0: 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20  pOut->p2 = p2;. 
35e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
35f0: 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b  t->p3 = pIn->p3;
3600: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  .      pOut->p4t
3610: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
3620: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
3630: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  .p = 0;.      pO
3640: 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64  ut->p5 = 0;.#ifd
3650: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3660: 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d        pOut->zCom
3670: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ment = 0;.      
3680: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  if( sqlite3VdbeA
3690: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
36a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36b0: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64  PrintOp(0, i+add
36c0: 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64  r, &p->aOp[i+add
36d0: 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  r]);.      }.#en
36e0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
36f0: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d  >nOp += nOp;.  }
3700: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
3710: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3720: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3730: 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P1 operand for 
3740: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3750: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
3760: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
3770: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
3780: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
3790: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
37a0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
37c0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
37d0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
37e0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
37f0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
3800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3810: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
3820: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3830: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3840: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
3850: 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20  t( addr>=0 );.  
3860: 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20  if( p->nOp>addr 
3870: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3880: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
38a0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
38b0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
38c0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
38d0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
38e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
38f0: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
3900: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
3910: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3920: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
3930: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3940: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
3950: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3960: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
3970: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3980: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
3990: 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76  aOp[addr].p2 = v
39a0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
39b0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
39c0: 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72  e of the P3 oper
39d0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
39e0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
39f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3a00: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
3a10: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
3a20: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
3a30: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
3a40: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
3a50: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64    if( p->nOp>add
3a60: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3a70: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
3a80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3a90: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3aa0: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
3ab0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
3ac0: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
3ad0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
3ae0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3af0: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
3b00: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
3b10: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
3b20: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->aOp ){.    as
3b30: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
3b40: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
3b50: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b  nOp-1].p5 = val;
3b60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3b70: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
3b80: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
3b90: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
3ba0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
3bb0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3bc0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3bd0: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
3be0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3bf0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
3c00: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
3c10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
3c20: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
3c30: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
3c40: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
3c50: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
3c60: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
3c70: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
3c80: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
3c90: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
3ca0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
3cb0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
3cc0: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
3cd0: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
3ce0: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
3cf0: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
3d00: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
3d10: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
3d20: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
3d30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
3d40: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
3d50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
3d60: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
3d70: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
3d80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3d90: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
3da0: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
3db0: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
3dc0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
3dd0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  4type ){.      c
3de0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
3df0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
3e00: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3e10: 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63  MPRINTF:.      c
3e20: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
3e30: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
3e40: 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73  YINFO:.      cas
3e50: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20  e P4_INTARRAY:. 
3e60: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
3e70: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a  INFO_HANDOFF: {.
3e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3e90: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
3ea0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3eb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3ec0: 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a   P4_VDBEFUNC: {.
3ed0: 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e 63          VdbeFunc
3ee0: 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56   *pVdbeFunc = (V
3ef0: 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20  dbeFunc *)p4;.  
3f00: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
3f10: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
3f20: 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63  pVdbeFunc->pFunc
3f30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3f40: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
3f50: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
3f60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3f70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
3f80: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
3f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3fa0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
3fb0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
3fc0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3fd0: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
3fe0: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
3ff0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4000: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
4010: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  EM: {.        sq
4020: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
4030: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
4040: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
4050: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4060: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4070: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4080: 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61  3VtabUnlock((VTa
4090: 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20  ble *)p4);.     
40a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
40b0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
40c0: 53 55 42 50 52 4f 47 52 41 4d 20 3a 20 7b 0a 20  SUBPROGRAM : {. 
40d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
40e0: 62 65 50 72 6f 67 72 61 6d 44 65 6c 65 74 65 28  beProgramDelete(
40f0: 64 62 2c 20 28 53 75 62 50 72 6f 67 72 61 6d 20  db, (SubProgram 
4100: 2a 29 70 34 2c 20 31 29 3b 0a 20 20 20 20 20 20  *)p4, 1);.      
4110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4130: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
4140: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
4150: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
4160: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
4170: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
4180: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
4190: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
41a0: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
41b0: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
41c0: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
41d0: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
41e0: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
41f0: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
4200: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
4210: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
4220: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
4230: 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f   for(pOp=aOp; pO
4240: 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70  p<&aOp[nOp]; pOp
4250: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  ++){.      freeP
4260: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
4270: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23  e, pOp->p4.p);.#
4280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4290: 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
42a0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
42b0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
42c0: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
42d0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
42e0: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a  (db, aOp);.}../*
42f0: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
4300: 65 20 72 65 66 2d 63 6f 75 6e 74 20 6f 6e 20 74  e ref-count on t
4310: 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74  he SubProgram st
4320: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
4330: 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  s the.** second 
4340: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65  argument. If the
4350: 20 72 65 66 2d 63 6f 75 6e 74 20 72 65 61 63 68   ref-count reach
4360: 65 73 20 7a 65 72 6f 2c 20 66 72 65 65 20 74 68  es zero, free th
4370: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
4380: 2a 2a 20 54 68 65 20 61 72 72 61 79 20 6f 66 20  ** The array of 
4390: 56 44 42 45 20 6f 70 63 6f 64 65 73 20 73 74 6f  VDBE opcodes sto
43a0: 72 65 64 20 61 73 20 53 75 62 50 72 6f 67 72 61  red as SubProgra
43b0: 6d 2e 61 4f 70 20 69 73 20 66 72 65 65 64 20 69  m.aOp is freed i
43c0: 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20  f.** either the 
43d0: 72 65 66 2d 63 6f 75 6e 74 20 72 65 61 63 68 65  ref-count reache
43e0: 73 20 7a 65 72 6f 20 6f 72 20 70 61 72 61 6d 65  s zero or parame
43f0: 74 65 72 20 66 72 65 65 6f 70 20 69 73 20 6e 6f  ter freeop is no
4400: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 53 69  n-zero..**.** Si
4410: 6e 63 65 20 74 68 65 20 61 72 72 61 79 20 6f 66  nce the array of
4420: 20 6f 70 63 6f 64 65 73 20 70 6f 69 6e 74 65 64   opcodes pointed
4430: 20 74 6f 20 62 79 20 53 75 62 50 72 6f 67 72 61   to by SubProgra
4440: 6d 2e 61 4f 70 20 6d 61 79 20 64 69 72 65 63 74  m.aOp may direct
4450: 6c 79 0a 2a 2a 20 6f 72 20 69 6e 64 69 72 65 63  ly.** or indirec
4460: 74 6c 79 20 63 6f 6e 74 61 69 6e 20 61 20 72 65  tly contain a re
4470: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 53  ference to the S
4480: 75 62 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74  ubProgram struct
4490: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 42  ure itself..** B
44a0: 79 20 70 61 73 73 69 6e 67 20 61 20 6e 6f 6e 2d  y passing a non-
44b0: 7a 65 72 6f 20 66 72 65 65 6f 70 20 70 61 72 61  zero freeop para
44c0: 6d 65 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65  meter, the calle
44d0: 72 20 6d 61 79 20 65 6e 73 75 72 65 20 74 68 61  r may ensure tha
44e0: 74 20 61 6c 6c 0a 2a 2a 20 53 75 62 50 72 6f 67  t all.** SubProg
44f0: 72 61 6d 20 73 74 72 75 63 74 75 72 65 73 20 61  ram structures a
4500: 6e 64 20 74 68 65 69 72 20 61 4f 70 20 61 72 72  nd their aOp arr
4510: 61 79 73 20 61 72 65 20 66 72 65 65 64 2c 20 65  ays are freed, e
4520: 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ven when there.*
4530: 2a 20 61 72 65 20 73 75 63 68 20 63 69 72 63 75  * are such circu
4540: 6c 61 72 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  lar references..
4550: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4560: 64 62 65 50 72 6f 67 72 61 6d 44 65 6c 65 74 65  dbeProgramDelete
4570: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 75  (sqlite3 *db, Su
4580: 62 50 72 6f 67 72 61 6d 20 2a 70 2c 20 69 6e 74  bProgram *p, int
4590: 20 66 72 65 65 6f 70 29 7b 0a 20 20 69 66 28 20   freeop){.  if( 
45a0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
45b0: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
45c0: 20 20 69 66 28 20 66 72 65 65 6f 70 20 7c 7c 20    if( freeop || 
45d0: 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  p->nRef==1 ){.  
45e0: 20 20 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70 2d      Op *aOp = p-
45f0: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 70 2d 3e 61  >aOp;.      p->a
4600: 4f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 76 64  Op = 0;.      vd
4610: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
4620: 2c 20 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  , aOp, p->nOp);.
4630: 20 20 20 20 20 20 70 2d 3e 6e 4f 70 20 3d 20 30        p->nOp = 0
4640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
4650: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
4660: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
4670: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4680: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  (db, p);.    }. 
4690: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   }.}.../*.** Cha
46a0: 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74  nge N opcodes st
46b0: 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74  arting at addr t
46c0: 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69  o No-ops..*/.voi
46d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
46e0: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
46f0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
4700: 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f   N){.  if( p->aO
4710: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
4720: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
4730: 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr];.    sqlite
4740: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
4750: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b     while( N-- ){
4760: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4770: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4780: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20  Op->p4.p);.     
4790: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
47a0: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
47b0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  .      pOp->opco
47c0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
47d0: 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d      pOp++;.    }
47e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
47f0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4800: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
4810: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4820: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4830: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4840: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
4850: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
4860: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4870: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4880: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4890: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
48a0: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
48b0: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
48c0: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
48d0: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
48e0: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
48f0: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
4900: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
4910: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
4920: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
4930: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4940: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
4950: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
4960: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
4970: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
4980: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
4990: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
49a0: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
49b0: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
49c0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
49d0: 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP4..**.** If n=
49e0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P4_KEYINFO it m
49f0: 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73  eans that zP4 is
4a00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4a10: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4a20: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
4a30: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
4a40: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
4a50: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4a60: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
4a70: 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  e3_malloc, to be
4a80: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4a90: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
4aa0: 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49  d..** n==P4_KEYI
4ab0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
4ac0: 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70  cates that zP4 p
4ad0: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
4ae0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
4af0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
4b00: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
4b10: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
4b20: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4b30: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
4b40: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
4b50: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
4b60: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
4b70: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
4b80: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
4b90: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
4ba0: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
4bb0: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
4bc0: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
4bd0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4be0: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
4bf0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
4c00: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
4c10: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
4c20: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
4c30: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
4c40: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
4c50: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
4c60: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
4c70: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
4c80: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
4c90: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
4ca0: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
4cb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4cc0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
4cd0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
4ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
4cf0: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
4d00: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
4d10: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
4d20: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
4d30: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
4d40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4d50: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
4d60: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
4d70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4d80: 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f  .    if ( n!=P4_
4d90: 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34  KEYINFO && n!=P4
4da0: 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20  _VTAB ) {.      
4db0: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
4dc0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
4dd0: 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P4);.    }.    r
4de0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4df0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
4e00: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
4e10: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
4e20: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
4e30: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
4e40: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
4e50: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
4e60: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4e70: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4e80: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
4e90: 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49  0;.  if( n==P4_I
4ea0: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
4eb0: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
4ec0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
4ed0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
4ee0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
4ef0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
4f00: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
4f10: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
4f20: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
4f30: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
4f40: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
4f50: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
4f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
4f70: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  4==0 ){.    pOp-
4f80: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
4f90: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
4fa0: 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65  NOTUSED;.  }else
4fb0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
4fc0: 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  FO ){.    KeyInf
4fd0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
4fe0: 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79   int nField, nBy
4ff0: 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20  te;..    nField 
5000: 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34  = ((KeyInfo*)zP4
5010: 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e  )->nField;.    n
5020: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
5030: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65  KeyInfo) + (nFie
5040: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65  ld-1)*sizeof(pKe
5050: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29  yInfo->aColl[0])
5060: 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70   + nField;.    p
5070: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
5080: 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  3Malloc( nByte )
5090: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b  ;.    pOp->p4.pK
50a0: 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
50b0: 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  o;.    if( pKeyI
50c0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20  nfo ){.      u8 
50d0: 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  *aSortOrder;.   
50e0: 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e     memcpy(pKeyIn
50f0: 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b  fo, zP4, nByte);
5100: 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65  .      aSortOrde
5110: 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  r = pKeyInfo->aS
5120: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
5130: 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29  if( aSortOrder )
5140: 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  {.        pKeyIn
5150: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
5160: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
5170: 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  )&pKeyInfo->aCol
5180: 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  l[nField];.     
5190: 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e     memcpy(pKeyIn
51a0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  fo->aSortOrder, 
51b0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65  aSortOrder, nFie
51c0: 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
51d0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
51e0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20   P4_KEYINFO;.   
51f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
5200: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5210: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70  d = 1;.      pOp
5220: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
5230: 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  TUSED;.    }.  }
5240: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5250: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29  EYINFO_HANDOFF )
5260: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5270: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5280: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5290: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P4_KEYINFO;.  }e
52a0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54  lse if( n==P4_VT
52b0: 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  AB ){.    pOp->p
52c0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
52d0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
52e0: 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20  e = P4_VTAB;.   
52f0: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
5300: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b  ((VTable *)zP4);
5310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56  .    assert( ((V
5320: 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62  Table *)zP4)->db
5330: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c  ==p->db );.  }el
5340: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
5350: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5360: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5370: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
5380: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
5390: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
53a0: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
53b0: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
53c0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
53d0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
53e0: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
53f0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5400: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
5410: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
5420: 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  UG./*.** Change 
5430: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
5440: 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  he the most rece
5450: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
5460: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
5470: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
5480: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
5490: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
54a0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
54b0: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
54c0: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
54d0: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
54e0: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
54f0: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
5500: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
5510: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
5520: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
5530: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
5540: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
5550: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
5560: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
5570: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rn;.  assert( p-
5580: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
5590: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
55a0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
55b0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
55c0: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
55d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
55e0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
55f0: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  p ){.    char **
5600: 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  pz = &p->aOp[p->
5610: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b  nOp-1].zComment;
5620: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
5630: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
5640: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
5650: 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a  >db, *pz);.    *
5660: 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  pz = sqlite3VMPr
5670: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
5680: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5690: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
56a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
56b0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
56c0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
56d0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
56e0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
56f0: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
5700: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5710: 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(p, OP_Noop)
5720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
5730: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
5740: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5750: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
5760: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5770: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
5780: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5790: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
57a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
57b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
57c0: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
57d0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
57e0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
57f0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5800: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  b, *pz);.    *pz
5810: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
5820: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
5830: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
5840: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
5850: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
5860: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
5870: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
5880: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
5890: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
58a0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
58b0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
58c0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
58d0: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
58e0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
58f0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
5900: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
5910: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
5920: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
5930: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
5940: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
5950: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
5960: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
5970: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
5980: 65 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2c 20  e and writable, 
5990: 62 75 74 20 69 74 20 68 61 73 20 6e 6f 20 65 66  but it has no ef
59a0: 66 65 63 74 2e 20 20 54 68 65 20 72 65 74 75 72  fect.  The retur
59b0: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 0a 2a 2a 20  n of a dummy.** 
59c0: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
59d0: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
59e0: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 20 61  ue functioning a
59f0: 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74  fter a OOM fault
5a00: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5a10: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5a20: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5a30: 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74 69   from this routi
5a40: 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f  ne is a valid po
5a50: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f  inter..**.** Abo
5a60: 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53 51  ut the #ifdef SQ
5a70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a  LITE_OMIT_TRACE:
5a80: 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
5a90: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
5aa0: 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65  r called.** unle
5ab0: 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68  ss p->nOp>0.  Th
5ac0: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
5ad0: 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20   the absense of 
5ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
5af0: 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63  E,.** an OP_Trac
5b00: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  e instruction is
5b10: 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64   always inserted
5b20: 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 47   by sqlite3VdbeG
5b30: 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a  et() as soon as.
5b40: 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69 73  ** a new VDBE is
5b50: 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65   created.  So we
5b60: 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65 74   are free to set
5b70: 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d   addr to p->nOp-
5b80: 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76  1 without.** hav
5b90: 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68  ing to double-ch
5ba0: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
5bb0: 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
5bc0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
5bd0: 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49  . But.** if SQLI
5be0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73  TE_OMIT_TRACE is
5bf0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50   defined, the OP
5c00: 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65  _Trace is omitte
5c10: 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64  d and we do need
5c20: 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65   to.** check the
5c30: 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70   value of p->nOp
5c40: 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  -1 before contin
5c50: 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  uing..*/.VdbeOp 
5c60: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
5c70: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
5c80: 64 64 72 29 7b 0a 20 20 73 74 61 74 69 63 20 56  ddr){.  static V
5c90: 64 62 65 4f 70 20 64 75 6d 6d 79 3b 0a 20 20 61  dbeOp dummy;.  a
5ca0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
5cb0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
5cc0: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
5cd0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
5ce0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
5cf0: 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29   if( p->nOp==0 )
5d00: 20 72 65 74 75 72 6e 20 26 64 75 6d 6d 79 3b 0a   return &dummy;.
5d10: 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20  #endif.    addr 
5d20: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5d30: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
5d40: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
5d50: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
5d60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5d70: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
5d80: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
5d90: 72 65 74 75 72 6e 20 26 64 75 6d 6d 79 3b 0a 20  return &dummy;. 
5da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
5db0: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
5dc0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
5dd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5de0: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
5df0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
5e00: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
5e10: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
5e20: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
5e30: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
5e40: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
5e50: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
5e60: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
5e70: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
5e80: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
5e90: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
5ea0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
5eb0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
5ec0: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
5ed0: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
5ee0: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
5ef0: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
5f00: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
5f10: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
5f20: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
5f30: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
5f40: 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a  _KEYINFO_STATIC:
5f50: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
5f60: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
5f70: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
5f80: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
5f90: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
5fa0: 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
5fb0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
5fc0: 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66  , zTemp, "keyinf
5fd0: 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  o(%d", pKeyInfo-
5fe0: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
5ff0: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
6000: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  n30(zTemp);.    
6010: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
6020: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
6030: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
6040: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
6050: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
6060: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
6070: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
6080: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
6090: 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e  Strlen30(pColl->
60a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
60b0: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
60c0: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  6 ){.           
60d0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
60e0: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
60f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6100: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6110: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6120: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
6130: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
6140: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b  aSortOrder && pK
6150: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
6160: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
6170: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
6180: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20  = '-';.         
6190: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
61a0: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70  cpy(&zTemp[i], p
61b0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29  Coll->zName,n+1)
61c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
61d0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
61e0: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
61f0: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
6200: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
6210: 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20  ",nil",4);.     
6220: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
6230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6240: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
6250: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
6260: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
6270: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
6280: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
6290: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
62a0: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
62b0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
62c0: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
62d0: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
62e0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
62f0: 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65  , zTemp, "collse
6300: 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  q(%.20s)", pColl
6310: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
6320: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6330: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
6340: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
6350: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
6360: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
6370: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6380: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6390: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
63a0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
63b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
63c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
63d0: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
63e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
63f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6400: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
6410: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
6420: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6430: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
6440: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6450: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6460: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
6470: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
6480: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6490: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
64a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
64b0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
64c0: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
64d0: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
64e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
64f0: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
6500: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
6510: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
6520: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6530: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
6540: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20  EM_Null)==0 );. 
6550: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
6560: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
6570: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
6580: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
6590: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
65a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
65b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
65c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
65d0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
65e0: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
65f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6600: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
6610: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
6620: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6630: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6640: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
6650: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6660: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
6670: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6680: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
6690: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
66a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
66b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
66c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
66d0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
66e0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
66f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
6700: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
6710: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
6720: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6730: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6740: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
6750: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
6760: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
6770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6780: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6790: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
67a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
67b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
67c0: 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b  mp, "intarray");
67d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
67e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
67f0: 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20  SUBPROGRAM: {.  
6800: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6810: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6820: 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  p, "program");. 
6830: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6840: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6850: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
6860: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
6870: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
6880: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
6890: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
68a0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
68b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
68c0: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
68d0: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
68e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  dif../*.** Decla
68f0: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
6900: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
6910: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
6920: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76  i] is used..*/.v
6930: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
6940: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
6950: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20  , int i){.  int 
6960: 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20  mask;.  assert( 
6970: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
6980: 3e 6e 44 62 20 26 26 20 69 3c 73 69 7a 65 6f 66  >nDb && i<sizeof
6990: 28 75 33 32 29 2a 38 20 29 3b 0a 20 20 61 73 73  (u32)*8 );.  ass
69a0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
69b0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
69c0: 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28  *8 );.  mask = (
69d0: 28 75 33 32 29 31 29 3c 3c 69 3b 0a 20 20 69 66  (u32)1)<<i;.  if
69e0: 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
69f0: 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
6a00: 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c    p->btreeMask |
6a10: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69  = mask;.    sqli
6a20: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
6a30: 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75  ayInsert(&p->aMu
6a40: 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b  tex, p->db->aDb[
6a50: 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  i].pBt);.  }.}..
6a60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
6a70: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
6a80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
6a90: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
6aa0: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
6ab0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
6ac0: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
6ad0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
6ae0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
6af0: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
6b00: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
6b10: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b  p){.  char *zP4;
6b20: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
6b30: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
6b40: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
6b50: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
6b60: 20 25 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e   %4d %4d %-4s %.
6b70: 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  2X %s\n";.  if( 
6b80: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
6b90: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d   stdout;.  zP4 =
6ba0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
6bb0: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
6bc0: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
6bd0: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
6be0: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
6bf0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
6c00: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
6c10: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
6c20: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
6c30: 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5,.#ifdef SQLITE
6c40: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70  _DEBUG.      pOp
6c50: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70  ->zComment ? pOp
6c60: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a  ->zComment : "".
6c70: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23  #else.      "".#
6c80: 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c  endif.  );.  ffl
6c90: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
6ca0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
6cb0: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
6cc0: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
6cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
6ce0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
6cf0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
6d00: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
6d10: 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20   Mem *pEnd;.    
6d20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
6d30: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
6d40: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
6d50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
6d60: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
6d70: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
6d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
6d90: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
6da0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
6db0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
6dc0: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
6dd0: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
6de0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
6df0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
6e00: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
6e10: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
6e20: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
6e30: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
6e40: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
6e50: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
6e60: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
6e70: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
6e80: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
6e90: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
6ea0: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
6eb0: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
6ec0: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
6ed0: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
6ee0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
6ef0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
6f00: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
6f10: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
6f20: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
6f30: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
6f40: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
6f50: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
6f60: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
6f70: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
6f80: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
6f90: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
6fa0: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
6fb0: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
6fc0: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
6fd0: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
6fe0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
6ff0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7000: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7010: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7020: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7030: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
7040: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
7050: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
7060: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
7070: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
7080: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7090: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
70a0: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
70b0: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
70c0: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
70d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
70e0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
70f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7100: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7120: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7130: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7140: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7150: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7160: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
7170: 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  }.    db->malloc
7180: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
7190: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
71a0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
71b0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
71c0: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
71d0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
71e0: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
71f0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
7200: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
7210: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
7220: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7230: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
7240: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
7250: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
7260: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
7270: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
7280: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
7290: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
72a0: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
72b0: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
72c0: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
72d0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
72e0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
72f0: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
7300: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
7310: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
7320: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
7330: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
7340: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
7350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7360: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
7370: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
7380: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
7390: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
73a0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
73b0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
73c0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
73d0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
73e0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
73f0: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
7400: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
7410: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
7420: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
7430: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
7440: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
7450: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
7460: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
7470: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
7480: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
7490: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
74a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
74b0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
74c0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
74d0: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
74e0: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
74f0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
7500: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
7510: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
7520: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
7530: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
7540: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
7550: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
7560: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
7570: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
7580: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
7590: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
75a0: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
75b0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
75c0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
75d0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
7600: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
7630: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
7640: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
7650: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7680: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
7690: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
76a0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
76b0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
76c0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
76d0: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
76e0: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
7710: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
7720: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
7730: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
7740: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
7750: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
7760: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7770: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
77a0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
77b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
77c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
77d0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
77e0: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
77f0: 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74   = p->pResultSet
7800: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
7810: 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66   /* First Mem of
7820: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
7830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
7840: 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lain );.  assert
7850: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
7860: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20  _MAGIC_RUN );.  
7870: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
7880: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
7890: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
78a0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
78b0: 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45  NOMEM );..  /* E
78c0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20  ven though this 
78d0: 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  opcode does not 
78e0: 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69  use dynamic stri
78f0: 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ngs for.  ** the
7900: 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20   result, result 
7910: 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f  columns may beco
7920: 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68  me dynamic if th
7930: 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a  e user calls.  *
7940: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
7950: 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69  _text16(), causi
7960: 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  ng a translation
7970: 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64   to UTF-16 encod
7980: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ing..  */.  rele
7990: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d  aseMemArray(pMem
79a0: 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  , 8);..  if( p->
79b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
79c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
79d0: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
79e0: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
79f0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
7a00: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
7a10: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
7a20: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
7a30: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
7a40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7a50: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
7a60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7a70: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
7a80: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
7a90: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
7aa0: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
7ab0: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
7ac0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
7ad0: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
7ae0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
7af0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
7b00: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
7b10: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
7b20: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
7b30: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
7b40: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
7b50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
7b60: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
7b70: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
7b80: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
7b90: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
7ba0: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
7bb0: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
7bc0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
7bd0: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
7be0: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
7bf0: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
7c00: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
7c10: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
7c20: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
7c30: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
7c40: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
7c50: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
7c60: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
7c70: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
7c80: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
7c90: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
7ca0: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
7cb0: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
7cc0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
7cd0: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
7ce0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
7cf0: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
7d00: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
7d10: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
7d20: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
7d30: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
7d40: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
7d50: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
7d60: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
7d70: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
7d80: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
7d90: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
7da0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
7db0: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
7dc0: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
7dd0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
7de0: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
7df0: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
7e00: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
7e10: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
7e20: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
7e30: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
7e40: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
7e50: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
7e60: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
7e70: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
7e80: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
7e90: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
7ea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
7eb0: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
7ec0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
7ed0: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
7ee0: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
7ef0: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
7f00: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
7f10: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
7f20: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
7f30: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7f40: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
7f50: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
7f60: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
7f70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
7f80: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
7f90: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
7fa0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
7fb0: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
7fc0: 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69  , db, "%s", sqli
7fd0: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
7fe0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7ff0: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20  char *z;.    Op 
8000: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
8010: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
8020: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
8030: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
8040: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
8050: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
8060: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
8070: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
8080: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
8090: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
80a0: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
80b0: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
80c0: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
80d0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
80e0: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
80f0: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
8100: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
8110: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
8120: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
8130: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
8140: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
8150: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
8160: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
8170: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
8180: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
8190: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
81a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
81b0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
81c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
81d0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
81e0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
81f0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8200: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
8210: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
8240: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
8250: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
8260: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8270: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
8280: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
8290: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
82a0: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
82b0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
82c0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
82d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
82e0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
82f0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
8300: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
8310: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
8320: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
8330: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
8340: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
8350: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
8360: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
8370: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
8380: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
8390: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
83a0: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
83b0: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
83c0: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
83d0: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
83e0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
83f0: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
8400: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
8410: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
8420: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
8430: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
8440: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
8450: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
8460: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
8470: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8480: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
8490: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
84a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
84b0: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
84c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
84d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
84e0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
84f0: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
8500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8510: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
8520: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
8530: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8540: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
8550: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
8560: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
8570: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
8580: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   1) ){.         
8590: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
85a0: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
85b0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
85c0: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
85d0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
85e0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
85f0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
8600: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
8610: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
8620: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
8630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8640: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
8650: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8660: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
8670: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
86a0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
86b0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
86c0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
86d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
86e0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
86f0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
8720: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
8730: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
8740: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
8750: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
8760: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
8770: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8780: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
8790: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
87c0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
87d0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
87e0: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  GER;.      pMem+
87f0: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
8800: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
8810: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
8820: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
8830: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
8840: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
8850: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8860: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8870: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
8880: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8890: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
88a0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
88b0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
88c0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
88d0: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
88e0: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
88f0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
8900: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
8910: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
8920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8930: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8940: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8950: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8960: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8970: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8980: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8990: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
89a0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
89b0: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
89c0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
89d0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
89e0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
89f0: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
8a00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
8a10: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
8a20: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8a30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8a40: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8a50: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8a60: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
8a70: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8a80: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
8a90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8aa0: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
8ab0: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
8ac0: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
8ad0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
8ae0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
8af0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
8b00: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
8b10: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
8b20: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
8b30: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
8b40: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8b50: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
8b60: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
8b70: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
8b80: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
8b90: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
8ba0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
8bb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
8bc0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
8bd0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8be0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
8bf0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8c00: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
8c10: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
8c20: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
8c30: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
8c40: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
8c60: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
8c70: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8c80: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
8c90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
8ca0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
8cb0: 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   5*(p->explain-1
8cc0: 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  );.    p->rc = S
8cd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
8ce0: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
8cf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8d00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8d10: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
8d20: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
8d30: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
8d40: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
8d50: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
8d60: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
8d70: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
8d80: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
8d90: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
8da0: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
8db0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
8dc0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
8dd0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
8de0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
8df0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
8e00: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
8e10: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  z!=0 ){.    cons
8e20: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
8e30: 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65  >p4.z;.    while
8e40: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
8e50: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
8e60: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
8e70: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
8e80: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
8e90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8ea0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
8eb0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
8ec0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
8ed0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
8ee0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
8ef0: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
8f00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8f10: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
8f20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
8f30: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
8f40: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
8f50: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
8f60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8f70: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
8f80: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
8f90: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
8fa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
8fb0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
8fc0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
8fd0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
8fe0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
8ff0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9000: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
9010: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
9020: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
9030: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
9040: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
9050: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
9060: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
9070: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
9080: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
9090: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
90a0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
90b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
90c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
90d0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
90e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
90f0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
9100: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
9110: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
9120: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
9130: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9140: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
9150: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
9160: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
9170: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
9180: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
9190: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
91a0: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
91b0: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
91c0: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
91d0: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
91e0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
91f0: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
9200: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
9210: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
9220: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
9230: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
9240: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
9250: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
9260: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
9270: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
9280: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
9290: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
92a0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
92b0: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
92c0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
92d0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
92e0: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
92f0: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
9300: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
9310: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
9320: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
9330: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
9340: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
9350: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
9360: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9370: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
9380: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
9390: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
93a0: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
93b0: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
93c0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
93d0: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
93e0: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
93f0: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
9400: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
9410: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
9420: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
9430: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
9440: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
9450: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
9460: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
9470: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
9480: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
9490: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
94a0: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
94b0: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
94c0: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
94d0: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
94e0: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
94f0: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
9500: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
9510: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
9520: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
9530: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
9540: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
9550: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
9560: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
9570: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
9580: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9590: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
95a0: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
95b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
95c0: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
95d0: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
95e0: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
95f0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9600: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
9610: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
9620: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
9630: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
9640: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
9650: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
9660: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
9670: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
9680: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
9690: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
96a0: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
96b0: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
96c0: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
96d0: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
96e0: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
96f0: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
9700: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
9710: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
9720: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
9730: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
9740: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
9750: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
9760: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9770: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
9780: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
9790: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
97a0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
97b0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
97c0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
97d0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
97e0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
97f0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
9800: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
9810: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
9820: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
9830: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
9840: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9850: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
9860: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
9870: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
9880: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
9890: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
98a0: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20  AGIC_RUN..**.** 
98b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
98c0: 79 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65  y be called more
98d0: 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20   than once on a 
98e0: 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d  single virtual m
98f0: 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66  achine..** The f
9900: 69 72 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64  irst call is mad
9910: 65 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  e while compilin
9920: 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  g the SQL statem
9930: 65 6e 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a  ent. Subsequent.
9940: 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  ** calls are mad
9950: 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  e as part of the
9960: 20 70 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65   process of rese
9970: 74 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e  tting a statemen
9980: 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78  t to be.** re-ex
9990: 65 63 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63  ecuted (from a c
99a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  all to sqlite3_r
99b0: 65 73 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61  eset()). The nVa
99c0: 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72  r, nMem, nCursor
99d0: 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61   .** and isExpla
99e0: 69 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  in parameters ar
99f0: 65 20 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f  e only passed co
9a00: 72 72 65 63 74 20 76 61 6c 75 65 73 20 74 68 65  rrect values the
9a10: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
9a20: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  he function is c
9a30: 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71  alled. On subseq
9a40: 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d  uent calls, from
9a50: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
9a60: 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73  , nVar.** is pas
9a70: 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c  sed -1 and nMem,
9a80: 20 6e 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45   nCursor and isE
9a90: 78 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70  xplain are all p
9aa0: 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76  assed zero..*/.v
9ab0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
9ac0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
9ad0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9af0: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
9b00: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
9b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9b20: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
9b30: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
9b40: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
9b50: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
9b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9b70: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
9b80: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
9b90: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9bc0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
9bd0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ate */.  int nAr
9be0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
9bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
9c00: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
9c10: 73 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73  s in SubPrograms
9c20: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c   */.  int isExpl
9c30: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
9c40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9c50: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
9c60: 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20  ords is present 
9c70: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d  */.  int usesStm
9c80: 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20  tJournal        
9c90: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
9ca0: 65 74 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74  et Vdbe.usesStmt
9cb0: 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20  Journal */.){.  
9cc0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
9cd0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
9ce0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
9cf0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
9d00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
9d10: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
9d20: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
9d30: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
9d40: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9d50: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
9d60: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
9d70: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
9d80: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
9d90: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
9da0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
9db0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
9dc0: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
9dd0: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
9de0: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
9df0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
9e00: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
9e10: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
9e20: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
9e30: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
9e40: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
9e50: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
9e60: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
9e70: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
9e80: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
9e90: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
9ea0: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
9eb0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
9ec0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9ed0: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
9ee0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
9ef0: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
9f00: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
9f10: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
9f20: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
9f30: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
9f40: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
9f50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
9f60: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
9f70: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
9f80: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
9f90: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
9fa0: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
9fb0: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
9fc0: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
9fd0: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
9fe0: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
9ff0: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
a000: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20  n arguments in. 
a010: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  This is only don
a020: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  e the.  ** first
a030: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
a040: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
a050: 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20  r a given VDBE, 
a060: 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20  not when it is. 
a070: 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   ** being called
a080: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
a090: 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74  set() to reset t
a0a0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a0b0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
a0c0: 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Var>=0 && ALWAYS
a0d0: 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
a0e0: 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20  d==0) ){.    u8 
a0f0: 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70  *zCsr = (u8 *)&p
a100: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
a110: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
a120: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
a130: 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 38  oation */.    u8
a140: 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26   *zEnd = (u8 *)&
a150: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c  p->aOp[p->nOpAll
a160: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
a170: 79 74 65 20 70 61 73 74 20 61 76 61 69 6c 61 62  yte past availab
a180: 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  le mem */.    in
a190: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1b0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
a1c0: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 6e  h extra memory n
a1d0: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20 20 72 65  eeded */..    re
a1e0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
a1f0: 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e   &nArg);.    p->
a200: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a210: 3d 20 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f  = (u8)usesStmtJo
a220: 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69  urnal;.    if( i
a230: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
a240: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65  <10 ){.      nMe
a250: 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  m = 10;.    }.  
a260: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
a270: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
a280: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
a290: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20  - (u8*)0)&7;.   
a2a0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a2b0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
a2c0: 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  sr) );..    /* M
a2d0: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
a2e0: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
a2f0: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
a300: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
a310: 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73 65 73 2e  o.    ** passes.
a320: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
a330: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
a340: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
a350: 65 20 61 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  e at the .    **
a360: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
a370: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
a380: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
a390: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
a3a0: 79 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  y.    ** require
a3b0: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
a3c0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
a3d0: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
a3e0: 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70   second.    ** p
a3f0: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
a400: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
a410: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
a420: 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  on.  .    **.   
a430: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
a440: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
a450: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
a460: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
a470: 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  e from.    ** th
a480: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
a490: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
a4a0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
a4b0: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
a4c0: 79 0a 20 20 20 20 2a 2a 20 72 65 64 75 63 65 20  y.    ** reduce 
a4d0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
a4e0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
a4f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
a500: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  t..    */.    do
a510: 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d   {.      nByte =
a520: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65   0;.      p->aMe
a530: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
a540: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
a550: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
a560: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a570: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
a580: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
a590: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
a5a0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
a5b0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a5c0: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
a5d0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
a5e0: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
a5f0: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
a600: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a610: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
a620: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
a630: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
a640: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
a650: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
a660: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
a670: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
a680: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
a690: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
a6c0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a6d0: 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 20        if( nByte 
a6e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46  ){.        p->pF
a6f0: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
a700: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
a710: 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  yte);.      }.  
a720: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
a730: 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20  ree;.      zEnd 
a740: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
a750: 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74      }while( nByt
a760: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
a770: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70  Failed );..    p
a780: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36  ->nCursor = (u16
a790: 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  )nCursor;.    if
a7a0: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
a7b0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
a7c0: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 20 20  Var)nVar;.      
a7d0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
a7e0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
a7f0: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
a800: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
a810: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
a820: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
a830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
a840: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >aMem ){.      p
a850: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a870: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
a880: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
a890: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
a8a0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
a8b0: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
a8c0: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
a8d0: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31  */.      for(n=1
a8e0: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
a8f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  .        p->aMem
a900: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
a910: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
a920: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
a930: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a940: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a950: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d  E_DEBUG.  for(n=
a960: 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b  1; n<p->nMem; n+
a970: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
a980: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64  p->aMem[n].db==d
a990: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
a9a0: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
a9b0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
a9c0: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
a9d0: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
a9e0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
a9f0: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
aa00: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
aa10: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
aa20: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
aa30: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
aa40: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
aa50: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
aa60: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
aa70: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
aa80: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e  OFILE.  {.    in
aa90: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
aaa0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
aab0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  {.      p->aOp[i
aac0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ].cnt = 0;.     
aad0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
aae0: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
aaf0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ab00: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
ab10: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
ab20: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
ab30: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
ab40: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
ab50: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
ab60: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
ab70: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
ab80: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
ab90: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
aba0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
abb0: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
abc0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
abd0: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
abe0: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
abf0: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
ac00: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
ac10: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
ac20: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
ac30: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
ac40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
ac50: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
ac60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
ac70: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
ac80: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
ac90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
aca0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
acb0: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
acc0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
acd0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
ace0: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
acf0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
ad00: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
ad10: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
ad20: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
ad30: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
ad40: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d  thod = 1;.    pM
ad50: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
ad60: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
ad70: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
ad80: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
ad90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
ada0: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
adb0: 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
adc0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
add0: 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
ade0: 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
adf0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
ae00: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
ae10: 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
ae20: 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
ae30: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
ae40: 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
ae50: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
ae60: 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
ae70: 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
ae80: 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
ae90: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d    v->aOp = pFram
aea0: 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70  e->aOp;.  v->nOp
aeb0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a   = pFrame->nOp;.
aec0: 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61    v->aMem = pFra
aed0: 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e  me->aMem;.  v->n
aee0: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d  Mem = pFrame->nM
aef0: 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d  em;.  v->apCsr =
af00: 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a   pFrame->apCsr;.
af10: 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70    v->nCursor = p
af20: 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a  Frame->nCursor;.
af30: 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77    v->db->lastRow
af40: 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73  id = pFrame->las
af50: 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68  tRowid;.  v->nCh
af60: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
af70: 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e  Change;.  return
af80: 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
af90: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
afa0: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
afb0: 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
afc0: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
afd0: 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
afe0: 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
aff0: 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
b000: 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
b010: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
b020: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
b030: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
b040: 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
b050: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
b060: 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
b070: 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
b080: 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
b090: 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
b0a0: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
b0b0: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
b0c0: 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
b0d0: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
b0e0: 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72  *pFrame = p->pFr
b0f0: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
b100: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
b110: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
b120: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
b130: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
b140: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
b150: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
b160: 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20  }.  p->pFrame = 
b170: 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  0;.  p->nFrame =
b180: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70   0;..  if( p->ap
b190: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
b1a0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b1b0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
b1c0: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
b1d0: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
b1e0: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
b1f0: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
b200: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
b210: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
b220: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
b230: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
b240: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
b250: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c  >aMem ){.    rel
b260: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
b270: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
b280: 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  m);.  }.}../*.**
b290: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
b2a0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
b2b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b2c0: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
b2d0: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
b2e0: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
b2f0: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
b300: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
b310: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
b320: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
b330: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
b340: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
b350: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
b360: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
b370: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
b380: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
b390: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
b3a0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63  _DEBUG.  /* Exec
b3b0: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ute assert() sta
b3c0: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
b3d0: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e  e that the Vdbe.
b3e0: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a  apCsr[] and .  *
b3f0: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72  * Vdbe.aMem[] ar
b400: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64  rays have alread
b410: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75  y been cleaned u
b420: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  p.  */.  int i;.
b430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b440: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
b450: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d  sert( p->apCsr==
b460: 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d  0 || p->apCsr[i]
b470: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31  ==0 );.  for(i=1
b480: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
b490: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
b4a0: 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d  em==0 || p->aMem
b4b0: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e  [i].flags==MEM_N
b4c0: 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ull );.#endif.. 
b4d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b4e0: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
b4f0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
b500: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
b510: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
b520: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
b530: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
b540: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
b550: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
b560: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
b570: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
b580: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
b590: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
b5a0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
b5b0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
b5c0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
b5d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
b5e0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
b5f0: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
b600: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
b610: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
b620: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b630: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
b640: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
b650: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
b660: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
b670: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
b680: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
b690: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
b6a0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
b6b0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
b6c0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
b6d0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
b6e0: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
b6f0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
b700: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
b710: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
b720: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
b730: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
b740: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
b750: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
b760: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
b770: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
b780: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b790: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
b7a0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
b7b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
b7c0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
b7d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
b7e0: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
b7f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
b800: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
b810: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
b820: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
b830: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
b840: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
b850: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
b860: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
b870: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
b880: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
b890: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
b8a0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
b8b0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
b8c0: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
b8d0: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
b8e0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
b8f0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
b900: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
b910: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
b920: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
b930: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
b940: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
b950: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
b960: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
b970: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
b980: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
b990: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
b9a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
b9b0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
b9c0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
b9f0: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
ba00: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
ba30: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
ba40: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
ba50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
ba70: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
ba80: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
ba90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
baa0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
bab0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
bac0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
bad0: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
bae0: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb00: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
bb10: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
bb20: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
bb30: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
bb40: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
bb50: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
bb60: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
bb70: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
bb80: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
bb90: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
bba0: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
bbb0: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
bbc0: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
bbd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bbe0: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
bbf0: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
bc00: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
bc10: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
bc20: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
bc30: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
bc40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
bc50: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
bc60: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
bc70: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
bc80: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
bc90: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
bca0: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
bcb0: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
bcc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bcd0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
bce0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
bcf0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
bd00: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
bd10: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
bd20: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
bd30: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
bd40: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
bd50: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
bd60: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
bd70: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
bd80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
bd90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
bda0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
bdb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
bdc0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
bdd0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
bde0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
bdf0: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
be00: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
be10: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
be20: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
be30: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
be40: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
be50: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
be60: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
be70: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
be80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
be90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
bea0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
beb0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
bec0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
bed0: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
bee0: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
bef0: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
bf00: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
bf10: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
bf20: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
bf30: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
bf40: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
bf50: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
bf60: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
bf70: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
bf80: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
bf90: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
bfa0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
bfb0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
bfc0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
bfd0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
bfe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
bff0: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
c000: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
c010: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
c020: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
c030: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
c040: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
c050: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
c060: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d  VtabSync(db, &p-
c070: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  >zErrMsg);.  if(
c080: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c090: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
c0a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
c0b0: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
c0c0: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
c0d0: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
c0e0: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
c0f0: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
c100: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
c110: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
c120: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
c130: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
c140: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
c150: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
c160: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
c170: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
c180: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
c190: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
c1a0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
c1b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c1c0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
c1d0: 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
c1e0: 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
c1f0: 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  / .  for(i=0; i<
c200: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
c210: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
c220: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
c230: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c240: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
c250: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
c260: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
c270: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
c280: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Trans++;.    }. 
c290: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
c2a0: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
c2b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
c2c0: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
c2d0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
c2e0: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
c2f0: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
c300: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
c310: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
c320: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
c330: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
c340: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
c350: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
c360: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  RAINT;.    }.  }
c370: 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
c380: 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
c390: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
c3a0: 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
c3b0: 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
c3c0: 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
c3d0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
c3e0: 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
c3f0: 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
c400: 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
c410: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
c420: 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
c430: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
c440: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
c450: 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
c460: 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
c470: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
c480: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
c490: 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
c4a0: 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
c4b0: 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
c4c0: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
c4d0: 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
c4e0: 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
c4f0: 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
c500: 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
c510: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
c520: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
c530: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
c540: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
c550: 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
c560: 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
c570: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
c580: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
c590: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
c5a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
c5b0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
c5c0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
c5d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c5e0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
c5f0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
c600: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c610: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
c620: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
c630: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
c640: 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
c650: 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
c660: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
c670: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
c680: 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
c690: 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
c6a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
c6b0: 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
c6c0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
c6d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
c6e0: 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
c6f0: 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
c700: 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
c710: 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
c720: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
c730: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
c740: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
c750: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
c760: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
c770: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
c780: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
c790: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
c7a0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
c7b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c7c0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
c7d0: 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  o(pBt);.      }.
c7e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
c7f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
c810: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
c820: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
c830: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
c840: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
c850: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
c860: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
c870: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
c880: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
c890: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
c8a0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
c8b0: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
c8c0: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
c8d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c8e0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
c8f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
c900: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
c910: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
c920: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
c930: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
c940: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
c950: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
c960: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
c970: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
c980: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
c990: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
c9a0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
c9b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
c9c0: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
c9d0: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
c9e0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
c9f0: 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  s;..    /* Selec
ca00: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
ca10: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
ca20: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
ca30: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
ca40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ca50: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
ca60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
ca70: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
ca80: 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
ca90: 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72  );.      zMaster
caa0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
cab0: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58  f(db, "%s-mj%08X
cac0: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52  ", zMainFile, iR
cad0: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
cae0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
caf0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
cb00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cb10: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
cb20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cb30: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
cb40: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
cb50: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
cb60: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
cb70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
cb80: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
cb90: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cba0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
cbb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cbc0: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
cbd0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
cbe0: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
cbf0: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
cc00: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
cc10: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
cc20: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
cc30: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
cc40: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
cc50: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
cc60: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
cc70: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
cc80: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
cc90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
cca0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ccb0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
ccc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
ccd0: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
cce0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
ccf0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
cd00: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
cd10: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
cd20: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
cd30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
cd40: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
cd50: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
cd60: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
cd70: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
cd80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
cd90: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
cda0: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
cdb0: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
cdc0: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
cdd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
cde0: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
cdf0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
ce00: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
ce10: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
ce20: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
ce30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ce40: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ce50: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ce60: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ce70: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
ce80: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
ce90: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
cea0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
ceb0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
cec0: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
ced0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
cee0: 28 20 7a 46 69 6c 65 3d 3d 30 20 7c 7c 20 7a 46  ( zFile==0 || zF
cef0: 69 6c 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ile[0]==0 ){.   
cf00: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
cf10: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
cf20: 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
cf30: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
cf40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
cf50: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
cf60: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
cf70: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
cf80: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
cf90: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
cfa0: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
cfb0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
cfc0: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
cfd0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
cfe0: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
cff0: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
d000: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
d010: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
d020: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d030: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d040: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
d050: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
d060: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d070: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
d080: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
d090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
d0a0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
d0b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
d0c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
d0d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
d0e0: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
d0f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d100: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
d110: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
d120: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
d130: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
d140: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
d150: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
d160: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
d170: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
d180: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
d190: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
d1a0: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
d1b0: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
d1c0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d1d0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
d1e0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
d1f0: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
d200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
d210: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
d220: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
d230: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
d240: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
d250: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d260: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d270: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d280: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
d290: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
d2a0: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
d2b0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
d2c0: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
d2d0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
d2e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
d2f0: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
d300: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
d310: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
d320: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
d330: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
d340: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d350: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
d360: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
d370: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
d380: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
d390: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
d3a0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d3b0: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
d3c0: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
d3d0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d3e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d3f0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
d400: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
d410: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
d420: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
d430: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d440: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
d450: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
d460: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
d470: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
d480: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
d490: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d4a0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d4b0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
d4c0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
d4d0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d4e0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d4f0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
d500: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d510: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d520: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
d530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d540: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
d550: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
d560: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d580: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d590: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
d5a0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d5b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
d5c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d5d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
d5e0: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
d5f0: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
d600: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
d610: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
d620: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
d630: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
d640: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
d650: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
d660: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
d670: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
d680: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
d690: 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
d6a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d6b0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d6c0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
d6d0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d6e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d6f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
d700: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
d710: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
d720: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
d730: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
d740: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
d750: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
d760: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
d770: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
d780: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
d790: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
d7a0: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
d7b0: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
d7c0: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
d7d0: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
d7e0: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
d7f0: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
d800: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
d810: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
d820: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
d830: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
d840: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
d850: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
d860: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
d870: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
d880: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
d890: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
d8a0: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
d8b0: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
d8c0: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
d8d0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
d8e0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d8f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
d900: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
d910: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
d920: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
d930: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
d940: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d950: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d960: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
d970: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
d980: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
d990: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
d9a0: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
d9b0: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
d9c0: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
d9d0: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
d9e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d9f0: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
da00: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
da10: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
da20: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
da30: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
da40: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
da50: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
da60: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
da70: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
da80: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
da90: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
daa0: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
dab0: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
dac0: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
dad0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
dae0: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
daf0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
db00: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
db10: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
db20: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
db30: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
db40: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
db50: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
db60: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
db70: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
db80: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
db90: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
dba0: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
dbb0: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
dbc0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
dbd0: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
dbe0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
dbf0: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
dc00: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
dc10: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
dc20: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
dc30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
dc40: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
dc50: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
dc60: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
dc70: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
dc80: 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  e==db->writeVdbe
dc90: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
dca0: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
dcb0: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
dcc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65  dif../*.** For e
dcd0: 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20  very Btree that 
dce0: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
dcf0: 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20  ection db which 
dd00: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  .** has been mod
dd10: 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72  ified, "trip" or
dd20: 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68   invalidate each
dd30: 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68   cursor in.** th
dd40: 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68  at Btree might h
dd50: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
dd60: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75  d so that the cu
dd70: 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65  rsor.** can neve
dd80: 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e  r be used again.
dd90: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
dda0: 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hen a rollback.*
ddb0: 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68  ** occurs.  We h
ddc0: 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20  ave to trip all 
ddd0: 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  the other cursor
dde0: 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f  s, even.** curso
ddf0: 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73  r from other VMs
de00: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61   in different da
de10: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
de20: 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e  ns,.** so that n
de30: 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20  one of them try 
de40: 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20  to use the data 
de50: 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  at which they.**
de60: 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61   were pointing a
de70: 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79  nd which now may
de80: 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67   have been chang
de90: 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65  ed due.** to the
dea0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
deb0: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61   Remember that a
dec0: 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   rollback can de
ded0: 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70  lete tables comp
dee0: 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72  lete and.** reor
def0: 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20  der rootpages.  
df00: 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  So it is not suf
df10: 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20  ficient just to 
df20: 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74  save.** the stat
df30: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
df40: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
df50: 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
df60: 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  or.** so that it
df70: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
df80: 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gain..*/.static 
df90: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
dfa0: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
dfb0: 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a  Btrees(sqlite3 *
dfc0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
dfd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
dfe0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
dff0: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
e000: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
e010: 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72   p && sqlite3Btr
e020: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
e030: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
e040: 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
e050: 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f  rs(p, SQLITE_ABO
e060: 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  RT);.    }.  }.}
e070: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
e080: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
e090: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
e0a0: 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
e0b0: 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
e0c0: 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
e0d0: 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
e0e0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
e0f0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
e100: 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
e110: 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
e120: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
e130: 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
e140: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
e150: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
e160: 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
e170: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
e180: 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
e190: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
e1a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
e1b0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
e1c0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
e1d0: 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
e1e0: 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
e1f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
e200: 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
e210: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
e220: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
e230: 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
e240: 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
e250: 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
e260: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
e270: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
e280: 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
e290: 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
e2a0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
e2b0: 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
e2c0: 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
e2d0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
e2e0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
e2f0: 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
e300: 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
e310: 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
e320: 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
e330: 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e   occured, causin
e340: 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
e350: 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
e360: 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
e370: 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
e380: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
e390: 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
e3a0: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
e3b0: 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
e3c0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
e3d0: 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
e3e0: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
e3f0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
e400: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
e410: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
e420: 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
e430: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
e440: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
e450: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
e460: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
e470: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
e480: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
e490: 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
e4a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e4b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e4c0: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
e4d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
e4e0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e4f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e500: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
e510: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
e520: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
e530: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
e540: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
e550: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
e560: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
e570: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
e580: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e590: 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
e5a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e5b0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
e5c0: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
e5d0: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
e5e0: 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
e5f0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
e600: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
e610: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e620: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
e630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e640: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
e650: 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
e660: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
e670: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
e680: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
e690: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
e6a0: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
e6b0: 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
e6c0: 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
e6d0: 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
e6e0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
e6f0: 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
e700: 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
e710: 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
e720: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
e730: 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
e740: 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
e750: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
e760: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
e770: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
e780: 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
e790: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e7a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
e7b0: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
e7c0: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
e7d0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
e7e0: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
e7f0: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
e800: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
e810: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
e820: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
e830: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
e840: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
e850: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
e860: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
e870: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
e880: 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73 65 74  ing so it.** set
e890: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
e8a0: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
e8b0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
e8c0: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
e8d0: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
e8e0: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
e8f0: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
e900: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
e910: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
e920: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
e930: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
e940: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
e950: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
e960: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
e970: 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69 73 20  eeEnterAll() is 
e980: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
e990: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
e9a0: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
e9b0: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
e9c0: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
e9d0: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
e9e0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
e9f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ea00: 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f 75 72   the VM. Of cour
ea10: 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73 65 74  se only a subset
ea20: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
ea30: 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ures.** will be 
ea40: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
ea50: 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75 6c 64  VM, and we could
ea60: 20 75 73 65 20 56 64 62 65 2e 62 74 72 65 65 4d   use Vdbe.btreeM
ea70: 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a 2a 2a  ask to figure.**
ea80: 20 74 68 61 74 20 73 75 62 73 65 74 20 6f 75 74   that subset out
ea90: 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e  , but there is n
eaa0: 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 64  o advantage to d
eab0: 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49  oing so..**.** I
eac0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
ead0: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
eae0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
eaf0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
eb00: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
eb10: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
eb20: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
eb30: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
eb40: 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  CHE.void sqlite3
eb50: 56 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e  VdbeMutexArrayEn
eb60: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ter(Vdbe *p){.#i
eb70: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
eb80: 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42 74 72  AFE.  sqlite3Btr
eb90: 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65  eeMutexArrayEnte
eba0: 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 23  r(&p->aMutex);.#
ebb0: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 42 74  else.  sqlite3Bt
ebc0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d 3e 64  reeEnterAll(p->d
ebd0: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e  b);.#endif.}.#en
ebe0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
ebf0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ec00: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
ec10: 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
ec20: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
ec30: 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
ec40: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
ec50: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
ec60: 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
ec70: 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
ec80: 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
ec90: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
eca0: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
ecb0: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
ecc0: 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
ecd0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
ece0: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
ecf0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
ed00: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
ed10: 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
ed20: 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
ed30: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
ed40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
ed50: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
ed60: 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
ed70: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
ed80: 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72   write.** an err
ed90: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
eda0: 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
edb0: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
edc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
edd0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
ede0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
edf0: 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
ee00: 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
ee10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
ee20: 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
ee30: 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66  rred && db->nDef
ee40: 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20  erredCons>0) || 
ee50: 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
ee60: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
ee70: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
ee80: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ee90: 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  NT;.    p->error
eea0: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
eeb0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
eec0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
eed0: 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67  Msg, db, "foreig
eee0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
eef0: 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
ef00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
ef10: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
ef20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
ef30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
ef40: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ef50: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
ef60: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
ef70: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
ef80: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
ef90: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
efa0: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
efb0: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
efc0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
efd0: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
efe0: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
eff0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
f000: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f010: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
f020: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
f030: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
f040: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
f050: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
f060: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
f070: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
f080: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
f090: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
f0a0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
f0b0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
f0c0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f0d0: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
f0e0: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
f0f0: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
f100: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
f110: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
f120: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
f130: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
f140: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
f150: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
f160: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
f170: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
f180: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
f190: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
f1a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
f1d0: 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
f1e0: 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
f1f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
f200: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
f210: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
f220: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
f230: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
f240: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
f250: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
f260: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
f270: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
f280: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
f290: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
f2a0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
f2b0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
f2c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
f2d0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
f2e0: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
f2f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
f300: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
f310: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
f320: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
f330: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
f340: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
f350: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
f360: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
f370: 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
f380: 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
f390: 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
f3a0: 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
f3b0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
f3c0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f3d0: 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
f3e0: 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
f3f0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
f400: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
f410: 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
f420: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
f430: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
f440: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f450: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
f460: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
f470: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
f480: 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
f490: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
f4a0: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
f4b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f4c0: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
f4d0: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
f4e0: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
f4f0: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
f500: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
f510: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
f520: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
f530: 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
f540: 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
f550: 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
f560: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
f570: 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
f580: 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
f590: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
f5a0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
f5b0: 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
f5c0: 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
f5d0: 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
f5e0: 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
f5f0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
f600: 69 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72  ite3VdbeMutexArr
f610: 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  ayEnter(p);..   
f620: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
f630: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
f640: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
f650: 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
f660: 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  f;.    assert( p
f670: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc!=SQLITE_IOE
f680: 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f  RR_BLOCKED );  /
f690: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20  * This error no 
f6a0: 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f  longer exists */
f6b0: 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
f6c0: 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
f6d0: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
f6e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
f710: 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
f720: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
f730: 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
f740: 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
f750: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
f760: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
f770: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
f780: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
f790: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
f7a0: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
f7b0: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
f7c0: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
f7d0: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
f7e0: 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
f7f0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
f800: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
f810: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
f820: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
f830: 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
f840: 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
f850: 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
f860: 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
f870: 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
f880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f890: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
f8a0: 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
f8b0: 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
f8c0: 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
f8d0: 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
f8e0: 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
f8f0: 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
f900: 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
f910: 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
f920: 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
f930: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61  /.          inva
f940: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
f950: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
f960: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
f970: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
f980: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
f990: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
f9a0: 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
f9b0: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
f9c0: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
f9d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f9e0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
f9f0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
fa00: 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
fa10: 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
fa20: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
fa30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fa40: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
fa50: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
fa60: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
fa70: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
fa80: 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
fa90: 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
faa0: 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
fab0: 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
fac0: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
fad0: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
fae0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
faf0: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
fb00: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
fb10: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
fb20: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
fb30: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
fb40: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
fb50: 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
fb60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fb70: 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
fb80: 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
fb90: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
fba0: 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74       && db->writ
fbb0: 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65  eVdbeCnt==(p->re
fbc0: 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
fbd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
fbe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
fbf0: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
fc00: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
fc10: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
fc20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
fc30: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
fc40: 70 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  p, 1) ){.       
fc50: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
fc60: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
fc70: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
fc80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fc90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
fca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
fcb0: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
fcc0: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
fcd0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
fce0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
fcf0: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
fd00: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
fd10: 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
fd20: 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
fd30: 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
fd40: 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
fd50: 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
fd60: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fd70: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
fd80: 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ommit .        *
fd90: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  * is required.  
fda0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
fdb0: 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
fdc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
fdd0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
fde0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
fdf0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
fe00: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
fe10: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ex);.          r
fe20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
fe30: 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
fe40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fe50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
fe60: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
fe70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
fe80: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
fe90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fea0: 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
feb0: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
fec0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
fed0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
fee0: 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
fef0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
ff00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ff10: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
ff20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
ff30: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
ff40: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
ff50: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
ff60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
ff70: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
ff80: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
ff90: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
ffa0: 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
ffb0: 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
ffc0: 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
ffd0: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
ffe0: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
fff0: 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
10000 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
10010 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
10020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10030 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
10040 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
10050 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
10060 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10070 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10080 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10090 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
100a0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
100b0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
100c0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
100d0 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
100e0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
100f0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
10100 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
10110 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
10120 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
10130 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
10140 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
10150 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
10160 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
10170 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
10180 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
10190 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
101a0 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
101b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
101c0 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
101d0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
101e0 65 6e 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  en set the error
101f0 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20  .    ** code to 
10200 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20  the new value.. 
10210 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
10220 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
10230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10240 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
10250 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
10260 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
10270 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
10280 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
10290 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
102a0 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  NT) ){.        p
102b0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
102c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
102d0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
102e0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72  ;.        p->zEr
102f0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
10300 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
10310 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
10320 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
10330 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
10340 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10350 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
10360 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
10370 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
10380 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10390 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
103a0 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
103b0 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
103c0 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
103d0 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
103e0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
103f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10400 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
10410 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
10420 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10440 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
10450 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10460 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
10470 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
10480 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
10490 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
104a0 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
104b0 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  curred. */.    i
104c0 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
104d0 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73  _OK && db->flags
104e0 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
104f0 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73  anges ){.      s
10500 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
10510 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
10520 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
10530 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
10540 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
10550 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  anges);.    }.. 
10560 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
10570 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
10580 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
10590 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
105a0 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Mutex);.  }..  /
105b0 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
105c0 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
105d0 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
105e0 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
105f0 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
10600 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
10610 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
10620 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
10630 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10640 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10650 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  --;.    }.    as
10660 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
10670 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69  VdbeCnt>=db->wri
10680 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d  teVdbeCnt );.  }
10690 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
106a0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
106b0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
106c0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
106d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
106e0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
106f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
10700 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10710 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10720 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
10730 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
10740 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
10750 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
10760 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
10770 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
10780 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
10790 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
107a0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
107b0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
107c0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
107d0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
107e0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
107f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
10800 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
10810 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
10820 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
10830 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61  beCnt>0 || db->a
10840 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
10850 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
10860 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
10870 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
10880 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
10890 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
108a0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
108b0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
108c0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
108d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
108e0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
108f0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
10900 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
10910 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
10920 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
10930 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
10940 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10950 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
10960 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
10970 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
10980 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
10990 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
109a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
109b0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
109c0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
109d0 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
109e0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
109f0 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
10a00 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
10a10 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
10a20 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
10a30 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
10a40 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
10a50 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
10a60 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
10a70 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
10a80 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
10a90 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
10aa0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
10ab0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
10ac0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
10ad0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
10ae0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
10af0 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
10b00 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
10b10 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
10b20 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
10b30 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
10b40 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
10b50 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
10b60 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
10b70 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
10b80 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
10b90 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
10ba0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
10bb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
10bc0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
10bd0 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
10be0 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
10bf0 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
10c00 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
10c10 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
10c20 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
10c30 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
10c40 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
10c50 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
10c60 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
10c70 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
10c80 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
10c90 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
10ca0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
10cb0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
10cc0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
10cd0 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
10ce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
10cf0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=0 ){.    if( 
10d00 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
10d10 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
10d20 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
10d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
10d40 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
10d50 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c  r,-1,p->zErrMsg,
10d60 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49  SQLITE_UTF8,SQLI
10d70 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
10d80 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
10d90 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
10da0 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65       db->errCode
10db0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
10dc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10dd0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
10de0 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
10df0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
10e00 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
10e10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
10e20 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
10e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
10e40 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
10e50 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
10e60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
10e70 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
10e80 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
10e90 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
10ea0 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
10eb0 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
10ec0 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
10ed0 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
10ee0 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
10ef0 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
10f00 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
10f10 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
10f20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
10f30 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
10f40 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
10f50 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
10f60 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
10f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
10f80 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
10f90 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
10fa0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
10fb0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
10fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
10fd0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
10fe0 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
10ff0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
11000 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
11010 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
11020 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
11030 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
11040 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
11050 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
11060 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
11070 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
11080 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
11090 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
110a0 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
110b0 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
110c0 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
110d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
110e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
110f0 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
11100 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
11110 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
11120 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
11130 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
11140 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
11150 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
11160 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  "\n");.      for
11170 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
11180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
11190 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20  rintf(out, "%6d 
111a0 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a  %10lld %8lld ",.
111b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
111c0 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
111d0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
111e0 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
111f0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
11200 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
11210 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
11220 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
11230 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11240 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
11250 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
11260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11270 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
11280 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
11290 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
112a0 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
112b0 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
112c0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
112d0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
112e0 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
112f0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
11300 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
11310 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
11320 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
11330 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
11340 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
11350 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
11360 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11370 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
11380 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11390 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
113a0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
113b0 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
113c0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
113d0 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
113e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
113f0 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
11400 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
11410 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
11420 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
11430 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
11440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11450 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75   Call the destru
11460 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75  ctor for each au
11470 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70  xdata entry in p
11480 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69  VdbeFunc for whi
11490 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  ch.** the corres
114a0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d  ponding bit in m
114b0 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41  ask is clear.  A
114c0 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62  uxdata entries b
114d0 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20  eyond 31.** are 
114e0 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64  always destroyed
114f0 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c  .  To destroy al
11500 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65  l auxdata entrie
11510 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  s, call this.** 
11520 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73  routine with mas
11530 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  k==0..*/.void sq
11540 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
11550 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20  uxData(VdbeFunc 
11560 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20  *pVdbeFunc, int 
11570 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  mask){.  int i;.
11580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64    for(i=0; i<pVd
11590 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b  beFunc->nAux; i+
115a0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41  +){.    struct A
115b0 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26  uxData *pAux = &
115c0 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78  pVdbeFunc->apAux
115d0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e  [i];.    if( (i>
115e0 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28  31 || !(mask&(((
115f0 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20  u32)1)<<i))) && 
11600 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20  pAux->pAux ){.  
11610 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
11620 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
11630 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
11640 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
11650 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e    }.      pAux->
11660 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
11670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
11680 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
11690 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
116a0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
116b0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
116c0 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45  3 *db;..  if( NE
116d0 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
116e0 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
116f0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
11700 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
11710 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
11720 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
11730 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
11740 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
11750 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
11760 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
11770 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
11780 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
11790 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72  ->pPrev;.  }.  r
117a0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
117b0 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
117c0 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
117d0 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
117e0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
117f0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 76 64 62  OLNAME_N);.  vdb
11800 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
11810 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
11820 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
11830 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  e(db, p->aLabel)
11840 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
11850 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
11860 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
11870 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
11880 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
11890 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
118a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
118b0 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20  db, p->pFree);. 
118c0 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
118d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
118e0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  p);.}../*.** Mak
118f0 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
11900 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
11910 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
11920 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
11930 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
11940 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
11950 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
11960 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
11970 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
11980 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
11990 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
119a0 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
119b0 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
119c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
119d0 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
119e0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
119f0 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
11a00 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
11a10 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
11a20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
11a30 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
11a40 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
11a50 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
11a60 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
11a70 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
11a80 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
11a90 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
11aa0 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
11ab0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
11ac0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
11ad0 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
11ae0 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
11af0 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
11b00 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
11b10 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
11b20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
11b30 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
11b40 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11b50 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
11b60 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
11b70 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
11b80 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
11b90 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
11ba0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
11bb0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
11bc0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
11bd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
11be0 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
11bf0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
11c00 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
11c10 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
11c20 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
11c30 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
11c40 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
11c50 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c  urn rc;.    p->l
11c60 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f  astRowid = p->mo
11c70 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20  vetoTarget;.    
11c80 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
11c90 3d 20 41 4c 57 41 59 53 28 72 65 73 3d 3d 30 29  = ALWAYS(res==0)
11ca0 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 4e   ?1:0;.    if( N
11cb0 45 56 45 52 28 72 65 73 3c 30 29 20 29 7b 0a 20  EVER(res<0) ){. 
11cc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11cd0 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43  3BtreeNext(p->pC
11ce0 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20  ursor, &res);.  
11cf0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
11d00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69  urn rc;.    }.#i
11d10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11d20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
11d30 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
11d40 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  dif.    p->defer
11d50 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
11d60 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
11d70 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
11d80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57  .  }else if( ALW
11d90 41 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  AYS(p->pCursor) 
11da0 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f  ){.    int hasMo
11db0 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ved;.    int rc 
11dc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
11dd0 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
11de0 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76  pCursor, &hasMov
11df0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ed);.    if( rc 
11e00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
11e10 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b   if( hasMoved ){
11e20 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53  .      p->cacheS
11e30 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
11e40 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75  ALE;.      p->nu
11e50 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  llRow = 1;.    }
11e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11e70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11e80 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
11e90 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
11ea0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11eb0 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
11ec0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
11ed0 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
11ee0 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
11ef0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
11f00 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
11f10 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
11f20 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
11f30 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
11f40 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
11f50 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
11f60 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
11f70 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
11f80 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
11f90 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
11fa0 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
11fb0 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
11fc0 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
11fd0 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
11fe0 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
11ff0 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
12000 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
12010 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
12020 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
12030 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
12040 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
12050 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
12060 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
12070 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
12080 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
12090 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
120a0 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
120b0 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
120c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
120d0 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
120e0 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
120f0 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
12100 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
12110 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
12120 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
12130 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
12140 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
12150 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a  ob seperately..*
12160 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
12170 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
12180 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
12190 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
121a0 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
121b0 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
121c0 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
121d0 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
121e0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
121f0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
12200 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
12210 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
12240 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
12270 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
12280 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
122a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
122b0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
122c0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
122d0 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
122e0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
122f0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
12320 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
12330 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
12350 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
12360 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
12370 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
12380 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
12390 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
123a0 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
123d0 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
123e0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
123f0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
12400 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
12410 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
12440 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
12450 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
12460 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
12490 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
124a0 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
124b0 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
124c0 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
124d0 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
124e0 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
124f0 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
12500 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
12510 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
12520 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
12530 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
12540 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
12550 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
12560 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
12570 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
12580 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
12590 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
125a0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
125b0 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
125c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
125d0 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
125e0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
125f0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
12600 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e  Mem->flags;.  in
12610 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  t n;..  if( flag
12620 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
12630 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12640 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
12650 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
12660 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
12670 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
12680 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
12690 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
126a0 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
126b0 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d  x00008000)<<32)-
126c0 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
126d0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
126e0 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c  4 u;.    if( fil
126f0 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28  e_format>=4 && (
12700 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20  i&1)==i ){.     
12710 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69   return 8+(u32)i
12720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20  ;.    }.    u = 
12730 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20  i<0 ? -i : i;.  
12740 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72    if( u<=127 ) r
12750 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
12760 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
12770 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
12780 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
12790 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
127a0 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
127b0 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
127c0 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
127d0 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
127e0 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
127f0 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
12800 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
12810 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
12820 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
12830 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
12840 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
12850 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e   );.  n = pMem->
12860 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
12870 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
12880 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
12890 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ero;.  }.  asser
128a0 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74  t( n>=0 );.  ret
128b0 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20  urn ((n*2) + 12 
128c0 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74  + ((flags&MEM_St
128d0 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r)!=0));.}../*.*
128e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
128f0 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
12900 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
12910 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
12920 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
12930 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
12940 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
12950 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
12960 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
12970 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
12980 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
12990 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
129a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
129b0 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
129c0 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
129d0 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
129e0 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
129f0 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
12a00 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
12a10 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
12a20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
12a30 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
12a40 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
12a50 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
12a60 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
12a70 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
12a80 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
12a90 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
12aa0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
12ab0 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
12ac0 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
12ad0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
12ae0 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
12af0 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
12b00 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
12b10 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
12b20 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
12b30 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
12b40 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
12b50 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
12b60 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
12b70 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
12b80 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
12b90 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
12ba0 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
12bb0 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
12bc0 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
12bd0 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
12be0 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
12bf0 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
12c00 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
12c10 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
12c20 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
12c30 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
12c40 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
12c50 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
12c60 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
12c70 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
12c80 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
12c90 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
12ca0 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
12cb0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
12cc0 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
12cd0 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
12ce0 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
12cf0 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
12d00 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
12d10 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
12d20 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
12d30 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
12d40 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
12d50 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
12d60 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
12d70 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
12d80 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
12d90 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
12da0 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
12db0 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
12dc0 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
12dd0 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
12de0 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
12df0 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
12e00 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
12e10 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
12e20 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
12e30 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
12e40 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
12e50 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
12e60 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
12e70 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
12e80 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
12e90 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
12ea0 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
12eb0 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
12ec0 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
12ed0 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
12ee0 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
12ef0 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
12f00 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
12f10 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
12f20 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
12f30 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
12f40 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
12f50 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
12f60 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
12f70 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
12f80 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
12f90 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
12fa0 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
12fb0 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
12fc0 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
12fd0 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
12fe0 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
12ff0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
13000 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
13010 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
13020 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
13030 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
13040 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
13050 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
13060 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
13070 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
13080 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
13090 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
130a0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
130b0 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
130c0 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
130d0 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
130e0 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
130f0 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
13100 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
13110 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
13120 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
13130 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
13140 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
13150 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
13160 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
13170 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
13180 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
13190 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
131a0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
131b0 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
131c0 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
131d0 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
131e0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
131f0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
13200 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
13210 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
13220 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
13230 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
13240 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
13250 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13260 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
13270 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
13280 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
13290 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
132a0 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61    nBuf must alwa
132b0 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65  ys be.** large e
132c0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
132d0 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20  e entire field. 
132e0 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
132f0 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c  field is.** a bl
13300 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66  ob with a zero-f
13310 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e  illed tail, then
13320 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20   buf[] might be 
13330 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a  just the right.*
13340 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65  * size to hold e
13350 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74  verything except
13360 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69   for the zero-fi
13370 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62  lled tail.  If b
13380 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  uf[].** is only 
13390 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
133a0 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ld the non-zero 
133b0 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c  prefix, then onl
133c0 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20  y write that.** 
133d0 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b  prefix into buf[
133e0 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d  ].  But if buf[]
133f0 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
13400 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68   to hold both th
13410 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20  e.** prefix and 
13420 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72  the tail then wr
13430 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61  ite the prefix a
13440 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20  nd set the tail 
13450 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e  to all.** zeros.
13460 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
13470 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
13480 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
13490 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
134a0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
134b0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
134c0 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
134d0 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
134e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
134f0 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
13500 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
13510 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
13520 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
13530 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
13540 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20  , int nBuf, Mem 
13550 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
13560 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73  format){.  u32 s
13570 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c  erial_type = sql
13580 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
13590 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f  pe(pMem, file_fo
135a0 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e  rmat);.  u32 len
135b0 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
135c0 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
135d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
135e0 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
135f0 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
13600 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
13610 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
13620 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
13630 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
13640 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b  zeof(pMem->r) );
13650 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
13660 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65  , &pMem->r, size
13670 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
13680 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
13690 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
136a0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
136b0 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
136c0 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
136d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
136e0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
136f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65  ;.    assert( le
13700 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a  n<=(u32)nBuf );.
13710 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
13720 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
13730 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
13740 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
13750 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
13760 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
13770 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
13780 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
13790 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
137a0 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
137b0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
137c0 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
137d0 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
137e0 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
137f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13800 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
13810 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
13820 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
13830 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
13840 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
13850 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
13860 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
13870 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
13880 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
13890 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  en += pMem->u.nZ
138a0 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ero;.      asser
138b0 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20  t( nBuf>=0 );.  
138c0 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75      if( len > (u
138d0 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  32)nBuf ){.     
138e0 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42     len = (u32)nB
138f0 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  uf;.      }.    
13900 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d    memset(&buf[pM
13910 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70  em->n], 0, len-p
13920 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20  Mem->n);.    }. 
13930 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
13940 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
13950 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
13960 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
13970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
13980 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
13990 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
139a0 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
139b0 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
139c0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
139d0 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
139e0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
139f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
13a00 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  ad..*/ .u32 sqli
13a10 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
13a20 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
13a30 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
13a40 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
13a50 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
13a60 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
13a70 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
13a80 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
13a90 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
13aa0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
13ad0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
13ae0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
13af0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
13b00 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
13b10 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
13b20 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
13b30 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
13b40 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
13b50 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
13b60 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
13b70 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
13b80 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
13b90 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
13ba0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13bb0 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
13bc0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
13bd0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
13be0 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63  >u.i = (signed c
13bf0 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20  har)buf[0];.    
13c00 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
13c10 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
13c20 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
13c30 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
13c40 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
13c50 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
13c60 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
13c70 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
13c80 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
13c90 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
13ca0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
13cb0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
13cc0 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
13cd0 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
13ce0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
13cf0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
13d00 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
13d10 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
13d20 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
13d30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
13d40 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
13d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
13d60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
13d70 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
13d80 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
13d90 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
13da0 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
13db0 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
13dc0 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
13dd0 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
13de0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
13df0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
13e00 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
13e10 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
13e20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
13e30 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
13e40 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
13e50 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
13e60 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
13e70 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
13e80 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
13e90 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
13ea0 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
13eb0 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
13ec0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
13ed0 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
13ee0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
13ef0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
13f00 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
13f10 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
13f20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
13f30 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
13f40 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
13f50 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
13f60 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
13f70 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
13f80 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
13f90 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13fa0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13fb0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
13fc0 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
13fd0 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
13fe0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
13ff0 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
14000 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
14010 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
14020 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
14030 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
14040 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e  s.      ** defin
14050 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
14060 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
14070 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
14080 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65  mixed.      ** e
14090 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndian..      */.
140a0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
140b0 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
140c0 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
140d0 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  2;.      static 
140e0 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
140f0 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34  = 1.0;.      u64
14100 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20   t2 = t1;.      
14110 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14120 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20  loat(t2);.      
14130 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
14140 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
14150 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
14160 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
14170 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  0 );.#endif..   
14180 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c     x = (buf[0]<<
14190 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
141a0 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
141b0 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
141c0 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34   y = (buf[4]<<24
141d0 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29  ) | (buf[5]<<16)
141e0 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c   | (buf[6]<<8) |
141f0 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78   buf[7];.      x
14200 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
14210 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
14220 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
14230 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14240 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
14250 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14260 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
14270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
14280 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
14290 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
142a0 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  em->r)==8 );.   
142b0 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
142c0 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
142d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d        memcpy(&pM
142e0 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
142f0 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70  f(x));.        p
14300 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
14310 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
14320 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
14330 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
14340 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
14350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14360 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
14370 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
14380 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
14390 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
143a0 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
143b0 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
143c0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
143d0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
143e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
143f0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75  fault: {.      u
14400 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c  32 len = (serial
14410 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
14420 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
14430 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
14440 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20  pMem->n = len;. 
14450 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
14460 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
14470 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
14480 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
14490 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
144a0 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
144b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
144c0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
144d0 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
144e0 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  Ephem;.      }. 
144f0 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b       return len;
14500 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14510 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
14520 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
14530 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
14540 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
14550 79 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a  y[], parse the.*
14560 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20  * record into a 
14570 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
14580 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
14590 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
145a0 2a 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  * that structure
145b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
145c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67  ing function mig
145d0 68 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61  ht provide szSpa
145e0 63 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ce bytes of memo
145f0 72 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70  ry.** space at p
14600 53 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61  Space.  This spa
14610 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ce can be used t
14620 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
14630 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65  ned.** VDbeParse
14640 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
14650 65 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65  e if it is large
14660 20 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20   enough.  If it 
14670 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e  is.** not big en
14680 6f 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f  ough, space is o
14690 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
146a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
146b0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
146c0 64 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  d structure shou
146d0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20  ld be closed by 
146e0 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  a call to.** sql
146f0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
14700 70 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a  packedRecord()..
14710 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  */ .UnpackedReco
14720 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52  rd *sqlite3VdbeR
14730 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
14740 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
14750 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
14760 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
14770 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
14780 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
14790 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
147a0 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
147b0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
147c0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
147d0 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
147e0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
147f0 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
14800 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
14810 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
14820 74 6f 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65  to hold the obje
14830 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  ct */.  int szSp
14840 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ace            /
14850 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
14860 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  [] in bytes */.)
14870 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
14880 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
14890 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
148a0 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55  char *)pKey;.  U
148b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
148c0 3b 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b  ;  /* The unpack
148d0 65 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 77  ed record that w
148e0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f  e will return */
148f0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
14900 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
14910 20 73 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f   space needed to
14920 20 68 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65   hold p, in byte
14930 73 20 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20  s */.  int d;.  
14940 75 33 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75  u32 idx;.  u16 u
14950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14960 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
14970 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
14980 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
14990 4d 65 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  Mem;.  int nOff;
149a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
149b0 63 72 65 61 73 65 20 70 53 70 61 63 65 20 62 79  crease pSpace by
149c0 20 74 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d   this much to 8-
149d0 62 79 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f  byte align it */
149e0 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  .  .  /*.  ** We
149f0 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
14a00 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
14a10 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
14a20 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
14a30 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
14a40 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
14a50 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
14a60 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
14a70 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
14a80 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
14a90 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
14aa0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
14ab0 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
14ac0 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
14ad0 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
14ae0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
14af0 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
14b00 20 70 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b   pSpace += nOff;
14b10 0a 20 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f  .  szSpace -= nO
14b20 66 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  ff;.  nByte = RO
14b30 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
14b40 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
14b50 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
14b60 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
14b70 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
14b80 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20  pace ){.    p = 
14b90 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
14ba0 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
14bb0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
14bc0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
14bd0 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
14be0 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46   UNPACKED_NEED_F
14bf0 52 45 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e  REE | UNPACKED_N
14c00 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
14c10 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
14c20 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70  npackedRecord*)p
14c30 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c  Space;.    p->fl
14c40 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
14c50 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
14c60 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
14c70 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
14c80 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
14c90 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
14ca0 20 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20   p->aMem = pMem 
14cb0 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
14cc0 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
14cd0 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
14ce0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ))];.  assert( E
14cf0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
14d00 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
14d10 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
14d20 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
14d30 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
14d40 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
14d50 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
14d60 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
14d70 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
14d80 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
14d90 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
14da0 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
14db0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
14dc0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
14dd0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
14de0 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
14df0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d  fo->db;.    pMem
14e00 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ->flags = 0;.   
14e10 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pMem->zMalloc =
14e20 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
14e30 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
14e40 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
14e50 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
14e60 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
14e70 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  u++;.  }.  asser
14e80 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
14e90 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  nField + 1 );.  
14ea0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20  p->nField = u;. 
14eb0 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
14ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14ed0 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73  routine destroys
14ee0 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72   a UnpackedRecor
14ef0 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  d object..*/.voi
14f00 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
14f10 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
14f20 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  d(UnpackedRecord
14f30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
14f40 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61   Mem *pMem;..  a
14f50 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
14f60 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
14f70 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
14f80 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66  D_DESTROY );.  f
14f90 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e  or(i=0, pMem=p->
14fa0 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c  aMem; i<p->nFiel
14fb0 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b  d; i++, pMem++){
14fc0 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61  .    /* The unpa
14fd0 63 6b 65 64 20 72 65 63 6f 72 64 20 69 73 20 61  cked record is a
14fe0 6c 77 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65  lways constructe
14ff0 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  d by the.    ** 
15000 73 71 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63  sqlite3VdbeUnpac
15010 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69  kRecord() functi
15020 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20  on above, which 
15030 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a  makes all.    **
15040 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
15050 62 73 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20  bs static.  And 
15060 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d  none of the elem
15070 65 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ents are.    ** 
15080 65 76 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64  ever transformed
15090 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
150a0 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ver anything to 
150b0 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20  delete..    */. 
150c0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65     if( NEVER(pMe
150d0 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71  m->zMalloc) ) sq
150e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
150f0 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20  ase(pMem);.  }. 
15100 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
15110 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52  UNPACKED_NEED_FR
15120 45 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EE ){.    sqlite
15130 33 44 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49  3DbFree(p->pKeyI
15140 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  nfo->db, p);.  }
15150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
15160 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
15170 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
15180 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
15190 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
151a0 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
151b0 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
151c0 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
151d0 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
151e0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
151f0 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
15200 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
15210 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
15220 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
15230 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
15240 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
15250 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
15260 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  y th OP_MakeReco
15270 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
15280 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
15290 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
152a0 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
152b0 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
152c0 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
152d0 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
152e0 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
152f0 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
15300 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
15310 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
15320 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79  elds..** The key
15330 20 77 69 74 68 20 66 65 77 65 72 20 66 69 65 6c   with fewer fiel
15340 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f  ds is usually co
15350 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e  mpares less than
15360 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20   the .** longer 
15370 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66  key.  However if
15380 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e   the UNPACKED_IN
15390 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70  CRKEY flags in p
153a0 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20  PKey2 is set.** 
153b0 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  and the common p
153c0 72 65 66 69 78 65 73 20 61 72 65 20 65 71 75 61  refixes are equa
153d0 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20  l, then key1 is 
153e0 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a  less than key2..
153f0 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50  ** Or if the UNP
15400 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46  ACKED_MATCH_PREF
15410 49 58 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  IX flag is set a
15420 6e 64 20 74 68 65 20 70 72 65 66 69 78 65 73 20  nd the prefixes 
15430 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68  are.** equal, th
15440 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  en the keys are 
15450 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
15460 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68   equal and.** th
15470 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74  e parts beyond t
15480 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
15490 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a   are ignored..**
154a0 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43  .** If the UNPAC
154b0 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
154c0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
154d0 65 6e 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  en the last byte
154e0 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   of.** the heade
154f0 72 20 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67  r of pKey1 is ig
15500 6e 6f 72 65 64 2e 20 20 49 74 20 69 73 20 61 73  nored.  It is as
15510 73 75 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31  sumed that pKey1
15520 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20   is.** an index 
15530 6b 65 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e  key, and thus en
15540 64 73 20 77 69 74 68 20 61 20 72 6f 77 69 64 20  ds with a rowid 
15550 76 61 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74  value.  The last
15560 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15570 68 65 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72  header will ther
15580 65 66 6f 72 65 20 62 65 20 74 68 65 20 73 65 72  efore be the ser
15590 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
155a0 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66  rowid:.** one of
155b0 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20   1, 2, 3, 4, 5, 
155c0 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65  6, 8, or 9 - the
155d0 20 69 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20   integer serial 
155e0 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65  types..** The se
155f0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
15600 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c   final rowid wil
15610 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 73 69  l always be a si
15620 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79  ngle byte..** By
15630 20 69 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c   ignoring this l
15640 61 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  ast byte of the 
15650 68 65 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65  header, we force
15660 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
15670 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
15680 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
15690 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e  d of key1..*/.in
156a0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
156b0 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
156c0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
156d0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
156e0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
156f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
15700 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
15710 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
15720 69 6e 74 20 64 31 3b 20 20 20 20 20 20 20 20 20  int d1;         
15730 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
15740 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
15750 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
15760 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
15770 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
15780 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
15790 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
157a0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
157b0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
157c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
157d0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
157e0 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
157f0 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
15800 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
15810 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
15820 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
15830 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
15840 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
15850 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
15860 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
15870 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
15880 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
15890 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
158a0 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
158b0 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
158c0 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
158d0 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
158e0 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
158f0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
15900 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
15910 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  m1.zMalloc = 0; 
15920 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
15930 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
15940 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
15950 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
15960 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
15970 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
15980 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
15990 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
159a0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
159b0 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
159c0 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
159d0 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
159e0 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
159f0 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
15a00 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
15a10 73 65 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  sed initialized,
15a20 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a   and doing .  **
15a30 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
15a40 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
15a50 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65  has a measurable
15a60 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72   negative perfor
15a70 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63  mance.  ** impac
15a80 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  t, since this ro
15a90 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20  utine is a very 
15aa0 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e  high runner.  An
15ab0 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a  d so, we choose.
15ac0 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74    ** to ignore t
15ad0 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
15ae0 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74  ings and leave t
15af0 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69  his variable uni
15b00 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
15b10 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20  .  /*  mem1.u.i 
15b20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65  = 0;  // not nee
15b30 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c  ded, here to sil
15b40 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ence compiler wa
15b50 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64  rning */.  .  id
15b60 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
15b70 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
15b80 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
15b90 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
15ba0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
15bb0 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20  GNORE_ROWID ){. 
15bc0 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d     szHdr1--;.  }
15bd0 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
15be0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
15bf0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
15c00 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
15c10 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
15c20 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
15c30 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
15c40 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
15c50 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
15c60 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
15c70 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
15c80 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
15c90 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
15ca0 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
15cb0 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
15cc0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15cd0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
15ce0 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
15cf0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
15d00 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
15d10 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
15d20 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
15d30 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
15d40 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
15d50 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
15d60 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
15d70 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
15d80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
15d90 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
15da0 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
15db0 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
15de0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
15df0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
15e00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
15e10 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
15e20 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
15e30 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
15e40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
15e50 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
15e60 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
15e70 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
15e80 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
15e90 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
15ea0 26 26 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70  && i<nField && p
15eb0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
15ec0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
15ed0 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
15ee0 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f    }.    .      /
15ef0 2a 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f  * If the PREFIX_
15f00 53 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73  SEARCH flag is s
15f10 65 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64  et and all field
15f20 73 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e  s except the fin
15f30 61 6c 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  al.      ** rowi
15f40 64 20 66 69 65 6c 64 20 77 65 72 65 20 65 71 75  d field were equ
15f50 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74  al, then clear t
15f60 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48  he PREFIX_SEARCH
15f70 20 66 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20   flag and set . 
15f80 20 20 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e       ** pPKey2->
15f90 72 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c  rowid to the val
15fa0 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ue of the rowid 
15fb0 66 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c  field in (pKey1,
15fc0 20 6e 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a   nKey1)..      *
15fd0 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
15fe0 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
15ff0 65 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20  e opcode..      
16000 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  */.      if( (pP
16010 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
16020 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
16030 41 52 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b  ARCH) && i==(pPK
16040 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29  ey2->nField-1) )
16050 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16060 28 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26  ( idx1==szHdr1 &
16070 26 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20  & rc );.        
16080 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61  assert( mem1.fla
16090 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
160a0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
160b0 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b  flags &= ~UNPACK
160c0 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
160d0 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79 32  ;.        pPKey2
160e0 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75  ->rowid = mem1.u
160f0 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
16100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
16110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
16120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  .  }..  /* No me
16130 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
16140 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
16150 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
16160 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
16170 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
16180 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
16190 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
161a0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
161b0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
161c0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
161d0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
161e0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
161f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
16200 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
16210 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
16220 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
16230 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
16240 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
16250 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
16260 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
16270 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
16280 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  l. If the UNPACK
16290 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20  ED_INCRKEY.  ** 
162a0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
162b0 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
162c0 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
162d0 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a   as larger..  **
162e0 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
162f0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
16300 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
16310 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
16320 70 72 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72  prefixes.  ** ar
16330 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
16340 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72  be equal.  Other
16350 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72  wise, the longer
16360 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a   key is the .  *
16370 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74  * larger.  As it
16380 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50   happens, the pP
16390 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73  Key2 will always
163a0 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20   be the longer. 
163b0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20   ** if there is 
163c0 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  a difference..  
163d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  */.  assert( rc=
163e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65  =0 );.  if( pPKe
163f0 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
16400 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a  CKED_INCRKEY ){.
16410 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d      rc = -1;.  }
16420 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
16430 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
16440 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29  D_PREFIX_MATCH )
16450 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72  {.    /* Leave r
16460 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  c==0 */.  }else 
16470 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
16480 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
16490 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
164a0 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  }. ../*.** pCur 
164b0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
164c0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
164d0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
164e0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
164f0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
16500 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
16510 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
16520 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
16530 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
16540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
16550 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
16560 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
16570 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
16580 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
16590 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
165a0 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
165b0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
165c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
165d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
165e0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
165f0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
16600 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
16610 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
16620 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
16630 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
16640 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
16650 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
16660 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
16670 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
16680 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
16690 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
166a0 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
166b0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
166c0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
166d0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
166e0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
166f0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
16700 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
16710 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
16720 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a  METER(db);..  /*
16730 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
16740 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
16750 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
16760 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
16770 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
16780 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
16790 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
167a0 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
167b0 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
167c0 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
167d0 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
167e0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
167f0 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
16800 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
16810 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
16820 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
16830 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
16840 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
16850 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16860 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
16870 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
16880 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
16890 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
168a0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
168b0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20  TE_OK );     /* 
168c0 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
168d0 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
168e0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
168f0 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b   assert( (nCellK
16900 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ey & SQLITE_MAX_
16910 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c  U32)==(u64)nCell
16920 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  Key );..  /* Rea
16930 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  d in the complet
16940 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
16950 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
16960 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
16970 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
16980 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
16990 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
169a0 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
169b0 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
169c0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
169d0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
169e0 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
169f0 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
16a00 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
16a10 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
16a20 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
16a30 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
16a40 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
16a50 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
16a60 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
16a70 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
16a80 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
16a90 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
16aa0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
16ab0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
16ac0 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
16ad0 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
16ae0 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
16af0 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
16b00 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
16b10 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
16b20 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
16b30 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
16b40 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
16b50 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
16b60 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
16b70 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
16b80 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
16b90 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
16ba0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
16bb0 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
16bc0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
16bd0 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
16be0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
16bf0 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
16c00 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
16c10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
16c20 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
16c30 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
16c40 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
16c50 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
16c60 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
16c70 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
16c80 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
16c90 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
16ca0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
16cb0 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
16cc0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
16cd0 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74  (typeRowid);.  t
16ce0 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
16cf0 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
16d00 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
16d10 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
16d20 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
16d30 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
16d40 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
16d50 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
16d60 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
16d70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
16d80 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
16d90 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16da0 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
16db0 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
16dc0 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
16dd0 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
16de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
16df0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
16e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16e10 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
16e20 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
16e30 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
16e40 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
16e50 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
16e60 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
16e70 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
16e80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16e90 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
16ea0 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
16eb0 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f  stcase( m.zMallo
16ec0 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
16ed0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
16ee0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
16ef0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
16f00 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
16f10 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
16f20 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
16f30 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
16f40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
16f50 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
16f60 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
16f70 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
16f80 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
16f90 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
16fa0 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
16fb0 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
16fc0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
16fd0 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
16fe0 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
16ff0 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
17000 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
17010 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
17020 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
17030 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
17040 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
17050 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
17060 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
17070 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
17080 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
17090 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
170a0 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
170b0 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
170c0 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
170d0 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
170e0 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
170f0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
17100 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
17110 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
17120 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
17130 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
17140 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64  KeyCompare(.  Vd
17150 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
17160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17170 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
17180 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
17190 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
171a0 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55  pUnpacked,  /* U
171b0 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
171c0 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  of key to compar
171d0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69  e against */.  i
171e0 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
171f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
17200 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
17210 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
17220 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
17230 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
17240 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
17250 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
17260 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
17270 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
17280 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
17290 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
172a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
172b0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
172c0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
172d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
172e0 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
172f0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
17300 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
17310 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
17320 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
17330 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
17340 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
17350 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
17360 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
17370 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
17380 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
17390 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
173a0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
173b0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
173c0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
173d0 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
173e0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
173f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17400 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
17410 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
17420 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
17430 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
17440 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
17450 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
17460 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
17470 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
17480 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
17490 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
174a0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
174b0 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20  GNORE_ROWID );. 
174c0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
174d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
174e0 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
174f0 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
17500 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
17510 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
17520 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17530 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
17540 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
17550 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
17560 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
17570 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
17580 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
17590 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
175a0 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
175b0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
175c0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
175d0 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
175e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
175f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
17600 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
17610 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
17620 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
17630 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
17640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
17650 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
17660 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
17670 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
17680 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
17690 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
176a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
176b0 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
176c0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
176d0 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
176e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
176f0 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
17700 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
17710 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
17720 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
17730 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
17740 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
17750 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
17760 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
17770 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
17780 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
17790 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
177a0 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
177b0 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
177c0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
177d0 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
177e0 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
177f0 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
17800 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
17810 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
17820 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
17830 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
17840 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
17850 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
17860 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
17870 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
17880 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
17890 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
178a0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
178b0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
178c0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
178d0 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
178e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
178f0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
17900 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
17910 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
17920 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
17930 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
17940 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
17950 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
17960 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
17970 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
17980 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
17990 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
179a0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
179b0 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
179c0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
179d0 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
179e0 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
179f0 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
17a00 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
17a10 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
17a20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
17a30 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
17a40 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
17a50 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
17a60 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
17a70 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
17a80 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
17a90 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
17aa0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
17ab0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
17ac0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
17ad0 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
17ae0 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
17af0 65 47 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a  eGetValue(Vdbe *
17b00 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
17b10 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
17b20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
17b30 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
17b40 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
17b50 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
17b60 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
17b70 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
17b80 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
17b90 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
17ba0 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
17bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
17bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17bd0 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
17be0 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
17bf0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17c00 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
17c10 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
17c20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
17c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17c40 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d  eMemStoreType((M
17c50 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  em *)pRet);.    
17c60 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
17c70 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
17c80 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17c90 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
17ca0 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
17cb0 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
17cc0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
17cd0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
17ce0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
17cf0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
17d00 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
17d10 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
17d20 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
17d30 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
17d40 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
17d50 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
17d60 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
17d70 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
17d80 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
17d90 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
17da0 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
17db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
17dc0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
17dd0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
17de0 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.