/ Hex Artifact Content
Login

Artifact 80ed78c8e1edf8918e0e404891d314aa01ccb095:


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 2f 2a 0a 2a  nOp;.  }.}../*.*
1ad0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1ae0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1af0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1b00: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1b10: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1b20: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1b30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1b40: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1b60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1b70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1b90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1ba0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1bb0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1bc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1bd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1be0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1bf0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1c00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1c10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1c20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1c30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1c40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1c50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1c70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1c80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1c90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1ca0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1cb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ce0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1cf0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1d00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1d10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1d20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1d30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1d40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1d50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1d60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1d80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1d90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1da0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1db0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1dc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1dd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1de0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1df0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1e00: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1e10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1e20: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1e30: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1e60: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1e70: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1e80: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1e90: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1ea0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1eb0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1ee0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1ef0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1f00: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1f10: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
1f20: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
1f30: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
1f40: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
1f50: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
1f60: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
1f70: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
1f80: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
1f90: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
1fa0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
1fb0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
1fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
1fd0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
1fe0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
1ff0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2000: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2010: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2020: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2030: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2040: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2050: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2060: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2070: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2080: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2090: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
20a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
20b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
20c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
20d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
20e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
20f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2100: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2110: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2120: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2140: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2150: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2170: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2190: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
21a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
21b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
21c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
21d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
21e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
21f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2210: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2220: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2230: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2250: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2270: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2280: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
22b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
22c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
22d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
22f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2300: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2310: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2320: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2330: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2340: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2350: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2380: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2390: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
23c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
23d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
23f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2400: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2410: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2420: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2430: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2440: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2450: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2460: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2470: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2480: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2490: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
24a0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
24b0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
24c0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
24d0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
24e0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
24f0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2500: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2520: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2540: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2550: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2560: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2570: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2580: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2590: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
25a0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
25b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
25c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
25d0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
25e0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
25f0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2600: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2610: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2620: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2630: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2640: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2650: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2660: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2670: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2680: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2690: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
26a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
26b0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
26c0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
26d0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
26e0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
26f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2700: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2710: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2720: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2730: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2740: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2750: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2760: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2770: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2780: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2790: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
27a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
27b0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
27c0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
27d0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
27e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2800: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2810: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2820: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2830: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2840: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2850: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2860: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2870: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2880: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2890: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
28a0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
28b0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
28c0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
28d0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
28e0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
28f0: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2900: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2910: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2920: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2930: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2940: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2950: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2970: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2980: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
29a0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
29b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
29c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
29d0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
29e0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
29f0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2a00: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2a10: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2a20: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2a30: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2a40: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2a50: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2a60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2a70: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2a80: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2a90: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2aa0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ab0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2ac0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ad0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2ae0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2af0: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2b00: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2b10: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2b20: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2b30: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2b40: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2b50: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2b60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2b70: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2b80: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2b90: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2ba0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2bb0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2bc0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2c20: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2c30: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2c40: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2c50: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2c60: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2c70: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2c80: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2c90: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2ca0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2cb0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2cc0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2cd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ce0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2cf0: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d10: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2d20: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2d40: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2d50: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2d60: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2d70: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61   (opcode==OP_Tra
2d80: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d  nsaction && pOp-
2d90: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64  >p2!=0) || opcod
2da0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a  e==OP_Vacuum ){.
2db0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
2dc0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
2dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2de0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
2df0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2e00: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  _VUpdate ){.    
2e10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
2e20: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2e30: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
2e40: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
2e50: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
2e60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2e80: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
2e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
2ea0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
2eb0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
2ec0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
2ee0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2ef0: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
2f00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
2f10: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
2f20: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
2f30: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
2f40: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
2f50: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
2f60: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
2f70: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
2f80: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
2f90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
2fa0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
2fb0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
2fc0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
2fd0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ff0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3000: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3010: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
3020: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3030: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3040: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3050: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3060: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3070: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3080: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3090: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
30a0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
30b0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
30c0: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
30d0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
30e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
30f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
3100: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
3110: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3120: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
3130: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
3140: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3150: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3160: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3170: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3180: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
3190: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
31a0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
31b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
31c0: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
31d0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
31e0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
31f0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
3200: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
3210: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
3220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3230: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
3240: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3250: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3260: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3270: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3280: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3290: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
32a0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
32b0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
32c0: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
32d0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
32e0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
32f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3300: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
3310: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
3320: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
3330: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
3340: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3350: 72 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d  rt( p->aMutex.nM
3360: 75 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  utex==0 );..  re
3370: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3380: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3390: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
33a0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
33b0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
33c0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
33d0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
33e0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
33f0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3400: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
3410: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
3420: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
3430: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3440: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
3450: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
3460: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3470: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3480: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3490: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
34a0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
34b0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
34c0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
34d0: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
34e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
34f0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3500: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
3510: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
3520: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
3530: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
3540: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
3550: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
3560: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3570: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3580: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3590: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
35a0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
35b0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
35c0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
35d0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
35e0: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
35f0: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3600: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
3610: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
3620: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
3630: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3640: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3660: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3680: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3690: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
36a0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
36b0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
36c0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
36d0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
36e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36f0: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3700: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
3710: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
3720: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3740: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3750: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
3760: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3770: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3780: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
37a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
37b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
37c0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
37d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
37e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
37f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3800: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3810: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3820: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3830: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3850: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3860: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3870: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3880: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
38a0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
38b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
38c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
38d0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
38e0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
38f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3900: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3910: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
3920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3930: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3940: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
3950: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3960: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3980: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
3990: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
39a0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
39b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
39c0: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
39d0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
39e0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
39f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
3a00: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3a10: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  nOp>addr ){.    
3a20: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3a30: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3a40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3a50: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3a60: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3a70: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3a80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3a90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3aa0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3ab0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3ac0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3ad0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3ae0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3af0: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3b00: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
3b10: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3b20: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3b30: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
3b40: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
3b50: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
3b60: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
3b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b80: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
3b90: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
3ba0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
3bb0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
3bc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3bd0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
3be0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
3bf0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3c00: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
3c10: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
3c20: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
3c30: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
3c40: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
3c50: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3c60: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
3c70: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3c80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3c90: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3ca0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 64  r){.  assert( ad
3cb0: 64 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  dr>=0 );.  sqlit
3cc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
3cd0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
3ce0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
3cf0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
3d00: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
3d10: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
3d20: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
3d30: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
3d40: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
3d50: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
3d60: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
3d70: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
3d80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
3d90: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
3da0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
3db0: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
3dc0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
3dd0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
3de0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3df0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
3e00: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
3e10: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
3e20: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
3e30: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
3e40: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
3e50: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
3e60: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
3e70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3e80: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
3e90: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
3ea0: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b     assert( db );
3eb0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
3ec0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
3ed0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
3ee0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
3ef0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
3f00: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
3f10: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
3f20: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
3f30: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
3f40: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
3f50: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
3f60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f70: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
3f80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3f90: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
3fa0: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
3fb0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
3fc0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
3fd0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
3fe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3ff0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
4000: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
4010: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
4020: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
4030: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
4040: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4050: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
4060: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
4070: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4080: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4090: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
40a0: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
40b0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
40c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40d0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
40e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4100: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
4110: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4120: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4130: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4150: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4160: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4170: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4180: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
41a0: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
41b0: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
41c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
41d0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
41e0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
41f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4200: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
4210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4220: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4230: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4250: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4260: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4270: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4280: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
4290: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
42a0: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
42b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
42c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
42d0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
42e0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
42f0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
4300: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
4310: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4320: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4330: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4340: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4350: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4360: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4370: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4380: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4390: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
43a0: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
43b0: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
43c0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
43d0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
43e0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
43f0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
4400: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4410: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4420: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4430: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4440: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4450: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4460: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4470: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4480: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4490: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
44a0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
44b0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
44c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
44d0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
44e0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
44f0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
4500: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
4510: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4520: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4530: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4540: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4550: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4560: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4570: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4580: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4590: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
45a0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
45b0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
45c0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
45d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
45e0: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
45f0: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
4600: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4610: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
4620: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
4630: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
4640: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
4650: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
4660: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
4670: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4680: 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65  p->db;.    while
4690: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66  ( N-- ){.      f
46a0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
46b0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
46c0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
46d0: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
46e0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70  Op[0]));.      p
46f0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
4700: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b  Noop;.      pOp+
4710: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
4720: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4730: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
4740: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4750: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4760: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
4770: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
4780: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
4790: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
47a0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
47b0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
47c0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
47d0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
47e0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
47f0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
4800: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
4810: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
4820: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
4830: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
4840: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
4850: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
4860: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
4870: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4880: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4890: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
48a0: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
48b0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
48c0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
48d0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
48e0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
48f0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
4900: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
4910: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
4920: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
4930: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
4940: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
4950: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
4960: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
4970: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
4980: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
4990: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
49a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
49b0: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
49c0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
49d0: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
49e0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
49f0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
4a00: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
4a10: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4a20: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
4a30: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
4a40: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
4a50: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4a60: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
4a70: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
4a80: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
4a90: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
4aa0: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
4ab0: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
4ac0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
4ad0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
4ae0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
4af0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
4b00: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
4b10: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
4b20: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
4b30: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
4b40: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
4b50: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
4b60: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
4b70: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
4b80: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
4b90: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
4ba0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
4bb0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
4bc0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4bd0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
4be0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4c00: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
4c10: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
4c20: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
4c30: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
4c40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
4c50: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
4c60: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
4c70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4c80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4c90: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
4ca0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
4cb0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
4cc0: 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n!=P4_KEYINFO 
4cd0: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  && n!=P4_VTAB ) 
4ce0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
4cf0: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
4d00: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
4d10: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
4d20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
4d30: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
4d40: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
4d50: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
4d60: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
4d70: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
4d80: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
4d90: 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c  r];.  freeP4(db,
4da0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4db0: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
4dc0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28  >p4.p = 0;.  if(
4dd0: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
4de0: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
4df0: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
4e00: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
4e10: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
4e20: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
4e30: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
4e40: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
4e50: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
4e60: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
4e70: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
4e80: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4e90: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
4ea0: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a  e if( zP4==0 ){.
4eb0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
4ec0: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  0;.    pOp->p4ty
4ed0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4ee0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
4ef0: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
4f00: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
4f10: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  nfo;.    int nFi
4f20: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20  eld, nByte;..   
4f30: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49   nField = ((KeyI
4f40: 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c  nfo*)zP4)->nFiel
4f50: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  d;.    nByte = s
4f60: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
4f70: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69   + (nField-1)*si
4f80: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  zeof(pKeyInfo->a
4f90: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c  Coll[0]) + nFiel
4fa0: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  d;.    pKeyInfo 
4fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4fc0: 63 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a  cRaw(0, nByte);.
4fd0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
4fe0: 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
4ff0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66  .    if( pKeyInf
5000: 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  o ){.      u8 *a
5010: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
5020: 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70   memcpy((char*)p
5030: 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42  KeyInfo, zP4, nB
5040: 79 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20  yte - nField);. 
5050: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
5060: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
5070: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
5080: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
5090: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
50a0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
50b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
50c0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
50d0: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
50e0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
50f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
5100: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
5110: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5120: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5130: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  4_KEYINFO;.    }
5140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
5150: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5160: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
5170: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5180: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
5190: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
51a0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
51b0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
51c0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
51d0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
51e0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
51f0: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42  e if( n==P4_VTAB
5200: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5210: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5220: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5230: 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73  = P4_VTAB;.    s
5240: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
5250: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20  VTable *)zP4);. 
5260: 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61     assert( ((VTa
5270: 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d  ble *)zP4)->db==
5280: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65  p->db );.  }else
5290: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
52a0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
52b0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
52c0: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
52d0: 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73  d char)n;.  }els
52e0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
52f0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
5300: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
5310: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
5320: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
5330: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
5340: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5350: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
5360: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
5370: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5380: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
5390: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
53a0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
53b0: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
53c0: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
53d0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
53e0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
53f0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
5400: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
5410: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
5420: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
5430: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
5440: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
5450: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
5460: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5470: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
5480: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5490: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
54a0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
54b0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
54c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
54d0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
54e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
54f0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
5500: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5510: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
5520: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5530: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5540: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
5550: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
5560: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
5570: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5580: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
5590: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
55a0: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  b, *pz);.    *pz
55b0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
55c0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
55d0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
55e0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
55f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
5600: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
5610: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5620: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5630: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5640: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
5650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5660: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
5670: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5680: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
5690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
56a0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
56b0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
56c0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
56d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
56e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
56f0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
5700: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
5710: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
5720: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5730: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
5740: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5750: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d   *pz);.    *pz =
5760: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5770: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5780: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5790: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
57a0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
57b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
57c0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
57d0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
57e0: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
57f0: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
5800: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
5810: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
5820: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
5830: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
5840: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
5850: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
5860: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
5870: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
5880: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
5890: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
58a0: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
58b0: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
58c0: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
58d0: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
58e0: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
58f0: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
5900: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
5910: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
5920: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
5930: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
5940: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
5950: 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20  .** after a OOM 
5960: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
5970: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
5980: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
5990: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
59a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
59b0: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
59c0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
59d0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
59e0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
59f0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
5a00: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
5a10: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
5a20: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
5a30: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
5a40: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20  Valgrind..**.** 
5a50: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66  About the #ifdef
5a60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5a70: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  CE:  Normally, t
5a80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
5a90: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75  ever called.** u
5aa0: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20  nless p->nOp>0. 
5ab0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
5ac0: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20   in the absense 
5ad0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  of SQLITE_OMIT_T
5ae0: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54  RACE,.** an OP_T
5af0: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  race instruction
5b00: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72   is always inser
5b10: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  ted by sqlite3Vd
5b20: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20  beGet() as soon 
5b30: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45  as.** a new VDBE
5b40: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f   is created.  So
5b50: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
5b60: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e  set addr to p->n
5b70: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20  Op-1 without.** 
5b80: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65  having to double
5b90: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73  -check to make s
5ba0: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73  ure that the res
5bb0: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  ult is non-negat
5bc0: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53  ive. But.** if S
5bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5be0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
5bf0: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69   OP_Trace is omi
5c00: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e  tted and we do n
5c10: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  eed to.** check 
5c20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
5c30: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e  nOp-1 before con
5c40: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65  tinuing..*/.Vdbe
5c50: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
5c60: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
5c70: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
5c80: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
5c90: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
5ca0: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
5cb0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
5cc0: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
5cd0: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
5ce0: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
5cf0: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
5d00: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
5d10: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
5d20: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
5d30: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
5d40: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
5d50: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
5d60: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5d70: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5d80: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5d90: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
5da0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
5db0: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20  if( p->nOp==0 ) 
5dc0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
5dd0: 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20  &dummy;.#endif. 
5de0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5df0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
5e00: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
5e10: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
5e20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5e30: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5e40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
5e60: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
5e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5e80: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
5e90: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  ];.  }.}..#if !d
5ea0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5eb0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
5ec0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
5ed0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
5ee0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
5ef0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
5f00: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
5f10: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
5f20: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
5f30: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
5f40: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
5f50: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
5f60: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
5f70: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
5f80: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
5f90: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
5fa0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
5fb0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
5fc0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
5fd0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
5fe0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
5ff0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
6000: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6010: 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
6020: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  :.    case P4_KE
6030: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6040: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
6050: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
6060: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
6070: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
6080: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6090: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  p, zTemp, "keyin
60a0: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
60b0: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
60c0: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
60d0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20  en30(zTemp);.   
60e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
60f0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
6100: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
6110: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
6120: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
6130: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
6140: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
6150: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
6160: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d  3Strlen30(pColl-
6170: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
6180: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
6190: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
61a0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
61b0: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
61c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
61d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
61e0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
61f0: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ] = ',';.       
6200: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
6210: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70  >aSortOrder && p
6220: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6230: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6240: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6250: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6260: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
6270: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
6280: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
6290: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
62a0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
62b0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
62c0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
62d0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
62e0: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
62f0: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
6300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6310: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6320: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
6330: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
6340: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
6350: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
6360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6370: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
6380: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6390: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
63a0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
63b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
63c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
63d0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
63e0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
63f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6400: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
6410: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
6420: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
6430: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
6440: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6450: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6460: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
6470: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
6480: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6490: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
64a0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
64b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
64c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
64d0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
64e0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
64f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6500: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
6510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6520: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6530: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
6540: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
6550: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6560: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
6570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6580: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6590: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
65a0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
65b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
65c0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
65d0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
65e0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
65f0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
6600: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
6610: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a  MEM_Null)==0 );.
6620: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
6630: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
6640: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
6650: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
6660: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
6670: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
6680: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6690: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
66a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
66b0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
66c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
66d0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
66e0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
66f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6700: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6710: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29  %.16g", pMem->r)
6720: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6730: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6740: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
6750: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
6760: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
6770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6780: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
67a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
67b0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
67c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
67d0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
67e0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
67f0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
6800: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6810: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
6820: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
6830: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
6840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6850: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
6860: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
6870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6880: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6890: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
68a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
68b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
68c0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
68d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
68e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
68f0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
6900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6910: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6920: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
6930: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
6940: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
6950: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
6960: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
6970: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
6980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6990: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
69a0: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
69b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
69c0: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
69d0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
69e0: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
69f0: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
6a00: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
6a10: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 74 6f  statement has to
6a20: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
6a30: 20 77 68 69 63 68 20 42 74 72 65 65 20 6f 62 6a   which Btree obj
6a40: 65 63 74 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ects.** will be 
6a50: 75 73 65 64 20 73 6f 20 74 68 61 74 20 69 74 20  used so that it 
6a60: 63 61 6e 20 61 63 71 75 69 72 65 20 6d 75 74 65  can acquire mute
6a70: 78 65 73 20 6f 6e 20 74 68 65 6d 20 61 6c 6c 20  xes on them all 
6a80: 69 6e 20 73 6f 72 74 65 64 0a 2a 2a 20 6f 72 64  in sorted.** ord
6a90: 65 72 20 28 76 69 61 20 73 71 6c 69 74 65 33 56  er (via sqlite3V
6aa0: 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  dbeMutexArrayEnt
6ab0: 65 72 28 29 2e 20 20 4d 75 74 65 78 65 73 20 61  er().  Mutexes a
6ac0: 72 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 69  re acquired.** i
6ad0: 6e 20 6f 72 64 65 72 20 28 61 6e 64 20 72 65 6c  n order (and rel
6ae0: 65 61 73 65 64 20 69 6e 20 72 65 76 65 72 73 65  eased in reverse
6af0: 20 6f 72 64 65 72 29 20 74 6f 20 61 76 6f 69 64   order) to avoid
6b00: 20 64 65 61 64 6c 6f 63 6b 73 2e 0a 2a 2f 0a 76   deadlocks..*/.v
6b10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
6b20: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
6b30: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 79 44 62 4d  , int i){.  yDbM
6b40: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  ask mask;.  asse
6b50: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6b60: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69  >db->nDb && i<si
6b70: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
6b80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
6b90: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
6ba0: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
6bb0: 6d 61 73 6b 20 3d 20 28 28 75 33 32 29 31 29 3c  mask = ((u32)1)<
6bc0: 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74  <i;.  if( (p->bt
6bd0: 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  reeMask & mask)=
6be0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72  =0 ){.    p->btr
6bf0: 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  eeMask |= mask;.
6c00: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6c10: 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72 74  MutexArrayInsert
6c20: 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e  (&p->aMutex, p->
6c30: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
6c40: 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66  .  }.}...#if def
6c50: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
6c60: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
6c70: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
6c80: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
6c90: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
6ca0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
6cb0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
6cc0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
6cd0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
6ce0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
6cf0: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
6d00: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
6d10: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74  zPtr[50];.  stat
6d20: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
6d30: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
6d40: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
6d50: 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22   %-4s %.2X %s\n"
6d60: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
6d70: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
6d80: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
6d90: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
6da0: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66  zeof(zPtr));.  f
6db0: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
6dc0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
6dd0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
6de0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
6df0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
6e00: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
6e10: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65  , pOp->p5,.#ifde
6e20: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
6e30: 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65       pOp->zComme
6e40: 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  nt ? pOp->zComme
6e50: 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20  nt : "".#else.  
6e60: 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20      "".#endif.  
6e70: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
6e80: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
6e90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
6ea0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
6eb0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
6ec0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
6ed0: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
6ee0: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
6ef0: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
6f00: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  nd;.    sqlite3 
6f10: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
6f20: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65   u8 malloc_faile
6f30: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
6f40: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62  iled;.    if( db
6f50: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29  ->pnBytesFreed )
6f60: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64  {.      for(pEnd
6f70: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
6f80: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  p++){.        sq
6f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6fa0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
6fb0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
6fc0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  n;.    }.    for
6fd0: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
6fe0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
6ff0: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
7000: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
7010: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20  b==p[1].db );.. 
7020: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
7030: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
7040: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
7050: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
7060: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
7070: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
7080: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
7090: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
70a0: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
70b0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
70c0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
70d0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
70e0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
70f0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
7100: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
7110: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
7120: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
7130: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
7140: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
7150: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
7160: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
7170: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
7180: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
7190: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
71a0: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
71b0: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
71c0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
71d0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
71e0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
71f0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
7200: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
7210: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
7220: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
7230: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
7240: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
7250: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
7260: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
7270: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
7280: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
7290: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
72a0: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
72b0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
72c0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
72d0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
72e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
72f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7300: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
7310: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46  gg|MEM_Dyn|MEM_F
7320: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29  rame|MEM_RowSet)
7330: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7340: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
7350: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
7360: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e if( p->zMalloc
7370: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7380: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7390: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
73a0: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20     p->zMalloc = 
73b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
73c0: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
73d0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
73e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
73f0: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7400: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
7410: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
7420: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
7430: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
7440: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
7450: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
7460: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7470: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7480: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
74a0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
74b0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
74c0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
74d0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
74e0: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
74f0: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7500: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
7510: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
7520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7530: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
7540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
7550: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
7560: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7570: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7580: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7590: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
75a0: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
75b0: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
75c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
75d0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
75e0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
75f0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
7600: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
7610: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
7620: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
7630: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
7640: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
7650: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
7660: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
7670: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
7680: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
7690: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
76a0: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
76b0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
76c0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
76d0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
76e0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
76f0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
7700: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
7710: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
7720: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
7730: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
7740: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
7750: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
7760: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
7770: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
7780: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
7790: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
77a0: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
77b0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
77c0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
77d0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
77e0: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
77f0: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
7800: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
7810: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
7820: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
7830: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
7840: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
7850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7860: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
7870: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
78a0: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
78b0: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
78c0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
78f0: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
7900: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
7910: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
7920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7930: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
7940: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
7950: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7970: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
7980: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
7990: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
79a0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79c0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
79d0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
79e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7a10: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
7a20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7a50: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
7a60: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
7a70: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46  ->aMem[1];  /* F
7a80: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
7a90: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
7aa0: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
7ab0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7ac0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
7ad0: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
7ae0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
7af0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
7b00: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
7b10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
7b20: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
7b30: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
7b40: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
7b50: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
7b60: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
7b70: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
7b80: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
7b90: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
7ba0: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
7bb0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
7bc0: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
7bd0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
7be0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
7bf0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
7c00: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
7c10: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
7c20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
7c30: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
7c40: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
7c50: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
7c60: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
7c70: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
7c80: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
7c90: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
7ca0: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
7cb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
7cc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7cd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
7ce0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
7cf0: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
7d00: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
7d10: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
7d20: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
7d30: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
7d40: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
7d50: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
7d60: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
7d70: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
7d80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
7d90: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
7da0: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
7db0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
7dc0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
7dd0: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
7de0: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
7df0: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
7e00: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
7e10: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
7e20: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
7e30: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
7e40: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
7e50: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
7e60: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
7e70: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
7e80: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
7e90: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
7ea0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
7eb0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
7ec0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
7ed0: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
7ee0: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
7ef0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
7f00: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
7f10: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
7f20: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
7f30: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
7f40: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
7f50: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
7f60: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
7f70: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
7f80: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
7f90: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
7fa0: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
7fb0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
7fc0: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
7fd0: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
7fe0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
7ff0: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
8000: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8010: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
8020: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
8030: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
8040: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8050: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
8060: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
8070: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
8080: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
8090: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
80a0: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
80b0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
80c0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
80d0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
80e0: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
80f0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
8100: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
8110: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
8120: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
8130: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
8140: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
8150: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
8160: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
8170: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
8180: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
8190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
81a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
81b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
81c0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
81d0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
81e0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
81f0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
8200: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
8210: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8220: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
8230: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
8240: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
8250: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
8260: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  *z;.    Op *pOp;
8270: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
8280: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
8290: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
82a0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
82b0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
82c0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
82d0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
82e0: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
82f0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
8300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8310: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
8320: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
8330: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
8340: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8350: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
8360: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
8370: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
8380: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8390: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
83a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
83b0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
83c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
83d0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
83e0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
83f0: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
8400: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
8410: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8420: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
8430: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8440: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
8450: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8460: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
8470: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84a0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
84b0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
84c0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
84d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
84e0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
84f0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
8500: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
8510: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8520: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
8530: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
8540: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8550: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8560: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8570: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8580: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8590: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
85a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
85b0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
85c0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
85d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
85e0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
85f0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
8600: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
8610: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
8620: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
8630: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
8640: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
8650: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
8660: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
8670: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
8680: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
8690: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
86a0: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
86b0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
86c0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
86d0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
86e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
86f0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
8700: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
8710: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
8720: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
8730: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
8740: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
8750: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
8760: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
8770: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
8780: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
8790: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
87a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
87b0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
87c0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
87d0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
87e0: 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29  Sub, nByte, 1) )
87f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
8800: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
8810: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
8820: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
8830: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
8840: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
8850: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
8860: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
8870: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
8880: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
8890: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
88a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
88b0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
88c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
88d0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
88e0: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8900: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
8910: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8920: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
8930: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
8940: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
8950: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
8960: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
8990: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
89a0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
89b0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
89c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
89d0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
89e0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
8a10: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8a20: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8a30: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
8a40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
8a50: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
8a60: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
8a70: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
8a80: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
8a90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8aa0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
8ab0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
8ac0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
8ad0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
8ae0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8af0: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34     z = displayP4
8b00: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
8b10: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70  2);.    if( z!=p
8b20: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
8b30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
8b40: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31  tStr(pMem, z, -1
8b50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8b60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
8b80: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
8b90: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
8ba0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
8bb0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
8bc0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
8bd0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
8be0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8bf0: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b  _TEXT;.    pMem+
8c00: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
8c10: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
8c20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
8c30: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
8c40: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
8c50: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
8c60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
8c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
8c80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
8c90: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
8ca0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
8cb0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
8cc0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
8cd0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
8ce0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
8cf0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
8d00: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
8d10: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
8d20: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8d30: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
8d40: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
8d50: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
8d60: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
8d70: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
8d80: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
8d90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  t ){.        pMe
8da0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
8db0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8dc0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70       pMem->z = p
8dd0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  Op->zComment;.  
8de0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
8df0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8e00: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
8e10: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
8e20: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
8e30: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
8e40: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
8e50: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
8e60: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
8e70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8e80: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ea0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
8eb0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8ec0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
8ed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8ee0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
8ef0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
8f00: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63  in-1);.    p->rc
8f10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8f20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
8f30: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
8f40: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
8f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8f60: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
8f70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
8f80: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
8f90: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
8fa0: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
8fb0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
8fc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
8fd0: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
8fe0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
8ff0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
9000: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  p;.  if( nOp<1 )
9010: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
9020: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
9030: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
9040: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
9050: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
9060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
9070: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77  pOp->p4.z;.    w
9080: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
9090: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
90a0: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a      printf("SQL:
90b0: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20   [%s]\n", z);.  
90c0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
90d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
90e0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
90f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9100: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
9110: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
9120: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
9130: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
9140: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9150: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
9160: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
9170: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
9180: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
9190: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
91a0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
91b0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
91c0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
91d0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
91e0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
91f0: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
9200: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
9210: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
9220: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
9230: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
9240: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
9250: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
9260: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
9270: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
9280: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
9290: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
92a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
92b0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
92c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
92d0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
92e0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
92f0: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
9300: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9310: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
9320: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
9330: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
9340: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
9350: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
9360: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
9370: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
9380: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
9390: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
93a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
93b0: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69   space from a fi
93c0: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20  xed size buffer 
93d0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
93e0: 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
93f0: 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66  space.  If insuf
9400: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73  ficient space is
9410: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
9420: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
9430: 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65  he pBuf paramete
9440: 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  r is the initial
9450: 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e   value of a poin
9460: 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a  ter which will.*
9470: 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65  * receive the ne
9480: 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20  w memory.  pBuf 
9490: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c  is normally NULL
94a0: 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  .  If pBuf is no
94b0: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65  t.** NULL, it me
94c0: 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ans that memory 
94d0: 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64  space has alread
94e0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
94f0: 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69   and that.** thi
9500: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
9510: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e   not allocate an
9520: 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57  y new memory.  W
9530: 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a  hen pBuf is not.
9540: 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72  ** NULL simply r
9550: 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c  eturn pBuf.  Onl
9560: 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d  y allocate new m
9570: 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e  emory space when
9580: 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c   pBuf.** is NULL
9590: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73  ..**.** nByte is
95a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
95b0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
95c0: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46  eded..**.** *ppF
95d0: 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76  rom points to av
95e0: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e  ailable space an
95f0: 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f  d pEnd points to
9600: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
9610: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  ** available spa
9620: 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20  ce.  When space 
9630: 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70  is allocated, *p
9640: 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65  pFrom is advance
9650: 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e  d past.** the en
9660: 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  d of the allocat
9670: 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  ed space..**.** 
9680: 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75  *pnByte is a cou
9690: 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62  nter of the numb
96a0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
96b0: 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66  pace that have f
96c0: 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f  ailed.** to allo
96d0: 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20  cate.  If there 
96e0: 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  is insufficient 
96f0: 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d  space in *ppFrom
9700: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
9710: 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e  ** request, then
9720: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
9730: 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  te by the amount
9740: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e   of the request.
9750: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9760: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76  *allocSpace(.  v
9770: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
9780: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74      /* Where ret
9790: 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c  urn pointer will
97a0: 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20   be stored */.  
97b0: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
97c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
97d0: 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  f bytes to alloc
97e0: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ate */.  u8 **pp
97f0: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a  From,         /*
9800: 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   IN/OUT: Allocat
9810: 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a  e from *ppFrom *
9820: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20  /.  u8 *pEnd,   
9830: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9840: 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61  ter to 1 byte pa
9850: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70  st the end of *p
9860: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a  pFrom buffer */.
9870: 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20    int *pnByte   
9880: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
9890: 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ocation cannot b
98a0: 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e  e made, incremen
98b0: 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a  t *pnByte */.){.
98c0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
98d0: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a  BYTE_ALIGNMENT(*
98e0: 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28  ppFrom) );.  if(
98f0: 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70   pBuf ) return p
9900: 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  Buf;.  nByte = R
9910: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20  OUND8(nByte);.  
9920: 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e  if( &(*ppFrom)[n
9930: 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b  Byte] <= pEnd ){
9940: 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69  .    pBuf = (voi
9950: 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20  d*)*ppFrom;.    
9960: 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65  *ppFrom += nByte
9970: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
9980: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b  pnByte += nByte;
9990: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42  .  }.  return pB
99a0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  uf;.}../*.** Pre
99b0: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
99c0: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
99d0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f  tion.  This invo
99e0: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
99f0: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
9a00: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
9a10: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
9a20: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
9a30: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
9a40: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
9a50: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
9a60: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
9a70: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
9a80: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
9a90: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
9aa0: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
9ab0: 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44  way to move a VD
9ac0: 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  BE from VDBE_MAG
9ad0: 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44  IC_INIT to.** VD
9ae0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a  BE_MAGIC_RUN..**
9af0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9b00: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
9b10: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 6f  more than once o
9b20: 6e 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75  n a single virtu
9b30: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 54  al machine..** T
9b40: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69 73  he first call is
9b50: 20 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d 70   made while comp
9b60: 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74  iling the SQL st
9b70: 61 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71 75  atement. Subsequ
9b80: 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72 65  ent.** calls are
9b90: 20 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f 66   made as part of
9ba0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
9bb0: 72 65 73 65 74 74 69 6e 67 20 61 20 73 74 61 74  resetting a stat
9bc0: 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20 72  ement to be.** r
9bd0: 65 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f 6d  e-executed (from
9be0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
9bf0: 65 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68 65  e3_reset()). The
9c00: 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75   nVar, nMem, nCu
9c10: 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73 45  rsor .** and isE
9c20: 78 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65 72  xplain parameter
9c30: 73 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73 65  s are only passe
9c40: 64 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 73  d correct values
9c50: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   the first time.
9c60: 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** the function 
9c70: 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73 75  is called. On su
9c80: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 20  bsequent calls, 
9c90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73  from sqlite3_res
9ca0: 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69 73  et(), nVar.** is
9cb0: 20 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20 6e   passed -1 and n
9cc0: 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e 64  Mem, nCursor and
9cd0: 20 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20 61   isExplain are a
9ce0: 6c 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e 0a  ll passed zero..
9cf0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9d00: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
9d10: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d30: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
9d40: 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20  int nVar,       
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20  * Number of '?' 
9d70: 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73  see in the SQL s
9d80: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
9d90: 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20  t nMem,         
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9db0: 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79  Number of memory
9dc0: 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61   cells to alloca
9dd0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  te */.  int nCur
9de0: 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  sor,            
9df0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9e00: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61   of cursors to a
9e10: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
9e20: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9e40: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
9e50: 20 61 72 67 73 20 69 6e 20 53 75 62 50 72 6f 67   args in SubProg
9e60: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rams */.  int is
9e70: 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20  Explain,        
9e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9e90: 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20   if the EXPLAIN 
9ea0: 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73  keywords is pres
9eb0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ent */.  int use
9ec0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 20 20 20  sStmtJournal    
9ed0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9ee0: 74 6f 20 73 65 74 20 56 64 62 65 2e 75 73 65 73  to set Vdbe.uses
9ef0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29  StmtJournal */.)
9f00: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
9f10: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
9f20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
9f30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9f40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9f50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
9f60: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
9f70: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
9f80: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
9f90: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
9fa0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
9fb0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
9fc0: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
9fd0: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
9fe0: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
9ff0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
a000: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68  ;..  /* For each
a010: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
a020: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
a030: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
a040: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
a050: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
a060: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
a070: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
a080: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
a090: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
a0a0: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
a0b0: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
a0c0: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
a0d0: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43  * VdbeCursor/BtC
a0e0: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73  ursor structures
a0f0: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  . The blob of me
a100: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
a110: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f  with .  ** curso
a120: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e  r 0 is stored in
a130: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65   memory cell nMe
a140: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  m. Memory cell (
a150: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f  nMem-1).  ** sto
a160: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  res the blob of 
a170: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
a180: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c  d with cursor 1,
a190: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
a1a0: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
a1b0: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
a1c0: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
a1d0: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  or;..  /* Alloca
a1e0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
a1f0: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53  ory registers, S
a200: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44  QL variables, VD
a210: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a  BE cursors and .
a220: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f    ** an array to
a230: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e   marshal SQL fun
a240: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
a250: 69 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  in. This is only
a260: 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66   done the.  ** f
a270: 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 66  irst time this f
a280: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
a290: 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 56 44  d for a given VD
a2a0: 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74 20  BE, not when it 
a2b0: 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63 61  is.  ** being ca
a2c0: 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  lled from sqlite
a2d0: 33 5f 72 65 73 65 74 28 29 20 74 6f 20 72 65 73  3_reset() to res
a2e0: 65 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  et the virtual m
a2f0: 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  achine..  */.  i
a300: 66 28 20 6e 56 61 72 3e 3d 30 20 26 26 20 41 4c  f( nVar>=0 && AL
a310: 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46  WAYS(db->mallocF
a320: 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20  ailed==0) ){.   
a330: 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38 20   u8 *zCsr = (u8 
a340: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
a350: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f  ];       /* Memo
a360: 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72  ry avaliable for
a370: 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20   alloation */.  
a380: 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75 38    u8 *zEnd = (u8
a390: 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   *)&p->aOp[p->nO
a3a0: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
a3b0: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 76 61  st byte past ava
a3c0: 69 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20  ilable mem */.  
a3d0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
a400: 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f   much extra memo
a410: 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  ry needed */..  
a420: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
a430: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20  s(p, &nArg);.   
a440: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
a450: 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 73 53 74  nal = (u8)usesSt
a460: 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 69  mtJournal;.    i
a470: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20  f( isExplain && 
a480: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20  nMem<10 ){.     
a490: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20   nMem = 10;.    
a4a0: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73  }.    memset(zCs
a4b0: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
a4c0: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a  ;.    zCsr += (z
a4d0: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
a4e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49 47  .    assert( EIG
a4f0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
a500: 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20  T(zCsr) );..    
a510: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
a520: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
a530: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
a540: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
a550: 6e 20 74 77 6f 0a 20 20 20 20 2a 2a 20 70 61 73  n two.    ** pas
a560: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
a570: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
a580: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
a590: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
a5a0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
a5b0: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
a5c0: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
a5d0: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
a5e0: 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 72 65 71  emory.    ** req
a5f0: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75  uirements by reu
a600: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20  sing the opcode 
a610: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e  array tail, then
a620: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
a630: 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c  ** pass will fil
a640: 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73  l in the rest us
a650: 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f  ing a fresh allo
a660: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a  cation.  .    **
a670: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  .    ** This two
a680: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
a690: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
a6a0: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
a6b0: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 20 20 2a  sible from.    *
a6c0: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73  * the leftover s
a6d0: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
a6e0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
a6f0: 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63  ray can signific
a700: 61 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 72 65 64  antly.    ** red
a710: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
a720: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
a730: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
a740: 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
a750: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79    do {.      nBy
a760: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  te = 0;.      p-
a770: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
a780: 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ce(p->aMem, nMem
a790: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
a7a0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
a7b0: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  e);.      p->aVa
a7c0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
a7d0: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
a7e0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
a7f0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
a800: 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
a810: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
a820: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
a830: 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20  f(Mem*), &zCsr, 
a840: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
a850: 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20       p->azVar = 
a860: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a  allocSpace(p->az
a870: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
a880: 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20  (char*), &zCsr, 
a890: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
a8a0: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20       p->apCsr = 
a8b0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
a8c0: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
a8d0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
a8e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
a900: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
a910: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42  e);.      if( nB
a920: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  yte ){.        p
a930: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
a940: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
a950: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
a960: 7d 0a 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70  }.      zCsr = p
a970: 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a  ->pFree;.      z
a980: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
a990: 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
a9a0: 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61  nByte && !db->ma
a9b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
a9c0: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
a9d0: 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20  (u16)nCursor;.  
a9e0: 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b    if( p->aVar ){
a9f0: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  .      p->nVar =
aa00: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
aa10: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
aa20: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
aa30: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
aa40: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
aa50: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
aa60: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
aa70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
aa80: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
aa90: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65     /* aMem[] goe
aac0: 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a  s from 1..nMem *
aad0: 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  /.      p->nMem 
aae0: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  = nMem;         
aaf0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
ab00: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
ab10: 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  m-1 */.      for
ab20: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e  (n=1; n<=nMem; n
ab30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
ab40: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
ab50: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
ab60: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20    p->aMem[n].db 
ab70: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = db;.      }.  
ab80: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
ab90: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
aba0: 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d  r(n=1; n<p->nMem
abb0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; n++){.    asse
abc0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64  rt( p->aMem[n].d
abd0: 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  b==db );.  }.#en
abe0: 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  dif..  p->pc = -
abf0: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
ac00: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
ac10: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
ac20: 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69  ort;.  p->explai
ac30: 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a  n |= isExplain;.
ac40: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
ac50: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
ac60: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
ac70: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
ac80: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
ac90: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
aca0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
acb0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
acc0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
acd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
ace0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
acf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ad00: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
ad10: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
ad20: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
ad30: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
ad40: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
ad50: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
ad60: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
ad70: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
ad80: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
ad90: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
ada0: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
adb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
adc0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
add0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
ade0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
adf0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
ae00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
ae10: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
ae20: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ae30: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
ae40: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
ae50: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
ae60: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
ae70: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
ae80: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c  y.    ** the cal
ae90: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65  l above. */.  }e
aea0: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75  lse if( pCx->pCu
aeb0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
aec0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
aed0: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
aee0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
aef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
af00: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
af10: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
af20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
af30: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
af40: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
af50: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
af60: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
af70: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
af80: 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  Cx->pModule;.   
af90: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
afa0: 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c   = 1;.    pModul
afb0: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
afc0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69  ursor);.    p->i
afd0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
afe0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
aff0: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
b000: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
b010: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
b020: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
b030: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
b040: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
b050: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
b060: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
b070: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
b080: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
b090: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
b0a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b0b0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
b0c0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
b0d0: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
b0e0: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d   pFrame->v;.  v-
b0f0: 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
b100: 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
b110: 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
b120: 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
b130: 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
b140: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
b150: 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
b160: 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
b170: 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
b180: 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
b190: 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
b1a0: 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
b1b0: 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
b1c0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
b1d0: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72  ge;.  return pFr
b1e0: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
b1f0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
b200: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
b210: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
b220: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
b230: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
b240: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
b250: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
b260: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
b270: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
b280: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
b290: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
b2a0: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
b2b0: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
b2c0: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
b2d0: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
b2e0: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
b2f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b300: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
b310: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
b320: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
b330: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
b340: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
b350: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
b360: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
b370: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
b380: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
b390: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
b3a0: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
b3b0: 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20  }.  p->pFrame = 
b3c0: 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  0;.  p->nFrame =
b3d0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70   0;..  if( p->ap
b3e0: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
b3f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b400: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
b410: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
b420: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
b430: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
b440: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
b450: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
b460: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
b470: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
b480: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
b490: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
b4a0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c  >aMem ){.    rel
b4b0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
b4c0: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
b4d0: 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  m);.  }.  while(
b4e0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b   p->pDelFrame ){
b4f0: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
b500: 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72  pDel = p->pDelFr
b510: 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c  ame;.    p->pDel
b520: 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50  Frame = pDel->pP
b530: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
b540: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
b550: 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(pDel);.  }.}..
b560: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
b570: 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63  he VM after exec
b580: 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ution..**.** Thi
b590: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
b5a0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
b5b0: 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20  se any cursors, 
b5c0: 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a  lists, and/or.**
b5d0: 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65   sorters that we
b5e0: 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49  re left open.  I
b5f0: 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74  t also deletes t
b600: 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20  he values of.** 
b610: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
b620: 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a   aVar[] array..*
b630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
b640: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
b650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b660: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
b670: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
b680: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
b690: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
b6a0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
b6b0: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
b6c0: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
b6d0: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
b6e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
b6f0: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
b700: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b710: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
b720: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
b730: 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43  Csr==0 || p->apC
b740: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f  sr[i]==0 );.  fo
b750: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
b760: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
b770: 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d  p->aMem==0 || p-
b780: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
b790: 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64  MEM_Null );.#end
b7a0: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
b7b0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
b7c0: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
b7d0: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
b7e0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
b7f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
b800: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
b810: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
b820: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
b830: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
b840: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
b850: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
b860: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
b870: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
b880: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
b890: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
b8a0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
b8b0: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
b8c0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
b8d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
b8e0: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
b8f0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
b900: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
b910: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
b920: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
b930: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
b940: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
b950: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
b960: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
b970: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
b980: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
b990: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
b9a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
b9b0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
b9c0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
b9d0: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
b9e0: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
b9f0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
ba00: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
ba10: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
ba20: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ba30: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
ba40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
ba50: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
ba60: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
ba70: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
ba80: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
ba90: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
baa0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
bab0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
bac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
bad0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
bae0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
baf0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
bb00: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
bb10: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
bb20: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
bb30: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
bb40: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
bb50: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
bb60: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
bb70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
bb80: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
bb90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
bba0: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
bbb0: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
bbc0: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
bbd0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
bbe0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
bbf0: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
bc00: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
bc10: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
bc20: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
bc30: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
bc40: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
bc50: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
bc60: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
bc70: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
bc80: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
bc90: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
bcc0: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
bcd0: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
bd00: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
bd10: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
bd20: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd40: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
bd50: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
bd60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
bd70: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
bd80: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
bd90: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
bda0: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
bdb0: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
bdc0: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
bdd0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
bde0: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
bdf0: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
be00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
be10: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
be20: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
be30: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
be40: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
be50: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
be60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
be70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
be80: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
be90: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
bea0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
beb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
bec0: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
bed0: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
bee0: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
bef0: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
bf00: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
bf10: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
bf20: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
bf30: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
bf40: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
bf50: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
bf60: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
bf70: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
bf80: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
bf90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bfa0: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
bfb0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
bfc0: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
bfd0: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
bfe0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
bff0: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
c000: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
c010: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
c020: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
c030: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
c040: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
c050: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
c060: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
c070: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
c080: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
c090: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
c0a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
c0b0: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
c0c0: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
c0d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
c0e0: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
c0f0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
c100: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
c110: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
c120: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
c130: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c140: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
c150: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
c160: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c170: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
c180: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
c190: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
c1a0: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
c1b0: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
c1c0: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
c1d0: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
c1e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
c1f0: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
c200: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
c210: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
c220: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
c230: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
c240: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
c250: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
c260: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
c270: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
c280: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
c290: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
c2a0: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
c2b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c2c0: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
c2d0: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
c2e0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
c2f0: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
c300: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
c310: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c320: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
c330: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
c340: 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  , &p->zErrMsg);.
c350: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
c360: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
c370: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
c380: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
c390: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
c3a0: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
c3b0: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
c3c0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
c3d0: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
c3e0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
c3f0: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
c400: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
c410: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
c420: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
c430: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
c440: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
c450: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
c460: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
c470: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
c480: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
c490: 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
c4a0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
c4b0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
c4c0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
c4d0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
c4e0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
c4f0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
c500: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
c510: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
c520: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
c530: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
c540: 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  s++;.      rc = 
c550: 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
c560: 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65  usiveLock(sqlite
c570: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
c580: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
c590: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c5a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
c5b0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
c5c0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
c5d0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
c5e0: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
c5f0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
c600: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
c610: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
c620: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
c630: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
c640: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
c650: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
c660: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c680: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
c690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
c6a0: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
c6b0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
c6c0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
c6d0: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
c6e0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
c6f0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
c700: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
c710: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
c720: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
c730: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
c740: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
c750: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
c760: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
c770: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
c780: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
c790: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
c7a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
c7b0: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
c7c0: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
c7d0: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
c7e0: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
c7f0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
c800: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
c810: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
c820: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
c830: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
c840: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
c850: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
c860: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
c870: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
c880: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
c890: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
c8a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
c8b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
c8c0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
c8d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
c8e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
c8f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c900: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
c910: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
c920: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
c930: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
c940: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
c950: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
c960: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
c970: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
c980: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
c990: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
c9a0: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
c9b0: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
c9c0: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
c9d0: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
c9e0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
c9f0: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
ca00: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
ca10: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
ca20: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
ca30: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
ca40: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
ca50: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
ca60: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
ca70: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
ca80: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
ca90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
caa0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
cab0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
cac0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
cad0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cae0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
caf0: 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
cb00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cb10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cb20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
cb30: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
cb40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
cb50: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
cb60: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
cb70: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
cb80: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
cb90: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
cba0: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
cbb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
cbc0: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
cbd0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
cbe0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
cbf0: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  cly..  */.#ifnde
cc00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
cc10: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
cc20: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
cc30: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
cc40: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
cc50: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
cc60: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
cc70: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
cc80: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cc90: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
cca0: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
ccb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ccc0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
ccd0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
cce0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
ccf0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
cd00: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
cd10: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f   int res;..    /
cd20: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
cd30: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cd40: 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a  ame */.    do {.
cd50: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
cd60: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
cd70: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
cd80: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
cd90: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
cda0: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
cdb0: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
cdc0: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
cdd0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
cde0: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46  -mj%08X", zMainF
cdf0: 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37  ile, iRandom&0x7
ce00: 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
ce10: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a  if( !zMaster ){.
ce20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ce30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ce40: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
ce50: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
ce60: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
ce70: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
ce80: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
ce90: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
cea0: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
ceb0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cec0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
ced0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
cee0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
cef0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cf00: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
cf10: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
cf20: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
cf30: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
cf40: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
cf50: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
cf60: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
cf70: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
cf80: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
cf90: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
cfa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cfb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cfc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
cfd0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
cfe0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cff0: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
d000: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
d010: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
d020: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
d030: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
d040: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
d050: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d060: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
d070: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
d080: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
d090: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
d0a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d0b0: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
d0c0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
d0d0: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
d0e0: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
d0f0: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
d100: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
d110: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
d120: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
d130: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
d140: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
d150: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
d160: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
d170: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
d180: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
d190: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
d1a0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
d1b0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
d1c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
d1d0: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
d1e0: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
d1f0: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
d200: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
d210: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
d220: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
d230: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
d240: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
d250: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
d260: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
d270: 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
d280: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
d290: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
d2a0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
d2b0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
d2c0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
d2d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d2e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
d2f0: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
d300: 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
d310: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
d320: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
d330: 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
d340: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
d350: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
d360: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d370: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d380: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
d390: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
d3a0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
d3b0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
d3c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
d3d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d3e0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
d3f0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d400: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d410: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
d420: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
d430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
d440: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
d450: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
d460: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
d470: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
d480: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
d490: 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
d4a0: 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
d4b0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
d4c0: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
d4d0: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
d4e0: 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
d4f0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
d500: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
d510: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
d520: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
d530: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
d540: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
d550: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
d560: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
d570: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
d580: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d590: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
d5a0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
d5b0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
d5c0: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
d5d0: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
d5e0: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
d5f0: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
d600: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
d610: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d620: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
d630: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
d640: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
d650: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
d660: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
d670: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
d680: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
d690: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
d6a0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
d6b0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
d6c0: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
d6d0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
d6e0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
d6f0: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
d700: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
d710: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
d720: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
d730: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
d740: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
d750: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
d760: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
d770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d780: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
d790: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
d7a0: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
d7b0: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
d7c0: 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
d7d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
d7e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
d7f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
d800: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
d810: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d820: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
d830: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d840: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
d850: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
d860: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
d870: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d880: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
d890: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
d8a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
d8b0: 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
d8c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d8d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
d8e0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
d8f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d900: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
d910: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
d920: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d930: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
d940: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
d950: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
d960: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
d970: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
d980: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
d990: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
d9a0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
d9b0: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
d9c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
d9d0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
d9e0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
d9f0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
da00: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
da10: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
da20: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
da30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
da40: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
da50: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
da60: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
da70: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
da80: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
da90: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
daa0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
dab0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
dac0: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
dad0: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
dae0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
daf0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
db00: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
db10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
db20: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
db30: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
db40: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
db50: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
db60: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
db70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
db80: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
db90: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
dba0: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
dbb0: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
dbc0: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
dbd0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
dbe0: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
dbf0: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
dc00: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
dc10: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
dc20: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
dc30: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
dc40: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
dc50: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
dc60: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
dc70: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
dc80: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
dc90: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
dca0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
dcb0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
dcc0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
dcd0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
dce0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
dcf0: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
dd00: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
dd10: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
dd20: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
dd30: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
dd40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
dd50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
dd60: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
dd70: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
dd80: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
dd90: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
dda0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
ddb0: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
ddc0: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
ddd0: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
dde0: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
ddf0: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
de00: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
de10: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
de20: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
de30: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
de40: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
de50: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
de60: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
de70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
de80: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
de90: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
dea0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
deb0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
dec0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
ded0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
dee0: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
def0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
df00: 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ite = 0;.  p = d
df10: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
df20: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
df30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
df40: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
df50: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
df60: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
df70: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
df80: 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a  nWrite++;.    }.
df90: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
dfa0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
dfb0: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
dfc0: 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65  dbeCnt );.  asse
dfd0: 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
dfe0: 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a  writeVdbeCnt );.
dff0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
e000: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
e010: 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
e020: 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74  .** For every Bt
e030: 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61  ree that in data
e040: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
e050: 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  db which .** has
e060: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
e070: 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69  "trip" or invali
e080: 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72  date each cursor
e090: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65   in.** that Btre
e0a0: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
e0b0: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  n modified so th
e0c0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
e0d0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73   can never be us
e0e0: 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20  ed again.  This 
e0f0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72  happens when a r
e100: 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75  ollback.*** occu
e110: 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  rs.  We have to 
e120: 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68  trip all the oth
e130: 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e  er cursors, even
e140: 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20  .** cursor from 
e150: 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66  other VMs in dif
e160: 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  ferent database 
e170: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20  connections,.** 
e180: 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  so that none of 
e190: 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20  them try to use 
e1a0: 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63  the data at whic
e1b0: 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70  h they.** were p
e1c0: 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63  ointing and whic
e1d0: 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62  h now may have b
e1e0: 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a  een changed due.
e1f0: 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  ** to the rollba
e200: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62  ck..**.** Rememb
e210: 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61  er that a rollba
e220: 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61  ck can delete ta
e230: 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e  bles complete an
e240: 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f  d.** reorder roo
e250: 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69  tpages.  So it i
e260: 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
e270: 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a   just to save.**
e280: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
e290: 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61  e cursor.  We ha
e2a0: 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ve to invalidate
e2b0: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73   the cursor.** s
e2c0: 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
e2d0: 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a  er used again..*
e2e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
e2f0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
e300: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
e310: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
e320: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
e330: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
e340: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
e350: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e360: 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73  ;.    if( p && s
e370: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
e380: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
e390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
e3a0: 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53  pAllCursors(p, S
e3b0: 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20  QLITE_ABORT);.  
e3c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
e3d0: 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
e3e0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
e3f0: 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
e400: 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
e410: 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
e420: 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
e430: 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
e440: 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
e450: 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
e460: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
e470: 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
e480: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
e490: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
e4a0: 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
e4b0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
e4c0: 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
e4d0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
e4e0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
e4f0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e500: 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a  n is commtted..*
e510: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
e520: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
e530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
e540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
e550: 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
e560: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
e570: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
e580: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
e590: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
e5a0: 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
e5b0: 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
e5c0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e5d0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
e5e0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
e5f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
e600: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
e610: 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
e620: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
e630: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
e640: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
e650: 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
e660: 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
e670: 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
e680: 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65   may have occure
e690: 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d  d, causing an em
e6a0: 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
e6b0: 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63  ..  ** In this c
e6c0: 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d  ase (db->nStatem
e6d0: 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65  ent==0), and the
e6e0: 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
e6f0: 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   do..  */.  if( 
e700: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26  db->nStatement &
e710: 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  & p->iStatement 
e720: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
e730: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
e740: 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
e750: 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61  tement-1;..    a
e760: 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
e770: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
e780: 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
e790: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61  _RELEASE);.    a
e7a0: 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
e7b0: 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61  ement>0 );.    a
e7c0: 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
e7d0: 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
e7e0: 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
e7f0: 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f  oint) );..    fo
e800: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
e810: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
e820: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
e830: 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  OK;.      Btree 
e840: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
e850: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
e860: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
e870: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
e880: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
e890: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
e8a0: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
e8b0: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
e8c0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
e8d0: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
e8e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e8f0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
e900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
e910: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
e920: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
e930: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
e940: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
e950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e960: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e970: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
e980: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20  c = rc2;.       
e990: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e9a0: 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  .    db->nStatem
e9b0: 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53  ent--;.    p->iS
e9c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20  tatement = 0;.. 
e9d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
e9e0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
e9f0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
ea00: 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
ea10: 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
ea20: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
ea30: 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
ea40: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
ea50: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
ea60: 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
ea70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
ea80: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
ea90: 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
eaa0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
eab0: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
eac0: 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
ead0: 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
eae0: 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  efCons;.    }.  
eaf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
eb00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ../*.** If SQLit
eb10: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
eb20: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
eb30: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
eb40: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
eb50: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
eb60: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
eb70: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
eb80: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
eb90: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
eba0: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
ebb0: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
ebc0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
ebd0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
ebe0: 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  it.** sets the B
ebf0: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
ec00: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
ec10: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
ec20: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
ec30: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
ec40: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
ec50: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
ec60: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
ec70: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
ec80: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
ec90: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
eca0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
ecb0: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
ecc0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ecd0: 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  All() is invoked
ece0: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
ecf0: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
ed00: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
ed10: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
ed20: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
ed30: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
ed40: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
ed50: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
ed60: 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79  . Of course only
ed70: 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65   a subset of the
ed80: 73 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  se structures.**
ed90: 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73 65   will be accesse
eda0: 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e 64  d by the VM, and
edb0: 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56 64   we could use Vd
edc0: 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f 20  be.btreeMask to 
edd0: 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20 73  figure.** that s
ede0: 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20 74  ubset out, but t
edf0: 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e  here is no advan
ee00: 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f  tage to doing so
ee10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
ee20: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
ee30: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
ee40: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
ee50: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
ee60: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
ee70: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e  a no-op..*/.#ifn
ee80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ee90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f 69  SHARED_CACHE.voi
eea0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74  d sqlite3VdbeMut
eeb0: 65 78 41 72 72 61 79 45 6e 74 65 72 28 56 64 62  exArrayEnter(Vdb
eec0: 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  e *p){.#if SQLIT
eed0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73  E_THREADSAFE.  s
eee0: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
eef0: 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61  ArrayEnter(&p->a
ef00: 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20  Mutex);.#else.  
ef10: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
ef20: 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e  rAll(p->db);.#en
ef30: 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  dif.}.#endif../*
ef40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ef50: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
ef60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
ef70: 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
ef80: 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
ef90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
efa0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
efb0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
efc0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
efd0: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
efe0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
eff0: 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
f000: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
f010: 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
f020: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
f030: 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
f040: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
f050: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
f060: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
f070: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
f080: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
f090: 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
f0a0: 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
f0b0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
f0c0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
f0d0: 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a  RAINT and write.
f0e0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ** an error mess
f0f0: 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
f100: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
f110: 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
f120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
f130: 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
f140: 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
f150: 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
f160: 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
f170: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
f180: 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
f190: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
f1a0: 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72  ns>0) || (!defer
f1b0: 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
f1c0: 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20  straint>0) ){.  
f1d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
f1e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
f1f0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
f200: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
f210: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
f220: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
f230: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  , "foreign key c
f240: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
f250: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
f260: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
f270: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f280: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
f290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f2a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
f2b0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
f2c0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
f2d0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
f2e0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
f2f0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
f300: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
f310: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
f320: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
f330: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
f340: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
f350: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
f360: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
f370: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
f380: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
f390: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
f3a0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
f3b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
f3c0: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
f3d0: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
f3e0: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
f3f0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
f400: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
f410: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
f420: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
f430: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
f440: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
f450: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
f460: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
f470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
f480: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
f490: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
f4a0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
f4b0: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
f4c0: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
f4d0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
f4e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f4f0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
f500: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
f530: 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
f540: 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
f550: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
f560: 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
f570: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
f580: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
f590: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
f5a0: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
f5b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
f5c0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
f5d0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
f5e0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
f5f0: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
f600: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
f610: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
f620: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
f630: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
f640: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
f650: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
f660: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
f670: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
f680: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
f690: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
f6a0: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
f6b0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
f6c0: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
f6d0: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
f6e0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
f6f0: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
f700: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
f710: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
f720: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
f730: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
f740: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
f750: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
f760: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
f770: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f780: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
f790: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
f7a0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
f7b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
f7c0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
f7d0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
f7e0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
f7f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
f800: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f810: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
f820: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
f830: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
f840: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
f850: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
f860: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
f870: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
f880: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
f890: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
f8a0: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
f8b0: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
f8c0: 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
f8d0: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
f8e0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
f8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
f900: 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
f910: 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
f920: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
f930: 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
f940: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
f950: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
f960: 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72  eMutexArrayEnter
f970: 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
f980: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
f990: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
f9a0: 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
f9b0: 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
f9c0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
f9d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
f9e0: 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  KED );  /* This 
f9f0: 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20  error no longer 
fa00: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73  exists */.    is
fa10: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
fa20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
fa30: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
fa40: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
fa50: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
fa60: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
fa70: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
fa80: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
fa90: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
faa0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
fab0: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
fac0: 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
fad0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
fae0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
faf0: 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
fb00: 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
fb10: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
fb20: 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
fb30: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
fb40: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
fb50: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
fb60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
fb70: 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
fb80: 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
fb90: 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
fba0: 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
fbb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
fbc0: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
fbd0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
fbe0: 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
fbf0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
fc00: 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
fc10: 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
fc20: 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
fc30: 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68     ** occured wh
fc40: 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
fc50: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
fc60: 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
fc70: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
fc80: 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
fc90: 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
fca0: 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
fcb0: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
fcc0: 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
fcd0: 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
fce0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
fcf0: 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
fd00: 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
fd10: 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
fd20: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
fd30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
fd40: 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
fd50: 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
fd60: 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
fd70: 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
fd80: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
fd90: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
fda0: 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
fdb0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
fdc0: 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
fdd0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
fde0: 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
fdf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
fe00: 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
fe10: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
fe20: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
fe30: 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
fe40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
fe50: 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
fe60: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
fe70: 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
fe80: 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
fe90: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
fea0: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
feb0: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
fec0: 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
fed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
fee0: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
fef0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ff00: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
ff10: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
ff20: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
ff30: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
ff40: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ff50: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
ff60: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
ff70: 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
ff80: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
ff90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ffa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ffb0: 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
ffc0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
ffd0: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
ffe0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
fff0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
10000 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
10010 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
10020 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
10030 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
10040 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
10050 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
10060 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
10070 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
10080 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
10090 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
100a0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
100b0 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
100c0 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
100d0 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
100e0 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
100f0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
10100 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
10110 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  & db->writeVdbeC
10120 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  nt==(p->readOnly
10130 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
10140 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10150 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
10160 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
10170 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
10180 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
10190 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
101a0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
101b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
101c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
101d0 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
101e0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
101f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
10200 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
10210 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
10220 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
10230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10240 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
10250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
10260 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
10270 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d  RAINT;.        }
10280 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
10290 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
102a0 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
102b0 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
102c0 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
102d0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
102e0 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
102f0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
10300 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
10310 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
10320 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
10330 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
10340 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
10350 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
10360 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
10370 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
10380 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
10390 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
103a0 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
103b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
103c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
103d0 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
103e0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
103f0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
10400 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
10410 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
10420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10430 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
10440 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
10450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10460 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
10470 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10480 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10490 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
104a0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
104b0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
104c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
104d0 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
104e0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
104f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10510 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10520 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
10530 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
10540 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
10550 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
10560 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
10570 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10580 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
10590 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
105a0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
105b0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
105c0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
105d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
105e0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
105f0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
10600 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
10610 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10620 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10630 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
10640 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
10650 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
10660 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10670 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10680 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
10690 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
106a0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
106b0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
106c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
106d0 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
106e0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
106f0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
10700 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10710 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
10720 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
10730 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
10740 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
10750 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
10760 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
10770 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
10780 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
10790 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
107a0 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
107b0 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
107c0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
107d0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
107e0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
107f0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
10800 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
10810 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  r code..    **. 
10820 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
10830 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
10840 53 74 61 74 65 6d 65 6e 74 28 29 20 63 61 6e 20  Statement() can 
10850 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 65 53 74  only fail if eSt
10860 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a  atementOp.    **
10870 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
10880 4c 4c 42 41 43 4b 2e 20 20 42 75 74 20 69 66 20  LLBACK.  But if 
10890 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
108a0 20 74 68 65 6e 20 65 53 74 61 74 65 6d 65 6e 74   then eStatement
108b0 4f 70 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 62  Op.    ** must b
108c0 65 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  e SAVEPOINT_RELE
108d0 41 53 45 2e 20 20 48 65 6e 63 65 20 74 68 65 20  ASE.  Hence the 
108e0 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c  NEVER(p->rc==SQL
108f0 49 54 45 5f 4f 4b 29 20 69 6e 20 0a 20 20 20 20  ITE_OK) in .    
10900 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
10910 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
10920 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
10930 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
10940 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
10950 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
10960 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
10970 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10980 20 20 20 20 20 61 73 73 65 72 74 28 20 65 53 74       assert( eSt
10990 61 74 65 6d 65 6e 74 4f 70 3d 3d 53 41 56 45 50  atementOp==SAVEP
109a0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
109b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56  .        if( NEV
109c0 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ER(p->rc==SQLITE
109d0 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  _OK) || p->rc==S
109e0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
109f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
10a00 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
10a10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10a20 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
10a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
10a40 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
10a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10a60 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
10a70 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
10a80 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10a90 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10aa0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10ab0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
10ac0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
10ad0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
10ae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10af0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
10b00 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
10b10 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
10b20 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
10b30 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10b40 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
10b50 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
10b60 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
10b70 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
10b80 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
10b90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10ba0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
10bb0 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
10bc0 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
10bd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
10be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10bf0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
10c00 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
10c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
10c30 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
10c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
10c50 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
10c60 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
10c70 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ollback or commi
10c80 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61  t any schema cha
10c90 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72  nges that occurr
10ca0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
10cb0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
10cc0 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  && db->flags&SQL
10cd0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
10ce0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
10cf0 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
10d00 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
10d10 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
10d20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c  (db->flags | SQL
10d30 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
10d40 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
10d50 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
10d60 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
10d70 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
10d80 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
10d90 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  x);.  }..  /* We
10da0 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
10db0 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
10dc0 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
10dd0 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
10de0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
10df0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74  0 ){.    db->act
10e00 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iveVdbeCnt--;.  
10e10 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
10e20 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ly ){.      db->
10e30 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  writeVdbeCnt--;.
10e40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
10e50 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
10e60 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64  Cnt>=db->writeVd
10e70 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70  beCnt );.  }.  p
10e80 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
10e90 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
10ea0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10eb0 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  db);.  if( p->db
10ec0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10ed0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
10ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
10ef0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
10f00 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
10f10 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
10f20 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
10f30 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
10f40 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
10f50 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
10f60 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
10f70 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
10f80 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
10f90 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
10fa0 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
10fb0 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
10fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10fd0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
10fe0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
10ff0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
11000 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
11010 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
11020 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  t>0 || db->autoC
11030 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
11040 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
11050 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
11060 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20  ==SQLITE_BUSY ? 
11070 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51  SQLITE_BUSY : SQ
11080 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a  LITE_OK);.}.../*
11090 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
110a0 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
110b0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
110c0 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
110d0 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
110e0 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
110f0 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
11100 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
11110 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
11120 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
11130 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
11140 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
11150 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11160 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
11170 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
11180 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
11190 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
111a0 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
111b0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
111c0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
111d0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
111e0 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
111f0 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
11200 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
11210 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
11220 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
11230 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
11240 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
11250 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
11260 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
11270 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
11280 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
11290 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
112a0 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
112b0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
112c0 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
112d0 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
112e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
112f0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
11300 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
11310 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
11320 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
11330 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
11340 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
11350 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
11360 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
11370 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
11380 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
11390 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
113a0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
113b0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
113c0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
113d0 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
113e0 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
113f0 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
11400 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
11410 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
11420 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
11430 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
11440 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
11450 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
11460 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
11470 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
11480 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
11490 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
114a0 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
114b0 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
114c0 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
114d0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
114e0 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
114f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
11500 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
11510 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
11520 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
11530 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
11540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
11550 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
11560 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67  rr,-1,p->zErrMsg
11570 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c  ,SQLITE_UTF8,SQL
11580 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
115a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
115b0 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
115c0 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
115d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
115e0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
115f0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
11600 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
11610 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
11620 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11630 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
11640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11650 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
11660 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
11670 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
11680 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
11690 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
116a0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
116b0 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
116c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
116d0 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
116e0 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
116f0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
11700 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
11710 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
11720 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
11730 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
11740 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
11750 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
11760 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
11770 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
11780 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
11790 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
117a0 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
117b0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
117c0 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
117d0 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
117e0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
117f0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
11800 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11810 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
11820 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
11830 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
11840 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
11850 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
11860 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
11870 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
11880 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
11890 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
118a0 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
118b0 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
118c0 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
118d0 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
118e0 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
118f0 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
11900 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
11910 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
11920 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
11930 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11940 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
11950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
11960 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
11970 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
11980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
11990 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
119a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
119b0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
119c0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
119d0 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
119e0 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
119f0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
11a00 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
11a10 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
11a20 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
11a30 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
11a40 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
11a50 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
11a60 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
11a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
11a80 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
11a90 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
11aa0 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
11ab0 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
11ac0 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
11ad0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
11ae0 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  INIT;.  return p
11af0 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
11b00 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
11b10 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
11b20 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
11b30 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
11b40 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
11b50 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
11b60 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
11b70 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
11b80 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
11b90 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
11ba0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
11bb0 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
11bc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11bd0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
11be0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
11bf0 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
11c00 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
11c10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11c20 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
11c30 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
11c40 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
11c50 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73  )==rc );.  }.  s
11c60 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
11c70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
11c90 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
11ca0 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20  or each auxdata 
11cb0 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75  entry in pVdbeFu
11cc0 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20  nc for which.** 
11cd0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
11ce0 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73  g bit in mask is
11cf0 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61   clear.  Auxdata
11d00 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20   entries beyond 
11d10 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73  31.** are always
11d20 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20   destroyed.  To 
11d30 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64  destroy all auxd
11d40 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c  ata entries, cal
11d50 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
11d60 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a  e with mask==0..
11d70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11d80 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
11d90 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65  (VdbeFunc *pVdbe
11da0 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b  Func, int mask){
11db0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
11dc0 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63  i=0; i<pVdbeFunc
11dd0 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAux; i++){.  
11de0 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61    struct AuxData
11df0 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46   *pAux = &pVdbeF
11e00 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20  unc->apAux[i];. 
11e10 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20     if( (i>31 || 
11e20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29  !(mask&(((u32)1)
11e30 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e  <<i))) && pAux->
11e40 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66  pAux ){.      if
11e50 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
11e60 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
11e70 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
11e80 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
11e90 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d      pAux->pAux =
11ea0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11eb0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11ec0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
11ed0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
11ee0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
11ef0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
11f00 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
11f10 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
11f20 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
11f30 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
11f40 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
11f50 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
11f60 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
11f70 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
11f80 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
11f90 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
11fa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
11fb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11fc0 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71  eDeleteObject(sq
11fd0 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
11fe0 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
11ff0 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
12000 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
12010 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
12020 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
12030 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
12040 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
12050 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
12060 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
12070 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
12080 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
12090 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
120a0 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
120b0 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
120c0 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
120d0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
120e0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
120f0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
12100 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
12110 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65  ;.  }.  vdbeFree
12120 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
12130 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
12140 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12150 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73   p->aLabel);.  s
12160 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12170 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
12180 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12190 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73  b, p->zSql);.  s
121a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
121b0 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71   p->pFree);.  sq
121c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
121d0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  p);.}../*.** Del
121e0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
121f0 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
12200 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
12210 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
12220 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45  3 *db;..  if( NE
12230 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
12240 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
12250 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
12260 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
12270 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
12280 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
12290 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
122a0 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
122b0 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
122c0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
122d0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
122e0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
122f0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
12300 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
12310 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
12320 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
12330 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63  3VdbeDeleteObjec
12340 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  t(db, p);.}../*.
12350 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
12360 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
12370 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
12380 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
12390 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
123a0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
123b0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
123c0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
123d0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
123e0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
123f0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
12400 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
12410 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
12420 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
12430 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
12440 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
12450 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
12460 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
12470 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
12480 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
12490 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
124a0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
124b0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
124c0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
124d0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
124e0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
124f0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
12500 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
12510 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
12520 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
12530 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
12540 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
12550 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
12560 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
12570 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
12580 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
12590 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
125a0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
125b0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
125c0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
125d0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
125e0 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
125f0 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
12600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
12610 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  T.    extern int
12620 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
12630 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
12640 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
12650 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  able );.    rc =
12660 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
12670 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70  etoUnpacked(p->p
12680 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
12690 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
126a0 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  res);.    if( rc
126b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
126c0 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d    p->lastRowid =
126d0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
126e0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30  ;.    if( res!=0
126f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12700 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12710 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
12720 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  id = 1;.#ifdef S
12730 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
12740 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
12750 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
12760 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
12770 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
12780 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
12790 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c  CHE_STALE;.  }el
127a0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d  se if( ALWAYS(p-
127b0 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >pCursor) ){.   
127c0 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20   int hasMoved;. 
127d0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
127e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
127f0 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
12800 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20  r, &hasMoved);. 
12810 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
12820 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68  rn rc;.    if( h
12830 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20  asMoved ){.     
12840 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
12850 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
12860 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20       p->nullRow 
12870 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
12880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12890 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
128a0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
128b0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
128c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
128d0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
128e0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
128f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
12900 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
12910 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
12920 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
12930 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
12940 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
12950 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
12960 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
12970 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
12980 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
12990 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
129a0 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
129b0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
129c0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
129d0 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
129e0 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
129f0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
12a00 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
12a10 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
12a20 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
12a30 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
12a40 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
12a50 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
12a60 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
12a70 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
12a80 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
12a90 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
12aa0 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
12ab0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
12ac0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
12ad0 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
12ae0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
12af0 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
12b00 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
12b10 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
12b20 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
12b30 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
12b40 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
12b50 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
12b60 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
12b70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
12b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
12b90 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
12ba0 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
12bb0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
12bc0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
12bd0 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
12be0 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
12bf0 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
12c20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
12c30 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
12c50 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
12c60 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
12c80 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
12c90 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
12ca0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
12cb0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
12cc0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
12cd0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
12d00 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
12d10 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
12d30 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
12d40 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
12d50 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
12d60 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
12d70 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
12d80 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
12db0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
12dc0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
12dd0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
12de0 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
12df0 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
12e20 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
12e30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
12e50 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
12e60 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
12e70 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
12ea0 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
12eb0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
12ec0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
12ed0 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
12ee0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
12ef0 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
12f00 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
12f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
12f20 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
12f30 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
12f40 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
12f50 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
12f60 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
12f70 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
12f80 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
12f90 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
12fa0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
12fb0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
12fc0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
12fd0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
12fe0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
12ff0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
13000 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
13010 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
13020 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
13030 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
13040 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
13050 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
13060 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
13070 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
13080 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
13090 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
130a0 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
130b0 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
130c0 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
130d0 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
130e0 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
130f0 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
13100 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d     if( file_form
13110 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d  at>=4 && (i&1)==
13120 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  i ){.      retur
13130 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20  n 8+(u32)i;.    
13140 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  }.    if( i<0 ){
13150 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d  .      if( i<(-M
13160 41 58 5f 36 42 59 54 45 29 20 29 20 72 65 74 75  AX_6BYTE) ) retu
13170 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50  rn 6;.      /* P
13180 72 65 76 69 6f 75 73 20 74 65 73 74 20 70 72 65  revious test pre
13190 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39  vents:  u = -(-9
131a0 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
131b0 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d  08) */.      u =
131c0 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -i;.    }else{.
131d0 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20        u = i;.   
131e0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32   }.    if( u<=12
131f0 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  7 ) return 1;.  
13200 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
13210 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
13220 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
13230 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
13240 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
13250 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
13260 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
13270 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
13280 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
13290 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
132a0 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
132b0 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
132c0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
132d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
132e0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
132f0 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70  Blob) );.  n = p
13300 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
13310 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
13320 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
13330 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  >u.nZero;.  }.  
13340 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
13350 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
13360 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
13370 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
13380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13390 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
133a0 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
133b0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
133c0 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
133d0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
133e0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
133f0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
13400 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
13410 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
13420 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
13430 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
13440 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
13450 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
13460 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
13470 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
13480 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
13490 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
134a0 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
134b0 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
134c0 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
134d0 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
134e0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
134f0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
13500 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
13510 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
13520 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
13530 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
13540 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
13550 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
13560 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
13570 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
13580 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
13590 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
135a0 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
135b0 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
135c0 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
135d0 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
135e0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
135f0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
13600 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
13610 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
13620 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
13630 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
13640 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
13650 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
13660 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
13670 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
13680 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
13690 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
136a0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
136b0 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
136c0 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
136d0 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
136e0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
136f0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
13700 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
13710 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
13720 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
13730 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
13740 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
13750 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
13760 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
13770 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
13780 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
13790 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
137a0 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
137b0 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
137c0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
137d0 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
137e0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
137f0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
13800 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
13810 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
13820 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
13830 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
13840 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
13850 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
13860 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
13870 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
13880 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
13890 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
138a0 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
138b0 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
138c0 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
138d0 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
138e0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
138f0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
13900 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
13910 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
13920 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
13930 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
13940 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
13950 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
13960 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
13970 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
13980 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
13990 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
139a0 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
139b0 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
139c0 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
139d0 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
139e0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
139f0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
13a00 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
13a10 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
13a20 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
13a30 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
13a40 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
13a50 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
13a60 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
13a70 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
13a80 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
13a90 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
13aa0 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
13ab0 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
13ac0 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
13ad0 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
13ae0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
13af0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
13b00 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
13b10 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
13b20 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
13b30 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
13b40 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
13b50 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
13b60 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
13b70 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
13b80 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
13b90 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
13ba0 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
13bb0 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
13bc0 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
13bd0 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
13be0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
13bf0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
13c00 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
13c10 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
13c20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
13c30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13c40 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
13c50 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
13c60 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
13c70 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
13c80 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
13c90 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
13ca0 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
13cb0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
13cc0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
13cd0 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
13ce0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
13cf0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
13d00 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
13d10 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
13d20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
13d30 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
13d40 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74  uf[].  nBuf must
13d50 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61   always be.** la
13d60 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
13d70 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
13d80 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  eld.  Except, if
13d90 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a   the field is.**
13da0 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a   a blob with a z
13db0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c  ero-filled tail,
13dc0 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68   then buf[] migh
13dd0 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69  t be just the ri
13de0 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68  ght.** size to h
13df0 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  old everything e
13e00 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65  xcept for the ze
13e10 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20  ro-filled tail. 
13e20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20   If buf[].** is 
13e30 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20  only big enough 
13e40 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d  to hold the non-
13e50 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65  zero prefix, the
13e60 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61  n only write tha
13e70 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f  t.** prefix into
13e80 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20   buf[].  But if 
13e90 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65  buf[] is large e
13ea0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f  nough to hold bo
13eb0 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  th the.** prefix
13ec0 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68   and the tail th
13ed0 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65  en write the pre
13ee0 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20  fix and set the 
13ef0 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a  tail to all.** z
13f00 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eros..**.** Retu
13f10 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13f20 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
13f30 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
13f40 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
13f50 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
13f60 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
13f70 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
13f80 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
13f90 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
13fa0 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
13fb0 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
13fc0 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
13fd0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
13fe0 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c   *buf, int nBuf,
13ff0 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
14000 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
14010 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
14020 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14030 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
14040 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33  le_format);.  u3
14050 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
14060 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
14070 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
14080 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
14090 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
140a0 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
140b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
140c0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
140d0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
140e0 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
140f0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
14100 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
14110 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
14120 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
14130 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
14140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
14150 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
14160 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
14170 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14180 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
14190 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
141a0 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75  t( len<=(u32)nBu
141b0 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
141c0 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
141d0 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  [i] = (u8)(v&0xF
141e0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
141f0 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
14200 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
14210 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
14220 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
14230 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
14240 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
14250 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
14260 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
14270 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
14280 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
14290 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
142a0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
142b0 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
142c0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
142d0 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65  <=nBuf );.    le
142e0 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
142f0 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
14300 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
14310 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
14320 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
14330 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d      len += pMem-
14340 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
14350 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20  assert( nBuf>=0 
14360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  );.      if( len
14370 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a   > (u32)nBuf ){.
14380 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75          len = (u
14390 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d  32)nBuf;.      }
143a0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62  .      memset(&b
143b0 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20  uf[pMem->n], 0, 
143c0 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  len-pMem->n);.  
143d0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
143e0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
143f0 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
14400 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
14410 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
14420 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
14430 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
14440 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
14450 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
14460 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
14470 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
14480 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
14490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
144a0 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32  es read..*/ .u32
144b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
144c0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
144d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
144e0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
144f0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
14500 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
14510 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
14520 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
14530 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
14540 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
14550 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
14560 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
14570 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
14580 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
14590 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
145a0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
145b0 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
145c0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
145d0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
145e0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
145f0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
14600 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
14610 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20   {  /* NULL */. 
14620 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
14630 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
14640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14650 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
14660 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
14670 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
14680 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67  pMem->u.i = (sig
14690 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b  ned char)buf[0];
146a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
146b0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
146c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
146d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
146e0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
146f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
14700 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14710 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
14720 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
14730 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [1];.      pMem-
14740 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
14750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
14760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14770 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
14780 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14790 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
147a0 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
147b0 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20  ar)buf[0])<<16) 
147c0 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20  | (buf[1]<<8) | 
147d0 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[2];.      pM
147e0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
147f0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
14800 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
14810 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
14820 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
14830 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
14840 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c  >u.i = (buf[0]<<
14850 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
14860 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
14870 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
14880 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14890 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
148a0 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
148b0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
148c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
148d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36  eger */.      u6
148e0 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20  4 x = (((signed 
148f0 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
14900 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
14910 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d   u32 y = (buf[2]
14920 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c  <<24) | (buf[3]<
14930 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c  <16) | (buf[4]<<
14940 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20  8) | buf[5];.   
14950 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
14960 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   y;.      pMem->
14970 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
14980 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
14990 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
149a0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
149b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
149c0 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
149d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
149e0 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
149f0 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
14a00 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  nt */.      u64 
14a10 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a  x;.      u32 y;.
14a20 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
14a30 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
14a40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
14a50 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
14a60 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
14a70 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
14a80 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
14a90 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
14aa0 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
14ab0 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
14ac0 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
14ad0 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
14ae0 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  OAT is.      ** 
14af0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
14b00 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
14b10 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
14b20 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20   are mixed.     
14b30 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
14b40 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
14b50 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
14b60 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
14b70 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74  0)<<32;.      st
14b80 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
14b90 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
14ba0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
14bb0 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
14bc0 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
14bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
14be0 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
14bf0 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
14c00 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
14c10 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
14c20 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
14c30 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
14c40 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
14c50 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
14c60 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
14c70 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
14c80 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
14c90 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
14ca0 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
14cb0 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
14cc0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
14cd0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  .        pMem->u
14ce0 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
14cf0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
14d00 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
14d10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14d20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14d30 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
14d40 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29  of(pMem->r)==8 )
14d50 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69  ;.        swapMi
14d60 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
14d70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
14d80 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20  y(&pMem->r, &x, 
14d90 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
14da0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14db0 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
14dc0 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75  Mem->r) ? MEM_Nu
14dd0 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
14de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
14df0 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
14e00 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
14e10 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
14e20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
14e30 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
14e40 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72   pMem->u.i = ser
14e50 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20  ial_type-8;.    
14e60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14e70 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
14e80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
14e90 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
14ea0 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73      u32 len = (s
14eb0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
14ec0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
14ed0 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
14ee0 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c       pMem->n = l
14ef0 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  en;.      pMem->
14f00 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  xDel = 0;.      
14f10 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26  if( serial_type&
14f20 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
14f30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14f40 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65  M_Str | MEM_Ephe
14f50 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
14f60 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
14f70 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c  ags = MEM_Blob |
14f80 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
14f90 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
14fa0 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   len;.    }.  }.
14fb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
14fc0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
14fd0 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
14fe0 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
14ff0 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20  n pKey[], parse 
15000 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e  the.** record in
15010 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63  to a UnpackedRec
15020 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20  ord structure.  
15030 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
15040 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75   to.** that stru
15050 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cture..**.** The
15060 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
15070 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20  n might provide 
15080 73 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66  szSpace bytes of
15090 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65   memory.** space
150a0 20 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69   at pSpace.  Thi
150b0 73 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75  s space can be u
150c0 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  sed to hold the 
150d0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65  returned.** VDbe
150e0 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72  ParsedRecord str
150f0 75 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20  ucture if it is 
15100 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49  large enough.  I
15110 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62  f it is.** not b
15120 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65  ig enough, space
15130 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
15140 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
15150 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ()..**.** The re
15160 74 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65  turned structure
15170 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
15180 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a  d by a call to.*
15190 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  * sqlite3VdbeDel
151a0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
151b0 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65  d()..*/ .Unpacke
151c0 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
151d0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
151e0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
151f0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
15200 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
15210 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
15220 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15240 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
15250 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
15260 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
15270 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
15280 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
15290 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
152a0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69          /* Unali
152b0 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c  gned space avail
152c0 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
152d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
152e0 20 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20   szSpace        
152f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
15300 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
15310 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
15320 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
15330 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
15340 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
15350 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
15360 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20 75  rd *p;  /* The u
15370 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
15380 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74 75  hat we will retu
15390 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
153a0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  e;          /* M
153b0 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65 64  emory space need
153c0 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69 6e  ed to hold p, in
153d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
153e0 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  d;.  u32 idx;.  
153f0 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20  u16 u;          
15400 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
15410 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
15420 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
15430 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20  em *pMem;.  int 
15440 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  nOff;           
15450 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70 61  /* Increase pSpa
15460 63 65 20 62 79 20 74 68 69 73 20 6d 75 63 68 20  ce by this much 
15470 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 20  to 8-byte align 
15480 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20  it */.  .  /*.  
15490 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  ** We want to sh
154a0 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
154b0 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
154c0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
154d0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
154e0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
154f0 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
15500 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
15510 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
15520 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
15530 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
15540 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
15550 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
15560 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
15570 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
15580 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
15590 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
155a0 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d 20   7;.  pSpace += 
155b0 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65 20  nOff;.  szSpace 
155c0 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74 65  -= nOff;.  nByte
155d0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
155e0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
155f0 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
15600 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
15610 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
15620 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20  e>szSpace ){.   
15630 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
15640 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
15650 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
15660 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
15670 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c  urn 0;.    p->fl
15680 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
15690 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43  EED_FREE | UNPAC
156a0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
156b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
156c0 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
156d0 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20  rd*)pSpace;.    
156e0 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43  p->flags = UNPAC
156f0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
15700 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49  ;.  }.  p->pKeyI
15710 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
15720 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
15730 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
15740 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   1;.  p->aMem = 
15750 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28  pMem = (Mem*)&((
15760 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28  char*)p)[ROUND8(
15770 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
15780 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65  ecord))];.  asse
15790 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
157a0 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
157b0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
157c0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
157d0 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
157e0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
157f0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
15800 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  u<p->nField && d
15810 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  <=nKey ){.    u3
15820 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
15830 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
15840 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
15850 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
15860 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
15870 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
15880 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
15890 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
158a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
158b0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  ;.    pMem->zMal
158c0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
158d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
158e0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
158f0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
15900 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
15910 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
15920 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
15930 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
15940 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
15950 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   u;.  return (vo
15960 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id*)p;.}../*.** 
15970 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73  This routine des
15980 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64  troys a Unpacked
15990 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a  Record object..*
159a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
159b0 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64  beDeleteUnpacked
159c0 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52  Record(UnpackedR
159d0 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74  ecord *p){.  int
159e0 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   i;.  Mem *pMem;
159f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
15a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
15a10 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
15a20 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29  D_NEED_DESTROY )
15a30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65  ;.  for(i=0, pMe
15a40 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e  m=p->aMem; i<p->
15a50 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65  nField; i++, pMe
15a60 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  m++){.    /* The
15a70 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
15a80 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74   is always const
15a90 72 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20  ructed by the.  
15aa0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
15ab0 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66  UnpackRecord() f
15ac0 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77  unction above, w
15ad0 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20  hich makes all. 
15ae0 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e     ** strings an
15af0 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20  d blobs static. 
15b00 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   And none of the
15b10 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20   elements are.  
15b20 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66    ** ever transf
15b30 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20  ormed, so there 
15b40 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e  is never anythin
15b50 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20  g to delete..   
15b60 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
15b70 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29  R(pMem->zMalloc)
15b80 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
15b90 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
15ba0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61    }.  if( p->fla
15bb0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
15bc0 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73  ED_FREE ){.    s
15bd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
15be0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29  pKeyInfo->db, p)
15bf0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
15c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
15c10 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
15c20 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
15c30 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
15c40 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
15c50 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
15c60 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
15c70 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
15c80 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
15c90 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
15ca0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
15cb0 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
15cc0 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
15cd0 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
15ce0 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
15cf0 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
15d00 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b  ted by th OP_Mak
15d10 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
15d20 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
15d30 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
15d40 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
15d50 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
15d60 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
15d70 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
15d80 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ord..**.** Key1 
15d90 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
15da0 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
15db0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
15dc0 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68  of fields..** Th
15dd0 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72  e key with fewer
15de0 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c   fields is usual
15df0 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73  ly compares less
15e00 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f   than the .** lo
15e10 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76  nger key.  Howev
15e20 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b  er if the UNPACK
15e30 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73  ED_INCRKEY flags
15e40 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65   in pPKey2 is se
15e50 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d  t.** and the com
15e60 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65  mon prefixes are
15e70 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79   equal, then key
15e80 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b  1 is less than k
15e90 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68  ey2..** Or if th
15ea0 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48  e UNPACKED_MATCH
15eb0 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20  _PREFIX flag is 
15ec0 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66  set and the pref
15ed0 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  ixes are.** equa
15ee0 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73  l, then the keys
15ef0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
15f00 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a  to be equal and.
15f10 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79  ** the parts bey
15f20 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  ond the common p
15f30 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65  refix are ignore
15f40 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
15f50 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
15f60 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65  ROWID flag is se
15f70 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
15f80 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
15f90 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20  header of pKey1 
15fa0 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20  is ignored.  It 
15fb0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
15fc0 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69  pKey1 is.** an i
15fd0 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68  ndex key, and th
15fe0 75 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72  us ends with a r
15ff0 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65  owid value.  The
16000 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66   last byte.** of
16010 20 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c   the header will
16020 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68   therefore be th
16030 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
16040 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f   the rowid:.** o
16050 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34  ne of 1, 2, 3, 4
16060 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20  , 5, 6, 8, or 9 
16070 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65  - the integer se
16080 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54  rial types..** T
16090 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
160a0 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  f the final rowi
160b0 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  d will always be
160c0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
160d0 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74  ** By ignoring t
160e0 68 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66  his last byte of
160f0 20 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20   the header, we 
16100 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72  force the compar
16110 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72  ison.** to ignor
16120 65 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  e the rowid at t
16130 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a  he end of key1..
16140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16150 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
16160 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
16170 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
16180 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
16190 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
161a0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
161b0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
161c0 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20  ){.  int d1;    
161d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
161e0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
161f0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
16200 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
16210 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
16220 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
16230 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
16240 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
16250 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
16260 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
16270 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
16280 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
16290 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
162a0 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
162b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
162c0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
162d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
162e0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
162f0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
16300 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
16310 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
16320 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
16330 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
16340 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
16350 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
16360 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
16370 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
16380 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
16390 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
163a0 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
163b0 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
163c0 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
163d0 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
163e0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
163f0 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
16400 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
16410 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
16420 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
16430 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
16440 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
16450 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
16460 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
16470 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
16480 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
16490 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
164a0 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
164b0 20 62 65 20 75 73 65 64 20 69 6e 69 74 69 61 6c   be used initial
164c0 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
164d0 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
164e0 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
164f0 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
16500 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
16510 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
16520 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
16530 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
16540 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
16550 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
16560 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
16570 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
16580 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
16590 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
165a0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
165b0 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
165c0 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
165d0 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
165e0 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
165f0 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
16600 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
16610 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
16620 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
16630 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79  dr1;.  if( pPKey
16640 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
16650 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
16660 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d   ){.    szHdr1--
16670 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d  ;.  }.  nField =
16680 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
16690 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
166a0 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
166b0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20  ey2->nField ){. 
166c0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
166d0 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
166e0 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
166f0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
16700 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
16710 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
16720 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
16730 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
16740 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20  ial_type1 );.   
16750 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
16760 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
16770 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
16780 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
16790 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  ak;..    /* Extr
167a0 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
167b0 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
167c0 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
167d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
167e0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
167f0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
16800 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
16810 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
16820 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
16830 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
16840 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
16850 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20  2->aMem[i],.    
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20         i<nField 
16880 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
16890 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
168a0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
168b0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
168c0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
168d0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
168e0 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ow */..      /* 
168f0 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
16900 74 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  t if we are usin
16910 67 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  g DESC sort orde
16920 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
16930 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
16940 72 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64  rder && i<nField
16950 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
16960 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
16970 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
16980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  .      }.    .  
16990 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52      /* If the PR
169a0 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67  EFIX_SEARCH flag
169b0 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20   is set and all 
169c0 66 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68  fields except th
169d0 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  e final.      **
169e0 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72   rowid field wer
169f0 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c  e equal, then cl
16a00 65 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53  ear the PREFIX_S
16a10 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73  EARCH flag and s
16a20 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b  et .      ** pPK
16a30 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68  ey2->rowid to th
16a40 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72  e value of the r
16a50 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70  owid field in (p
16a60 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20  Key1, nKey1)..  
16a70 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
16a80 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73  sed by the OP_Is
16a90 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20  Unique opcode.. 
16aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16ab0 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  ( (pPKey2->flags
16ac0 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
16ad0 49 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d  IX_SEARCH) && i=
16ae0 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  =(pPKey2->nField
16af0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  -1) ){.        a
16b00 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48  ssert( idx1==szH
16b10 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20  dr1 && rc );.   
16b20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
16b30 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  1.flags & MEM_In
16b40 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b  t );.        pPK
16b50 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55  ey2->flags &= ~U
16b60 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53  NPACKED_PREFIX_S
16b70 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70  EARCH;.        p
16b80 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d  PKey2->rowid = m
16b90 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  em1.u.i;.      }
16ba0 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75  .    .      retu
16bb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16bc0 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
16bd0 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
16be0 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
16bf0 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
16c00 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
16c10 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
16c20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
16c30 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
16c40 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
16c50 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
16c60 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
16c70 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
16c80 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
16c90 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
16ca0 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d  ( mem1.zMalloc==
16cb0 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
16cc0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
16cd0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
16ce0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
16cf0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
16d00 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
16d10 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
16d20 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55   equal. If the U
16d30 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a  NPACKED_INCRKEY.
16d40 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
16d50 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65  , then break the
16d60 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67   tie by treating
16d70 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e   key2 as larger.
16d80 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41  .  ** If the UPA
16d90 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
16da0 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  H flag is set, t
16db0 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f  hen keys with co
16dc0 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20  mmon prefixes.  
16dd0 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ** are considere
16de0 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20  d to be equal.  
16df0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c  Otherwise, the l
16e00 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65  onger key is the
16e10 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20   .  ** larger.  
16e20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
16e30 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61  he pPKey2 will a
16e40 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e  lways be the lon
16e50 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  ger.  ** if ther
16e60 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63  e is a differenc
16e70 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
16e80 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ( rc==0 );.  if(
16e90 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
16ea0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
16eb0 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31  Y ){.    rc = -1
16ec0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
16ed0 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
16ee0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
16ef0 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65  TCH ){.    /* Le
16f00 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d  ave rc==0 */.  }
16f10 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a  else if( idx1<sz
16f20 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  Hdr1 ){.    rc =
16f30 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
16f40 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20   rc;.}. ../*.** 
16f50 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
16f60 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
16f70 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
16f80 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
16f90 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
16fa0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
16fb0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
16fc0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
16fd0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
16fe0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
16ff0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
17000 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
17010 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
17020 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
17030 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
17040 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
17050 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
17060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
17070 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
17080 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
17090 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
170a0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
170b0 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
170c0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
170d0 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
170e0 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
170f0 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
17100 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
17110 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
17120 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
17130 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
17140 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
17150 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
17160 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
17170 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
17180 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
17190 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
171a0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
171b0 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44   m, v;..  UNUSED
171c0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
171d0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
171e0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
171f0 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
17200 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
17210 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
17220 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
17230 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
17240 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
17250 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
17260 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
17270 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
17280 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
17290 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
172a0 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
172b0 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
172c0 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
172d0 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
172e0 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
172f0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
17300 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
17310 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
17320 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
17330 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
17340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
17350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
17360 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
17370 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
17380 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
17390 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
173a0 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
173b0 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
173c0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
173d0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
173e0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
173f0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
17400 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
17410 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
17420 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
17430 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
17440 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43  pCur, 0, (int)nC
17450 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
17460 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
17470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
17480 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
17490 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
174a0 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
174b0 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
174c0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
174d0 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
174e0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
174f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17500 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
17510 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
17520 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
17530 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
17540 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
17550 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
17560 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
17570 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
17580 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
17590 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
175a0 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
175b0 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
175c0 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
175d0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
175e0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
175f0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
17600 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
17610 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17620 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
17630 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
17640 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
17650 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
17660 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
17670 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
17680 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
17690 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
176a0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
176b0 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
176c0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
176d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
176e0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
176f0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
17700 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
17710 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
17720 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
17730 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
17740 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
17750 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
17760 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17770 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
17780 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
17790 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
177a0 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
177b0 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
177c0 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
177d0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
177e0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
177f0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
17800 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
17810 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
17820 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
17830 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
17840 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
17850 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
17860 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
17870 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
17880 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
17890 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
178b0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
178c0 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
178d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
178e0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
178f0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
17900 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
17910 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
17920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17930 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
17940 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
17950 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
17960 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
17970 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
17980 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
17990 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
179a0 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
179b0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
179c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
179d0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
179e0 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
179f0 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
17a00 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
17a10 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
17a20 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
17a30 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
17a40 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
17a50 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
17a60 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
17a70 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
17a80 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
17a90 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
17aa0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
17ab0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
17ac0 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
17ad0 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
17ae0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
17af0 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
17b00 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
17b10 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
17b20 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
17b30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
17b40 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
17b50 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
17b60 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
17b70 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
17b80 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
17b90 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
17ba0 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
17bb0 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
17bc0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
17bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17be0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
17bf0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
17c00 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C,             /
17c10 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
17c20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
17c30 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
17c40 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
17c50 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
17c60 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63  sion of key to c
17c70 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
17c80 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
17cb0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
17cc0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
17cd0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
17ce0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
17cf0 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
17d00 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
17d10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17d20 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17d30 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
17d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17d50 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
17d60 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
17d70 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
17d80 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75  _OK );    /* pCu
17d90 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
17da0 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
17db0 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a  not fail */.  /*
17dc0 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61   nCellKey will a
17dd0 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e  lways be between
17de0 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66   0 and 0xfffffff
17df0 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  f because of the
17e00 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62   say.  ** that b
17e10 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
17e20 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65  () and sqlite3Ge
17e30 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20  tVarint32() are 
17e40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20  implemented */. 
17e50 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
17e60 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37   || nCellKey>0x7
17e70 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a  fffffff ){.    *
17e80 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
17e90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17ea0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d  PT_BKPT;.  }.  m
17eb0 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
17ec0 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20  eof(m));.  rc = 
17ed0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
17ee0 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
17ef0 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  sor, 0, (int)nCe
17f00 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17f10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17f20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17f30 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65  assert( pUnpacke
17f40 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  d->flags & UNPAC
17f50 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
17f60 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c   );.  *res = sql
17f70 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
17f80 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
17f90 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
17fa0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
17fb0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17fc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17fd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17fe0 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
17ff0 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
18000 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
18010 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
18020 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
18030 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
18040 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
18050 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
18060 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
18070 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
18080 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
18090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
180a0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
180b0 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
180c0 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
180d0 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
180e0 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
180f0 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
18100 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
18110 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
18120 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
18130 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
18140 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
18150 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
18160 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
18170 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
18180 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
18190 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
181a0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
181b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
181c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
181d0 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
181e0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
181f0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
18200 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
18210 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
18220 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
18230 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
18240 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
18250 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
18260 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
18270 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
18280 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
18290 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
182a0 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
182b0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
182c0 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
182d0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
182e0 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
182f0 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
18300 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
18310 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
18320 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
18330 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
18340 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
18350 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
18360 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
18370 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
18380 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
18390 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
183a0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
183b0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
183c0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
183d0 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
183e0 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
183f0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
18400 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
18410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18420 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
18430 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
18440 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
18450 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
18460 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
18470 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
18480 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
18490 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
184a0 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
184b0 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
184c0 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
184d0 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
184e0 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
184f0 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
18500 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
18510 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
18520 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
18530 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
18540 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
18550 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
18560 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
18570 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
18580 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
18590 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56  e3VdbeGetValue(V
185a0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
185b0 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
185c0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
185d0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
185e0 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
185f0 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
18600 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
18610 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
18620 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18630 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
18640 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
18650 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
18660 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
18670 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
18680 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
18690 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
186a0 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
186b0 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
186c0 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
186d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
186e0 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
186f0 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b  pe((Mem *)pRet);
18700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18710 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
18720 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
18730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
18740 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
18750 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
18760 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
18770 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
18780 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
18790 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
187a0 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
187b0 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
187c0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
187d0 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
187e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
187f0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
18800 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
18810 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
18820 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
18830 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
18840 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
18850 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
18860 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
18870 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
18880 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a           r-1));.  }.}.