/ Hex Artifact Content
Login

Artifact 3170e917af38835621deddee560e53e188147f5b:


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: 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 50 61 72    if( op==OP_Par
0f60: 73 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  seSchema ){.    
0f70: 2f 2a 20 41 6e 79 20 70 72 6f 67 72 61 6d 20 74  /* Any program t
0f80: 68 61 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f  hat uses the OP_
0f90: 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f  ParseSchema opco
0fa0: 64 65 20 6e 65 65 64 73 20 74 6f 20 6c 6f 63 6b  de needs to lock
0fb0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 62 74 72 65  .    ** all btre
0fc0: 65 73 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 62 74  es. */.    p->bt
0fd0: 72 65 65 4d 61 73 6b 20 3d 20 7e 28 79 44 62 4d  reeMask = ~(yDbM
0fe0: 61 73 6b 29 30 3b 0a 20 20 7d 0a 23 69 66 64 65  ask)0;.  }.#ifde
0ff0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1000: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d   pOp->zComment =
1010: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
1020: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
1030: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
1040: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
1050: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23  Op[i]);.#endif.#
1060: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
1070: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
1080: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
1090: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
10a0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
10b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
10d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
10e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
10f0: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1100: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1110: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1120: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1130: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1140: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1150: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1160: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1170: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1180: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1190: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
11a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
11c0: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
11d0: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
11e0: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
11f0: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1200: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1220: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1230: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1240: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1250: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1270: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1280: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1290: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
12a0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
12b0: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
12c0: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
12d0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
12e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12f0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1300: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1310: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1320: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1330: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
1340: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
1350: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
1360: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1380: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13a0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
13b0: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
13c0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
13d0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
13e0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
13f0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1400: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
1410: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1420: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
1430: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1440: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
1450: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
1460: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
1470: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1480: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1490: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
14a0: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
14b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14d0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
14e0: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
14f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1500: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1510: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
1520: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1530: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
1540: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
1550: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1560: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1570: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1590: 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45  (p, addr, SQLITE
15a0: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c  _INT_TO_PTR(p4),
15b0: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65   P4_INT32);.  re
15c0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
15d0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
15e0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
15f0: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1600: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1610: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1620: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1630: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
1640: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
1650: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
1660: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
1670: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
1680: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
1690: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
16a0: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
16b0: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
16c0: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
16d0: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
16e0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
16f0: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1700: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1710: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1720: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1730: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
1740: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
1750: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
1760: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
1770: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
1780: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
1790: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
17a0: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
17b0: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
17c0: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
17d0: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
17e0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
17f0: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1800: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1810: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1820: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1830: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
1840: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
1850: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1860: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
1870: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
1880: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1890: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
18a0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
18b0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
18c0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
18d0: 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c   n = p->nLabelAl
18e0: 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 70  loc*2 + 5;.    p
18f0: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1900: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1910: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1920: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69 7a             n*siz
1950: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
1960: 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65  ));.    p->nLabe
1970: 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  lAlloc = sqlite3
1980: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
1990: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f 73  db, p->aLabel)/s
19a0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
19b0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0]);.  }.  if( p
19c0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
19d0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
19e0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
19f0: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
1a00: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1a10: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1a20: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1a30: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
1a40: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
1a50: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
1a60: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1a70: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1a80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
1a90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1aa0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
1ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ac0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
1ad0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
1ae0: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
1af0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1b00: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1b10: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1b20: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1b30: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1b40: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b50: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1b60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
1b70: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
1b80: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
1b90: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
1ba0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1bb0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
1bc0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
1bd0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
1be0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1bf0: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
1c00: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
1c10: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
1c20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1c30: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
1c40: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
1c50: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1c60: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
1c70: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
1c80: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
1c90: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
1ca0: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
1cb0: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
1cc0: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
1cd0: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
1ce0: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
1cf0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
1d00: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
1d10: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
1d20: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
1d30: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
1d40: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
1d50: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
1d80: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
1d90: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
1da0: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
1db0: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
1dc0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
1dd0: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
1de0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
1df0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
1e00: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
1e10: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
1e20: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
1e30: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
1e40: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
1e70: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
1e80: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
1e90: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
1ea0: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
1eb0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
1ec0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ef0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
1f00: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
1f30: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1f40: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
1f50: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
1f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
1f70: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
1f80: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
1f90: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
1fa0: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
1fb0: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
1fc0: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
1fd0: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
1fe0: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
1ff0: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
2000: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
2010: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
2020: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
2030: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
2040: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2050: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
2060: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
2070: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
2080: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
2090: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
20a0: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
20b0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20c0: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
20d0: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
20e0: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
20f0: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
2100: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
2110: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
2120: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
2130: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
2140: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
2150: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
2160: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
2170: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
2180: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
2190: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
21a0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
21b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
21c0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
21d0: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
21e0: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
21f0: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
2200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2210: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
2220: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
2230: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2240: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
2250: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
2260: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2270: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
2280: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
2290: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
22b0: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
22c0: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
22d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
2300: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
2310: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
2320: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
2330: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
2340: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
2350: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
2360: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
2370: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
2380: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
2390: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
23a0: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
23b0: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
23c0: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
23d0: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
23e0: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
23f0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
2400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2410: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
2420: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2430: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2440: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2450: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
2460: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
2470: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
2480: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
2490: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
24a0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
24b0: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
24c0: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
24d0: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
24e0: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
24f0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2500: 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54  straint).**.** T
2510: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
2520: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
2530: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
2540: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
2550: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
2560: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2570: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
2580: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
2590: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
25a0: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
25b0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
25c0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
25d0: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
25e0: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
25f0: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
2600: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
2610: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
2620: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
2630: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
2640: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
2650: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
2660: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
2670: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
2680: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
2690: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
26a0: 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  ort = 0;.  Op *p
26b0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72  Op;.  VdbeOpIter
26c0: 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74   sIter;.  memset
26d0: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
26e0: 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49  of(sIter));.  sI
26f0: 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68  ter.v = v;..  wh
2700: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2710: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21  erNext(&sIter))!
2720: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  =0 ){.    int op
2730: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
2740: 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  de;.    if( opco
2750: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c  de==OP_Destroy |
2760: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  | opcode==OP_VUp
2770: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
2780: 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e  OP_VRename .#ifn
2790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27a0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
27b0: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
27c0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
27d0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
27e0: 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20  p2==1) .#endif. 
27f0: 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d      || ((opcode=
2800: 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f  =OP_Halt || opco
2810: 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  de==OP_HaltIfNul
2820: 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 70 4f  l) .      && (pO
2830: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->p1==SQLITE_CO
2840: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
2850: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a  >p2==OE_Abort)).
2860: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73      ){.      has
2870: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  Abort = 1;.     
2880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2890: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
28a0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
28b0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
28c0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
28d0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
28e0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
28f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a  ailure occured..
2900: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
2910: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
2920: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
2930: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
2940: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
2950: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
2960: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
2970: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
2980: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
2990: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
29a0: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
29b0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
29c0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
29d0: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
29e0: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
29f0: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
2a00: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
2a10: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29  bort==mayAbort )
2a20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2a30: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
2a40: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2a50: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
2a60: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
2a70: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
2a80: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
2a90: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
2aa0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
2ab0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
2ac0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
2ad0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
2ae0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
2af0: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
2b00: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
2b10: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
2b20: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
2b30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2b40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
2b50: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
2b60: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
2b70: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
2b80: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
2b90: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
2ba0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
2bb0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
2bc0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
2bd0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
2be0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
2bf0: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
2c00: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
2c10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
2c20: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
2c30: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
2c40: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
2c50: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
2c60: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
2c70: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
2c80: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
2c90: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
2ca0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
2cb0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
2cc0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
2cd0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
2ce0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
2cf0: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
2d00: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
2d10: 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28 70 4f 70  y = 1;.  for(pOp
2d20: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2d30: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2d40: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  pOp++){.    u8 o
2d50: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2d60: 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f  ode;..    pOp->o
2d70: 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pflags = sqlite3
2d80: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f  OpcodeProperty[o
2d90: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
2da0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
2db0: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
2dc0: 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20 20  P_AggStep ){.   
2dd0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e     if( pOp->p5>n
2de0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2df0: 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  gs = pOp->p5;.  
2e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 63    }else if( (opc
2e10: 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74  ode==OP_Transact
2e20: 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d  ion && pOp->p2!=
2e30: 30 29 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  0) || opcode==OP
2e40: 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  _Vacuum ){.     
2e50: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2e60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2e70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e80: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
2e90: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2ea0: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
2eb0: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
2ec0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
2ed0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73  Op->p2;.    }els
2ee0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2ef0: 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  _VFilter ){.    
2f00: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61    int n;.      a
2f10: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
2f20: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
2f30: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
2f40: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
2f50: 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  er );.      n = 
2f60: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
2f70: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
2f80: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
2f90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
2fa0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
2fb0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
2fc0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
2fd0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
2fe0: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
2ff0: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
3000: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
3010: 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a  el[-1-pOp->p2];.
3020: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
3030: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
3040: 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70   p->aLabel);.  p
3050: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20  ->aLabel = 0;.. 
3060: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3070: 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a   nMaxArgs;.}../*
3080: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
3090: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
30a0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
30b0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
30c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
30d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
30e0: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
30f0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3100: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3110: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3130: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3140: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3150: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
3160: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
3170: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
3180: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3190: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
31a0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
31b0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
31c0: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
31d0: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
31e0: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
31f0: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3200: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3210: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3220: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3230: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3240: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3250: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3260: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
3270: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
3280: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
3290: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
32a0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
32b0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
32c0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
32d0: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
32e0: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
32f0: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3300: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3310: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3320: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3330: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3340: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3350: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3360: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3370: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3380: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3390: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
33a0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
33b0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
33c0: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
33d0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
33e0: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
33f0: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3400: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3410: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3420: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3430: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3440: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3460: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3470: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3480: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3490: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
34a0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
34b0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
34c0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
34d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
34e0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
34f0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3500: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
3510: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
3520: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
3530: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3540: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
3550: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
3560: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
3570: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3580: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
3590: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
35a0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
35b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
35c0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
35d0: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
35e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
35f0: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
3600: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
3610: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
3620: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
3630: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
3640: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
3650: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
3660: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
3670: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
3680: 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33  p2<0 && (sqlite3
3690: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
36a0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  Out->opcode] & O
36b0: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b  PFLG_JUMP)!=0 ){
36c0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
36d0: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
36e0: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
36f0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
3700: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
3710: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
3720: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
3730: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
3740: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
3750: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
3760: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
3770: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
3780: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
3790: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
37a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
37c0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
37d0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
37e0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
37f0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
3800: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
3810: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
3820: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
3830: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
3840: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3850: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
3860: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
3870: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
3880: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
3890: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
38a0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
38b0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
38c0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
38d0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
38e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
38f0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
3900: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
3910: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
3920: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
3930: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3940: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
3950: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3960: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
3980: 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  r>=0 );.  if( p-
3990: 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20  >nOp>addr ){.   
39a0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
39b0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
39c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
39d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
39e0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
39f0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3a00: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3a10: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3a20: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3a30: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3a50: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3a60: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3a70: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3a80: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
3a90: 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20  t( addr>=0 );.  
3aa0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20  if( p->nOp>addr 
3ab0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3ac0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
3ad0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3ae0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3af0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
3b00: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
3b10: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3b20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3b30: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
3b40: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
3b50: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3b60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
3b70: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
3b80: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
3b90: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3ba0: 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p3 = val;.  }.}.
3bb0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3bc0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3bd0: 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68  5 operand for th
3be0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a  e most recently.
3bf0: 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69  ** added operati
3c00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3c10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
3c20: 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29  Vdbe *p, u8 val)
3c30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3c40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
3c50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3c60: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
3c70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3c80: 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p5 = val;.  }.}
3c90: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3ca0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
3cb0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
3cc0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
3cd0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
3ce0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
3cf0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
3d00: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
3d10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
3d20: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
3d30: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73  int addr){.  ass
3d40: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
3d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3d60: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
3d70: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
3d80: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
3d90: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
3da0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
3db0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
3dc0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
3dd0: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
3de0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
3df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e00: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3e10: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
3e20: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
3e30: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
3e40: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
3e50: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3e60: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
3e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3e80: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
3e90: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
3ea0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
3eb0: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
3ec0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
3ed0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
3ee0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3f00: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
3f10: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
3f20: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
3f30: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
3f40: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
3f50: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
3f60: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
3f70: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f80: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
3f90: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
3fa0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
3fb0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
3fc0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20  P4_INTARRAY:.   
3fd0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
3fe0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
3ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4000: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4020: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4030: 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20  4_MPRINTF: {.   
4040: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4050: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4060: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b  qlite3_free(p4);
4070: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4090: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
40a0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
40b0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
40c0: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
40d0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
40e0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
40f0: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
4100: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
4110: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4120: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
4130: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
4140: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
4150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4160: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
4170: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
4180: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4190: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
41a0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
41b0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
41c0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
41d0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
41e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
41f0: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4200: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4210: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4220: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4230: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4240: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4250: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4260: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4270: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
4280: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4290: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
42a0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
42b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
42c0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
42d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
42e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
42f0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4300: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4310: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4320: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4330: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4340: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4350: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4360: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4370: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4380: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4390: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
43a0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
43b0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
43c0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
43d0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
43e0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
43f0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4400: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4420: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4430: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4440: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4450: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4460: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4470: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4480: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4490: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
44a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
44b0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
44c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
44d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44e0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
44f0: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
4500: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
4510: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4520: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
4530: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
4540: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
4550: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
4560: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
4570: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
4580: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
4590: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
45a0: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
45b0: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
45c0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
45d0: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
45e0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
45f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4600: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
4610: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
4620: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
4630: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
4640: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
4650: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
4660: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
4670: 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61  ge N opcodes sta
4680: 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f  rting at addr to
4690: 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64   No-ops..*/.void
46a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
46b0: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
46c0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
46d0: 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70  N){.  if( p->aOp
46e0: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
46f0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
4700: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
4710: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
4720: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
4730: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4740: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4750: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
4760: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
4770: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
4780: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
4790: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
47a0: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
47b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
47c0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
47d0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
47e0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
47f0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4810: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
4820: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
4830: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
4840: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4850: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4860: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4870: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4880: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4890: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
48a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
48b0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
48c0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
48d0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
48e0: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
48f0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
4900: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4920: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
4930: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
4940: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4950: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4960: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4970: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4980: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4990: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
49a0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
49b0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
49c0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
49d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
49e0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
49f0: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
4a00: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
4a10: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
4a20: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4a30: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
4a40: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4a50: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4a60: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4a70: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4a80: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4a90: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4aa0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4ab0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4ac0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4ad0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4ae0: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
4af0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4b00: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
4b10: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
4b20: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
4b30: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
4b40: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4b50: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4b60: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4b70: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4b80: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4b90: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4ba0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4bb0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4bc0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4bd0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4be0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
4bf0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
4c00: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
4c10: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
4c20: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
4c30: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
4c40: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4c50: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4c60: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4c70: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4c80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4c90: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4ca0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4cc0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4cd0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4cf0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4d10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4d20: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4d30: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4d50: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4d60: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4d70: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4d80: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
4d90: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
4da0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
4db0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4dc0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
4dd0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
4de0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
4df0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
4e00: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
4e10: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
4e20: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
4e30: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4e40: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4e50: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
4e60: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
4e70: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
4e80: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
4e90: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
4ea0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
4eb0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
4ec0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
4ed0: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
4ee0: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
4ef0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
4f00: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
4f10: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
4f20: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
4f30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
4f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
4f50: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
4f60: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
4f70: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
4f80: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
4f90: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
4fa0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
4fb0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
4fc0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
4fd0: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
4fe0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
4ff0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
5000: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
5010: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
5020: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
5030: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
5040: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
5050: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
5060: 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  Byte);.    pOp->
5070: 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p4.pKeyInfo = pK
5080: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
5090: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
50a0: 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72    u8 *aSortOrder
50b0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28  ;.      memcpy((
50c0: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
50d0: 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69  zP4, nByte - nFi
50e0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  eld);.      aSor
50f0: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
5100: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
5110: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
5120: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
5130: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5140: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
5150: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
5160: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
5170: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
5180: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5190: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
51a0: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
51b0: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  }.      pOp->p4t
51c0: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
51d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51e0: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
51f0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5200: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5210: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
5220: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
5230: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
5240: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
5250: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5260: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5270: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
5280: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
5290: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
52a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
52b0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
52c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
52d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
52e0: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
52f0: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
5300: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
5310: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
5320: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
5330: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5340: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5350: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5360: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
5370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
5380: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
5390: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
53a0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
53b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
53c0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
53d0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
53e0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
53f0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5400: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
5410: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
5420: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
5430: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
5440: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
5450: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
5460: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
5470: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
5480: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
5490: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
54a0: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
54b0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
54c0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
54d0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
54e0: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
54f0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
5500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
5510: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
5520: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5530: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
5540: 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29  t ap;.  if( !p )
5550: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
5560: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
5570: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
5580: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
5590: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
55a0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
55b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
55c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
55d0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
55e0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
55f0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
5600: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
5610: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
5620: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5630: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
5640: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
5650: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
5660: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5670: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5680: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5690: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
56a0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
56b0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
56c0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
56d0: 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  p;.  if( !p ) re
56e0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
56f0: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
5700: 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28  Noop);.  assert(
5710: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
5720: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
5730: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
5740: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5750: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
5760: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5770: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5780: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
5790: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
57a0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
57b0: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
57c0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
57d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
57e0: 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20  (p->db, *pz);.  
57f0: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
5800: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5810: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5820: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5830: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
5840: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
5850: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
5860: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
5870: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
5880: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
5890: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
58a0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
58b0: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
58c0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
58d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
58e0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
58f0: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
5900: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
5910: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
5920: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
5930: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
5940: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
5950: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
5960: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
5970: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
5980: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
5990: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
59a0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
59b0: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
59c0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
59d0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
59e0: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
59f0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74   a OOM fault wit
5a00: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
5a10: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
5a20: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
5a30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5a40: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
5a50: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
5a60: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
5a70: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
5a80: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
5a90: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
5aa0: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
5ab0: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
5ac0: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
5ad0: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
5ae0: 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65  .**.** About the
5af0: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
5b00: 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d  MIT_TRACE:  Norm
5b10: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
5b20: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
5b30: 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e  ed.** unless p->
5b40: 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20  nOp>0.  This is 
5b50: 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61  because in the a
5b60: 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45  bsense of SQLITE
5b70: 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20  _OMIT_TRACE,.** 
5b80: 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74  an OP_Trace inst
5b90: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ruction is alway
5ba0: 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71  s inserted by sq
5bb0: 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61  lite3VdbeGet() a
5bc0: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e  s soon as.** a n
5bd0: 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74  ew VDBE is creat
5be0: 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66  ed.  So we are f
5bf0: 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20  ree to set addr 
5c00: 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68  to p->nOp-1 with
5c10: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5c20: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   double-check to
5c30: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5c40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
5c50: 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a  n-negative. But.
5c60: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** if SQLITE_OMI
5c70: 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e  T_TRACE is defin
5c80: 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65  ed, the OP_Trace
5c90: 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
5ca0: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a  we do need to.**
5cb0: 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   check the value
5cc0: 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66   of p->nOp-1 bef
5cd0: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a  ore continuing..
5ce0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
5cf0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
5d00: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
5d10: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
5d20: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
5d30: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
5d40: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
5d50: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
5d60: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
5d70: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
5d80: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
5d90: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
5da0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
5db0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
5dc0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
5dd0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
5de0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
5df0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
5e00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5e10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5e20: 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65 66  addr<0 ){.#ifdef
5e30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5e40: 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  CE.    if( p->nO
5e50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 56  p==0 ) return (V
5e60: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23  dbeOp*)&dummy;.#
5e70: 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20 3d  endif.    addr =
5e80: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
5e90: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
5ea0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
5eb0: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
5ec0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5ed0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
5ee0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
5ef0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
5f00: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
5f10: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
5f20: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
5f30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5f40: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5f50: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
5f60: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
5f70: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
5f80: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
5f90: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5fa0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
5fb0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
5fc0: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
5fd0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
5fe0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
5ff0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
6000: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
6010: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
6020: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
6030: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
6040: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
6050: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
6060: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
6070: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
6080: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
6090: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
60a0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
60b0: 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73  _STATIC:.    cas
60c0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
60d0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
60e0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
60f0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
6100: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
6110: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6120: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6130: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
6140: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
6150: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ;.      i = sqli
6160: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
6170: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
6180: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
6190: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
61a0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
61b0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
61c0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
61d0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
61e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
61f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6200: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
6210: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
6220: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
6230: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6240: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
6250: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,4);.           
6260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6270: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54    }.          zT
6280: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[i++] = ',';.
6290: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b            if( pK
62a0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
62b0: 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e  er && pKeyInfo->
62c0: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
62d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65  .            zTe
62e0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
62f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6300: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
6310: 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  mp[i], pColl->zN
6320: 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ame,n+1);.      
6330: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
6340: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
6350: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
6360: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
6370: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34  Temp[i],",nil",4
6380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6390: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
63a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
63b0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  mp[i++] = ')';. 
63c0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20       zTemp[i] = 
63d0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
63e0: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20   i<nTemp );.    
63f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6400: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
6410: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
6420: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
6430: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
6440: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6450: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6460: 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29   "collseq(%.20s)
6470: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
6480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6490: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
64a0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
64b0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
64c0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
64d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
64e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
64f0: 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20  Temp, "%s(%d)", 
6500: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
6510: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
6520: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6530: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
6540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6550: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6560: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a  zTemp, "%lld", *
6570: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20  pOp->p4.pI64);. 
6580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6590: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
65a0: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T32: {.      sql
65b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
65c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22  emp, zTemp, "%d"
65d0: 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20  , pOp->p4.i);.  
65e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
65f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
6600: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
6610: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6620: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
6630: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61  ", *pOp->p4.pRea
6640: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
6650: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6660: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
6670: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d  Mem *pMem = pOp-
6680: 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20  >p4.pMem;.      
6690: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
66a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
66b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
66c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
66d0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
66e0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
66f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6700: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6710: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
6720: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6730: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6740: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
6750: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
6760: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6770: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
6780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6790: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
67a0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
67b0: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d  Mem->r);.      }
67c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
67d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
67e0: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
67f0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28          zP4 = "(
6800: 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a  blob)";.      }.
6810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6820: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6830: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6840: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
6850: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
6860: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
6870: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
6880: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
6890: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
68a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
68b0: 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74  vtab:%p:%p", pVt
68c0: 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ab, pVtab->pModu
68d0: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
68e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
68f0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
6900: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
6910: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6920: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74  emp, zTemp, "int
6930: 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62  array");.      b
6940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6950: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
6960: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
6970: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6980: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67  mp, zTemp, "prog
6990: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
69a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
69b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
69c0: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
69d0: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
69e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
69f0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6a00: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6a10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6a20: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6a30: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6a40: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6a50: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6a60: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6a70: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6a80: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6a90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6aa0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6ab0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
6ac0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
6ad0: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
6ae0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6af0: 73 65 73 20 74 68 61 74 20 74 68 65 79 20 77 69  ses that they wi
6b00: 6c 6c 20 62 65 20 75 73 69 6e 67 2e 20 20 41 20  ll be using.  A 
6b10: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
6b20: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
6b30: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
6b40: 74 72 65 65 4d 61 73 6b 20 61 6e 64 20 69 73 20  treeMask and is 
6b50: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
6b60: 20 61 6e 64 20 6f 74 68 65 72 20 70 75 72 70 6f   and other purpo
6b70: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
6b80: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6b90: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
6ba0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
6bb0: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
6bc0: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
6bd0: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
6be0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
6bf0: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
6c00: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d  eMask)*8 );.  p-
6c10: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28  >btreeMask |= ((
6c20: 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 7d  yDbMask)1)<<i;.}
6c30: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6c40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
6c50: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
6c60: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
6c70: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
6c80: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
6c90: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
6ca0: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
6cb0: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
6cc0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
6cd0: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
6ce0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6cf0: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
6d00: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
6d10: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
6d20: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
6d30: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
6d40: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
6d50: 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68   also.** sets th
6d60: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65  e BtShared.db me
6d70: 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20  mber of each of 
6d80: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
6d90: 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e  uctures, ensurin
6da0: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  g.** that the co
6db0: 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c  rrect busy-handl
6dc0: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
6dd0: 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72  nvoked if requir
6de0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
6df0: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
6e00: 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73  dsafe but does s
6e10: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
6e20: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a  che mode, then.*
6e30: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
6e40: 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  ter() is invoked
6e50: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
6e60: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
6e70: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
6e80: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
6e90: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
6ea0: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
6eb0: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
6ec0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
6ed0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
6ee0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
6ef0: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
6f00: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
6f10: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
6f20: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
6f30: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
6f40: 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  he p->btreeMask 
6f50: 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61  field is a bitma
6f60: 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  sk of all btrees
6f70: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
6f80: 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ed .** statement
6f90: 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65   p will ever use
6fa0: 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20  .  Let N be the 
6fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
6fc0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a  n p->btreeMask.*
6fd0: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
6fe0: 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75  to btrees that u
6ff0: 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
7000: 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69    Then the runti
7010: 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f  me of.** this ro
7020: 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42  utine is N*N.  B
7030: 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c  ut as N is rarel
7040: 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74  y more than 1, t
7050: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a  his should not.*
7060: 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  * be a problem..
7070: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7080: 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70  dbeEnter(Vdbe *p
7090: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44  ){.  int i;.  yD
70a0: 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71  bMask mask;.  sq
70b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
70c0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 20 3d 20 64  b;.  Db *aDb = d
70d0: 62 2d 3e 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b->aDb;.  int nD
70e0: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
70f0: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  or(i=0, mask=1; 
7100: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b  i<nDb; i++, mask
7110: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69   += mask){.    i
7120: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b  f( i!=1 && (mask
7130: 20 26 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29   & p->btreeMask)
7140: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44  !=0 && ALWAYS(aD
7150: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
7160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7170: 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70  eeEnter(aDb[i].p
7180: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
7190: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
71a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
71b0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
71c0: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
71d0: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c  SAFE>0./*.** Unl
71e0: 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62  ock all of the b
71f0: 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79  trees previously
7200: 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c   locked by a cal
7210: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
7220: 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Enter()..*/.void
7230: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
7240: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
7250: 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d  t i;.  yDbMask m
7260: 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ask;.  sqlite3 *
7270: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 44 62  db = p->db;.  Db
7280: 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b   *aDb = db->aDb;
7290: 0a 20 20 69 6e 74 20 6e 44 62 20 3d 20 64 62 2d  .  int nDb = db-
72a0: 3e 6e 44 62 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  >nDb;..  for(i=0
72b0: 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b  , mask=1; i<nDb;
72c0: 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61   i++, mask += ma
72d0: 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  sk){.    if( i!=
72e0: 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e  1 && (mask & p->
72f0: 62 74 72 65 65 4d 61 73 6b 29 21 3d 30 20 26 26  btreeMask)!=0 &&
7300: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
7310: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
7320: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
7330: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
7340: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
7350: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
7360: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
7370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
7380: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
7390: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
73a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
73b0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
73c0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
73d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
73e0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
73f0: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
7400: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
7410: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
7420: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
7430: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
7440: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
7450: 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20  4d %4d %4d %-4s 
7460: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
7470: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
7480: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
7490: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
74a0: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
74b0: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
74c0: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
74d0: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
74e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
74f0: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
7500: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
7510: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
7520: 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  >p5,.#ifdef SQLI
7530: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70  TE_DEBUG.      p
7540: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70  Op->zComment ? p
7550: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22  Op->zComment : "
7560: 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22  ".#else.      ""
7570: 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66  .#endif.  );.  f
7580: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
7590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
75a0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
75b0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
75c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
75d0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
75e0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
75f0: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
7600: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20     Mem *pEnd;.  
7610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7620: 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61  p->db;.    u8 ma
7630: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62  lloc_failed = db
7640: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
7650: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
7660: 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20  tesFreed ){.    
7670: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
7680: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
7690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
76a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
76b0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lloc);.      }. 
76c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
76d0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d   }.    for(pEnd=
76e0: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
76f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
7700: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
7710: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
7720: 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f  ].db );..      /
7730: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
7740: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
7750: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
7760: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
7770: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
7780: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
7790: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
77a0: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
77b0: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
77c0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
77d0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
77e0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
77f0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
7800: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
7810: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
7820: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
7830: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
7840: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
7850: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
7860: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
7870: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
7880: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
7890: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
78a0: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
78b0: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
78c0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
78d0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
78e0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
78f0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
7900: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
7910: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
7920: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
7930: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
7940: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
7950: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
7960: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
7970: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
7980: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
7990: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
79a0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
79b0: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
79c0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
79d0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
79e0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
79f0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
7a00: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
7a10: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
7a20: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
7a30: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
7a40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7a50: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
7a60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7a70: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  p->zMalloc ){.  
7a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7a90: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
7aa0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
7ab0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
7ac0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
7ad0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
7ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d  .    }.    db->m
7af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
7b00: 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  lloc_failed;.  }
7b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
7b20: 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a   a VdbeFrame obj
7b30: 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  ect and its cont
7b40: 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20  ents. VdbeFrame 
7b50: 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61  objects are.** a
7b60: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
7b70: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
7b80: 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65  e in sqlite3Vdbe
7b90: 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Exec()..*/.void 
7ba0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
7bb0: 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65  Delete(VdbeFrame
7bc0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7bd0: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62   Mem *aMem = Vdb
7be0: 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20  eFrameMem(p);.  
7bf0: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43  VdbeCursor **apC
7c00: 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
7c10: 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68   **)&aMem[p->nCh
7c20: 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69  ildMem];.  for(i
7c30: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
7c40: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
7c50: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
7c60: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
7c70: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
7c80: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
7c90: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
7ca0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7cb0: 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a  p->v->db, p);.}.
7cc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7cd0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
7ce0: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
7cf0: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
7d00: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
7d10: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
7d20: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
7d30: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
7d40: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
7d50: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
7d60: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
7d70: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
7d80: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
7d90: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
7da0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
7db0: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
7dc0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
7dd0: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
7de0: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
7df0: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
7e00: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
7e10: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
7e20: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
7e30: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
7e40: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
7e50: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
7e60: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
7e70: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
7e80: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
7e90: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
7ea0: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
7eb0: 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  PLAN..**.** When
7ec0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
7ed0: 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70  first the main p
7ee0: 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64  rogram is listed
7ef0: 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a  , then each of.*
7f00: 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75  * the trigger su
7f10: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69  bprograms are li
7f20: 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  sted one by one.
7f30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
7f40: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
7f50: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
7f60: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
7f70: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f   */.){.  int nRo
7f80: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fa0: 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63   Stop when row c
7fb0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69  ount reaches thi
7fc0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20  s */.  int nSub 
7fd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7ff0: 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62  umber of sub-vdb
8000: 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  es seen so far *
8010: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
8020: 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20  *apSub = 0;     
8030: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
8040: 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a  y of sub-vdbes *
8050: 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20  /.  Mem *pSub = 
8060: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
8080: 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72  ry cell hold arr
8090: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a  ay of subprogs *
80a0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
80b0: 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  = p->db;        
80c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
80d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
80e0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ion */.  int i; 
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8110: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8120: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8130: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
8140: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8150: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20  n code */.  Mem 
8160: 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75  *pMem = p->pResu
8170: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
8180: 5b 31 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 4d  [1];  /* First M
8190: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
81a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
81b0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
81c0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
81d0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
81e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
81f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
8200: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
8210: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
8220: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
8230: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
8240: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
8250: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
8260: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
8270: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
8280: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
8290: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
82a0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
82b0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
82c0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
82d0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
82e0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
82f0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
8300: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
8310: 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20 69 66  (pMem, 8);..  if
8320: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8330: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
8340: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
8350: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
8360: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
8370: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
8380: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
8390: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
83a0: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
83b0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
83c0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
83d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
83e0: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  R;.  }..  /* Whe
83f0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8400: 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63  output rows reac
8410: 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d  hes nRow, that m
8420: 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69  eans the.  ** li
8430: 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68  sting has finish
8440: 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73  ed and sqlite3_s
8450: 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74  tep() should ret
8460: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8470: 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68  .  ** nRow is th
8480: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
8490: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
84a0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c  he main program,
84b0: 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73   plus.  ** the s
84c0: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
84d0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20   of rows in all 
84e0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
84f0: 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a  ams encountered.
8500: 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68    ** so far.  Th
8510: 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c  e nRow value wil
8520: 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65  l increase as ne
8530: 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  w trigger subpro
8540: 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65  grams are.  ** e
8550: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20  ncountered, but 
8560: 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74  p->pc will event
8570: 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74  ually catch up t
8580: 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e  o nRow..  */.  n
8590: 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  Row = p->nOp;.  
85a0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
85b0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
85c0: 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63  first 8 memory c
85d0: 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f  ells are used fo
85e0: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
85f0: 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20  .  So we will.  
8600: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20    ** commandeer 
8610: 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20  the 9th cell to 
8620: 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66  use as storage f
8630: 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  or an array of p
8640: 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74  ointers.    ** t
8650: 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  o trigger subpro
8660: 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45  grams.  The VDBE
8670: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
8680: 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  o have at least 
8690: 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20  9.    ** cells. 
86a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
86b0: 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20  p->nMem>9 );.   
86c0: 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d   pSub = &p->aMem
86d0: 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75  [9];.    if( pSu
86e0: 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  b->flags&MEM_Blo
86f0: 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  b ){.      /* On
8700: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
8710: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
8720: 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c  ), pSub will hol
8730: 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73  d a NULL.  It is
8740: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
8750: 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20  lized to a BLOB 
8760: 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f  by the P4_SUBPRO
8770: 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20  GRAM processing 
8780: 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20  logic below */. 
8790: 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62       nSub = pSub
87a0: 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a  ->n/sizeof(Vdbe*
87b0: 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d  );.      apSub =
87c0: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
87d0: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20  pSub->z;.    }. 
87e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
87f0: 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; i++){.      
8800: 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d  nRow += apSub[i]
8810: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nOp;.    }.  }
8820: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20  ..  do{.    i = 
8830: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c  p->pc++;.  }whil
8840: 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e  e( i<nRow && p->
8850: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
8860: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
8870: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
8880: 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20  if( i>=nRow ){. 
8890: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
88a0: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
88b0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
88c0: 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69  lse if( db->u1.i
88d0: 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a  sInterrupted ){.
88e0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
88f0: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
8900: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
8910: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
8920: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
8930: 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c  rrMsg, db, "%s",
8940: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
8950: 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ->rc));.  }else{
8960: 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
8970: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
8980: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
8990: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
89a0: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
89b0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
89c0: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
89d0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
89e0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
89f0: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
8a00: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
8a10: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
8a20: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
8a30: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
8a40: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
8a50: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
8a60: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
8a70: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
8a80: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
8a90: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
8aa0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
8ab0: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
8ac0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
8ad0: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
8ae0: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
8af0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
8b00: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
8b10: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
8b20: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
8b30: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
8b40: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
8b50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8b60: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
8b70: 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  R;.      pMem->u
8b80: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
8bb0: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
8bc0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
8bd0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8be0: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
8bf0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
8c00: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
8c10: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
8c20: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
8c30: 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65  ode);  /* Opcode
8c40: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
8c50: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
8c60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
8c70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8c80: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
8c90: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8ca0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
8cb0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
8cc0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
8cd0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  Mem++;..      /*
8ce0: 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67   When an OP_Prog
8cf0: 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  ram opcode is en
8d00: 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c  counter (the onl
8d10: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61  y opcode that ha
8d20: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f  s.      ** a P4_
8d30: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
8d40: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
8d50: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
8d60: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
8d70: 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20  s.      ** kept 
8d80: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
8d90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
8da0: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
8db0: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
8dc0: 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  am.      ** has 
8dd0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
8de0: 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a   seen..      */.
8df0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
8e00: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
8e10: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  GRAM ){.        
8e20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
8e30: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
8e40: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
8e50: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
8e60: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62   for(j=0; j<nSub
8e70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8e80: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
8e90: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
8ea0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
8ec0: 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54  j==nSub && SQLIT
8ed0: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
8ee0: 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e  eMemGrow(pSub, n
8ef0: 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  Byte, 1) ){.    
8f00: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
8f10: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
8f20: 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  b->z;.          
8f30: 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20  apSub[nSub++] = 
8f40: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
8f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
8f60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42  ->flags |= MEM_B
8f70: 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  lob;.          p
8f80: 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69  Sub->n = nSub*si
8f90: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
8fa0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8fb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8fc0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8fd0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
8fe0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
9010: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
9020: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
9030: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
9040: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9050: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
9060: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
9070: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9090: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
90a0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
90b0: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
90c0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
90d0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
90e0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
90f0: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
9120: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
9130: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
9140: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
9150: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
9160: 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20  ow(pMem, 32, 0) 
9170: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ){            /*
9180: 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   P4 */.      ass
9190: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
91a0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
91b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
91d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
91e0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
91f0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d  EM_Term;.    z =
9200: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
9210: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
9220: 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a    if( z!=pMem->z
9230: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9240: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
9250: 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Mem, z, -1, SQLI
9260: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
9270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
9280: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
9290: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
92a0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
92b0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
92c0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
92d0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
92e0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70   }.    pMem->typ
92f0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
9300: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
9310: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
9320: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
9330: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
9340: 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20  row(pMem, 4, 0) 
9350: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9360: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
9370: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
9380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9390: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
93a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
93b0: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
93c0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
93d0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
93e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
93f0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
9400: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
9410: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
9420: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
9430: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
9440: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
9450: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
9460: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
9470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9480: 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f  BUG.      if( pO
9490: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
94a0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
94b0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
94c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  _Term;.        p
94d0: 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43  Mem->z = pOp->zC
94e0: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  omment;.        
94f0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
9500: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
9510: 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  z);.        pMem
9520: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
9530: 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  TF8;.        pMe
9540: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
9550: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _TEXT;.      }el
9560: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
9570: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
9580: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
9590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
95a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
95b0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  nt */.        pM
95c0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
95d0: 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_NULL;.      }.
95e0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
95f0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34  esColumn = 8 - 4
9600: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
9610: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
9620: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
9630: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
9640: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9650: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9660: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
9670: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9680: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
9690: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
96a0: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
96b0: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
96c0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
96d0: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
96e0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
96f0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
9700: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
9710: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
9720: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
9730: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
9740: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
9750: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
9760: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
9770: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
9780: 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  4.z;.    while( 
9790: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
97a0: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72  z) ) z++;.    pr
97b0: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
97c0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
97d0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
97e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
97f0: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
9800: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
9810: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
9820: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
9830: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
9840: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
9850: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
9860: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
9870: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
9880: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
9890: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
98a0: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
98b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
98c0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
98d0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
98e0: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
98f0: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
9900: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
9910: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
9920: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
9930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
9940: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
9950: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
9960: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
9970: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
9980: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
9990: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
99a0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
99b0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
99c0: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
99d0: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
99e0: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
99f0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
9a00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9a10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
9a20: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
9a30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
9a40: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
9a50: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
9a60: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
9a70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
9a80: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
9a90: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
9aa0: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
9ab0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
9ac0: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
9ad0: 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65  ze buffer and re
9ae0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
9af0: 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e  o.** that space.
9b00: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
9b10: 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  t space is avail
9b20: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  able, return NUL
9b30: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75  L..**.** The pBu
9b40: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  f parameter is t
9b50: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
9b60: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68   of a pointer wh
9b70: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65  ich will.** rece
9b80: 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f  ive the new memo
9b90: 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72  ry.  pBuf is nor
9ba0: 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20  mally NULL.  If 
9bb0: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
9bc0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
9bd0: 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  at memory space 
9be0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
9bf0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
9c00: 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hat.** this rout
9c10: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61  ine should not a
9c20: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20  llocate any new 
9c30: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42  memory.  When pB
9c40: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
9c50: 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  L simply return 
9c60: 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f  pBuf.  Only allo
9c70: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
9c80: 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a  space when pBuf.
9c90: 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
9ca0: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
9cb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9cc0: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
9cd0: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
9ce0: 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c  ints to availabl
9cf0: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
9d00: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
9d10: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
9d20: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57  ilable space.  W
9d30: 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c  hen space is all
9d40: 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20  ocated, *ppFrom 
9d50: 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74  is advanced past
9d60: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
9d70: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
9d80: 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74  ce..**.** *pnByt
9d90: 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  e is a counter o
9da0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
9db0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
9dc0: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
9dd0: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
9de0: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
9df0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
9e00: 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61  in *ppFrom to sa
9e10: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71  tisfy the.** req
9e20: 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65  uest, then incre
9e30: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20  ment *pnByte by 
9e40: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
9e50: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
9e60: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
9e70: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
9e80: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
9e90: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
9ea0: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
9eb0: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
9ec0: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
9ed0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9ee0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
9ef0: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
9f00: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
9f10: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
9f20: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
9f30: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
9f40: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9f50: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
9f60: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
9f70: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
9f80: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
9f90: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
9fa0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
9fb0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
9fc0: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
9fd0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
9fe0: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
9ff0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  ) );.  if( pBuf 
a000: 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20  ) return pBuf;. 
a010: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
a020: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28  nByte);.  if( &(
a030: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
a040: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70  <= pEnd ){.    p
a050: 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70  Buf = (void*)*pp
a060: 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f  From;.    *ppFro
a070: 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65  m += nByte;.  }e
a080: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65  lse{.    *pnByte
a090: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20   += nByte;.  }. 
a0a0: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
a0b0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
a0c0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a0d0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20   for execution. 
a0e0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
a0f0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
a100: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
a110: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
a120: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
a130: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
a140: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
a150: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
a160: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
a170: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
a180: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
a190: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
a1a0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73    .**.** This is
a1b0: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
a1c0: 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f   move a VDBE fro
a1d0: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  m VDBE_MAGIC_INI
a1e0: 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  T to.** VDBE_MAG
a1f0: 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  IC_RUN..**.** Th
a200: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
a210: 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65 20 74  be called more t
a220: 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20 73 69  han once on a si
a230: 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d 61 63  ngle virtual mac
a240: 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72  hine..** The fir
a250: 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 20  st call is made 
a260: 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20  while compiling 
a270: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
a280: 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a 2a 2a  t. Subsequent.**
a290: 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 20   calls are made 
a2a0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  as part of the p
a2b0: 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65 74 74  rocess of resett
a2c0: 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ing a statement 
a2d0: 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78 65 63  to be.** re-exec
a2e0: 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63 61 6c  uted (from a cal
a2f0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73  l to sqlite3_res
a300: 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61 72 2c  et()). The nVar,
a310: 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 0a   nMem, nCursor .
a320: 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e  ** and isExplain
a330: 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
a340: 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f 72 72  only passed corr
a350: 65 63 74 20 76 61 6c 75 65 73 20 74 68 65 20 66  ect values the f
a360: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 65  irst time.** the
a370: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
a380: 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71 75 65  led. On subseque
a390: 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d 20 73  nt calls, from s
a3a0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c 20  qlite3_reset(), 
a3b0: 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73 73 65  nVar.** is passe
a3c0: 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e  d -1 and nMem, n
a3d0: 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45 78 70  Cursor and isExp
a3e0: 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70 61 73  lain are all pas
a3f0: 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69  sed zero..*/.voi
a400: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
a410: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
a420: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a430: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a440: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  VDBE */.  int nV
a450: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
a460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a470: 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e  er of '?' see in
a480: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
a490: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  nt */.  int nMem
a4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a4b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a4c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
a4d0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
a4e0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20    int nCursor,  
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
a510: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  rsors to allocat
a520: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
a550: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   number of args 
a560: 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73 20 2a  in SubPrograms *
a570: 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69  /.  int isExplai
a580: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
a590: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
a5a0: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
a5b0: 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ds is present */
a5c0: 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d 74 4a  .  int usesStmtJ
a5d0: 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20  ournal          
a5e0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
a5f0: 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f   Vdbe.usesStmtJo
a600: 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e  urnal */.){.  in
a610: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
a620: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61  db = p->db;..  a
a630: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
a640: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
a650: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
a660: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
a670: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
a680: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
a690: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
a6a0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
a6b0: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
a6c0: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
a6d0: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
a6e0: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
a6f0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
a700: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f  _MAGIC_RUN;..  /
a710: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
a720: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
a730: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
a740: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
a750: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
a760: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
a770: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
a780: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
a790: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
a7a0: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
a7b0: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
a7c0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
a7d0: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ce for.  ** Vdbe
a7e0: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
a7f0: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
a800: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
a810: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
a820: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
a830: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
a840: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
a850: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
a860: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
a870: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
a880: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a890: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
a8a0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
a8b0: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
a8c0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
a8d0: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
a8e0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
a8f0: 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65  ce for memory re
a900: 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72  gisters, SQL var
a910: 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72  iables, VDBE cur
a920: 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61  sors and .  ** a
a930: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68  n array to marsh
a940: 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  al SQL function 
a950: 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20 54 68  arguments in. Th
a960: 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20  is is only done 
a970: 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
a980: 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ime this functio
a990: 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  n is called for 
a9a0: 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20 6e 6f  a given VDBE, no
a9b0: 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 2a  t when it is.  *
a9c0: 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  * being called f
a9d0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  rom sqlite3_rese
a9e0: 74 28 29 20 74 6f 20 72 65 73 65 74 20 74 68 65  t() to reset the
a9f0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
aa00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56 61  ..  */.  if( nVa
aa10: 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 64  r>=0 && ALWAYS(d
aa20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
aa30: 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  =0) ){.    u8 *z
aa40: 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e  Csr = (u8 *)&p->
aa50: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
aa60: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
aa70: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 61  liable for alloa
aa80: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 75 38 20 2a  tion */.    u8 *
aa90: 7a 45 6e 64 20 3d 20 28 75 38 20 2a 29 26 70 2d  zEnd = (u8 *)&p-
aaa0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  >aOp[p->nOpAlloc
aab0: 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  ];  /* First byt
aac0: 65 20 70 61 73 74 20 61 76 61 69 6c 61 62 6c 65  e past available
aad0: 20 6d 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20   mem */.    int 
aae0: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
ab10: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 6e 65 65  extra memory nee
ab20: 64 65 64 20 2a 2f 0a 0a 20 20 20 20 72 65 73 6f  ded */..    reso
ab30: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
ab40: 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e 75 73  nArg);.    p->us
ab50: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20  esStmtJournal = 
ab60: 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f 75 72  (u8)usesStmtJour
ab70: 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69 73 45  nal;.    if( isE
ab80: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
ab90: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 6d 20  0 ){.      nMem 
aba0: 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = 10;.    }.    
abb0: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
abc0: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 20 20  zEnd-zCsr);.    
abd0: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
abe0: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20 20 61  (u8*)0)&7;.    a
abf0: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
ac00: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
ac10: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 65 6d  ) );..    /* Mem
ac20: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
ac30: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
ac40: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
ac50: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a  llocated in two.
ac60: 20 20 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20      ** passes.  
ac70: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
ac80: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
ac90: 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  se unused space 
aca0: 61 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 65  at the .    ** e
acb0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
acc0: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
acd0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
ace0: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
acf0: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65      ** requireme
ad00: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
ad10: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
ad20: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
ad30: 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 61 73  econd.    ** pas
ad40: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
ad50: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
ad60: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
ad70: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
ad80: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
ad90: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
ada0: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
adb0: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
adc0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
add0: 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61  leftover space a
ade0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
adf0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61   opcode array ca
ae00: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
ae10: 20 20 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68      ** reduce th
ae20: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
ae30: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
ae40: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
ae50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
ae60: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 30  .      nByte = 0
ae70: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20  ;.      p->aMem 
ae80: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
ae90: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
aea0: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
aeb0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
aec0: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
aed0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72  locSpace(p->aVar
aee0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
aef0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
af00: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
af10: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
af20: 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20  Space(p->apArg, 
af30: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
af40: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
af50: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70  &nByte);.      p
af60: 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53  ->azVar = allocS
af70: 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e  pace(p->azVar, n
af80: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
af90: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
afa0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70  &nByte);.      p
afb0: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
afc0: 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e  pace(p->apCsr, n
afd0: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
afe0: 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20  beCursor*),.    
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a          &zCsr, z
b010: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b020: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
b030: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 46 72 65  .        p->pFre
b040: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
b050: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
b060: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
b070: 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65    zCsr = p->pFre
b080: 65 3b 0a 20 20 20 20 20 20 7a 45 6e 64 20 3d 20  e;.      zEnd = 
b090: 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20  &zCsr[nByte];.  
b0a0: 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20    }while( nByte 
b0b0: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
b0c0: 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 70 2d 3e  iled );..    p->
b0d0: 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e  nCursor = (u16)n
b0e0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
b0f0: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20  p->aVar ){.     
b100: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
b110: 72 29 6e 56 61 72 3b 0a 20 20 20 20 20 20 66 6f  r)nVar;.      fo
b120: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
b130: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ++){.        p->
b140: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
b150: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
b160: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
b170: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = db;.      }.  
b180: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 61    }.    if( p->a
b190: 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Mem ){.      p->
b1a0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b1c0: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
b1d0: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
b1e0: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
b1f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b200: 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66    /*       not f
b210: 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f  rom 0..nMem-1 */
b220: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  .      for(n=1; 
b230: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
b240: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
b250: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
b260: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ll;.        p->a
b270: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
b280: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b290: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
b2a0: 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b  DEBUG.  for(n=1;
b2b0: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
b2c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
b2d0: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20  >aMem[n].db==db 
b2e0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
b2f0: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
b300: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
b310: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
b320: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
b330: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69   p->explain |= i
b340: 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d  sExplain;.  p->m
b350: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
b360: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
b370: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
b380: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
b390: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
b3a0: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
b3b0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
b3c0: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
b3d0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
b3e0: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
b3f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
b400: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
b410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
b420: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
b430: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
b440: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20  .cycles = 0;.   
b450: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
b460: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
b470: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
b480: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
b490: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
b4a0: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
b4b0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
b4c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
b4d0: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
b4e0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
b4f0: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
b500: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
b510: 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42   }.  if( pCx->pB
b520: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
b530: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
b540: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
b550: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
b560: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
b570: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
b580: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
b590: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
b5a0: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
b5b0: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
b5c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
b5d0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
b5e0: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
b5f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b600: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
b610: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
b620: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
b630: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
b640: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
b650: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
b660: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
b670: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
b680: 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d  Module = pCx->pM
b690: 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e  odule;.    p->in
b6a0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a  VtabMethod = 1;.
b6b0: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
b6c0: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29  ose(pVtabCursor)
b6d0: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
b6e0: 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ethod = 0;.  }.#
b6f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
b700: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
b710: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
b720: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
b730: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
b740: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
b750: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
b760: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
b770: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
b780: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
b790: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
b7a0: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
b7b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
b7c0: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
b7d0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
b7e0: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
b7f0: 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d  e->v;.  v->aOp =
b800: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
b810: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
b820: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
b830: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
b840: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
b850: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
b860: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
b870: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
b880: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
b890: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
b8a0: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
b8b0: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
b8c0: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
b8d0: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
b8e0: 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
b8f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
b900: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
b910: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
b920: 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
b930: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
b940: 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
b950: 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
b960: 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
b970: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
b980: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
b990: 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
b9a0: 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
b9b0: 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
b9c0: 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
b9d0: 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
b9e0: 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
b9f0: 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
ba00: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
ba10: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
ba20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
ba30: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
ba40: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
ba50: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
ba60: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
ba70: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
ba80: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
ba90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
baa0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
bab0: 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d  Frame);.  }.  p-
bac0: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70  >pFrame = 0;.  p
bad0: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20  ->nFrame = 0;.. 
bae0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
baf0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
bb00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
bb10: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
bb20: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
bb30: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
bb40: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
bb50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bb60: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
bb70: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
bb80: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
bb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bba0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
bbb0: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
bbc0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
bbd0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
bbe0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
bbf0: 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
bc00: 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
bc10: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
bc20: 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
bc30: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
bc40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bc50: 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
bc60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
bc70: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
bc80: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
bc90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bca0: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
bcb0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
bcc0: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
bcd0: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
bce0: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
bcf0: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
bd00: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
bd10: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
bd20: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
bd30: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
bd40: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
bd50: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
bd60: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
bd70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bd80: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
bd90: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
bda0: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
bdb0: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
bdc0: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
bdd0: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
bde0: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
bdf0: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
be00: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
be10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
be20: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
be30: 65 72 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30  ert( p->apCsr==0
be40: 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d   || p->apCsr[i]=
be50: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  =0 );.  for(i=1;
be60: 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b   i<=p->nMem; i++
be70: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
be80: 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d 5b  m==0 || p->aMem[
be90: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75  i].flags==MEM_Nu
bea0: 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ll );.#endif..  
beb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bec0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
bed0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
bee0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
bef0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
bf00: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
bf10: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
bf20: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
bf30: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
bf40: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
bf50: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
bf60: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
bf70: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
bf80: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
bf90: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
bfa0: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
bfb0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
bfc0: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
bfd0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
bfe0: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
bff0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
c000: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
c010: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
c020: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
c030: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
c040: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
c050: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c060: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
c070: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
c080: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
c090: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c0a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
c0b0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
c0c0: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
c0d0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
c0e0: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
c0f0: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
c100: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
c110: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
c120: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
c130: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
c140: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
c150: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
c160: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
c170: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
c180: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
c190: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
c1a0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
c1b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
c1c0: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
c1d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c1e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
c1f0: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
c200: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
c210: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
c220: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
c230: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
c240: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
c250: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
c260: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
c270: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
c280: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
c290: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
c2a0: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
c2b0: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
c2c0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
c2d0: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
c2e0: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
c2f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
c300: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
c310: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
c320: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
c330: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
c340: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
c350: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
c360: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
c370: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
c380: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c390: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
c3a0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
c3d0: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
c3e0: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c400: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
c410: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
c420: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
c450: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
c460: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
c470: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
c480: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c490: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
c4a0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
c4b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
c4c0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
c4e0: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
c4f0: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
c500: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
c510: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
c520: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
c530: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
c540: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
c550: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
c560: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
c570: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c580: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
c590: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
c5a0: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
c5b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c5c0: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
c5d0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
c5e0: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
c5f0: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
c600: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
c610: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
c620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
c630: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
c640: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
c650: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
c660: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
c670: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
c680: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
c690: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
c6a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c6b0: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
c6c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
c6d0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
c6e0: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
c6f0: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
c700: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c710: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
c720: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
c730: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
c740: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
c750: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
c760: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
c770: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
c780: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
c790: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7a0: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
c7b0: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
c7c0: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
c7d0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
c7e0: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
c7f0: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
c800: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
c810: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
c820: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
c830: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c840: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
c850: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
c860: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
c870: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
c880: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
c890: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
c8a0: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
c8b0: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
c8c0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
c8d0: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
c8e0: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
c8f0: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
c900: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
c910: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
c920: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
c930: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
c940: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
c950: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
c960: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
c970: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
c980: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
c990: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
c9a0: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
c9b0: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
c9c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
c9d0: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
c9e0: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
c9f0: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
ca00: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
ca10: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
ca20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
ca30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
ca40: 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e  tabSync(db, &p->
ca50: 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20  zErrMsg);..  /* 
ca60: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
ca70: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
ca80: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
ca90: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
caa0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
cab0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
cac0: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
cad0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
cae0: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
caf0: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
cb00: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
cb10: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
cb20: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
cb30: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
cb40: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
cb50: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
cb60: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
cb70: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
cb80: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
cb90: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
cba0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
cbb0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
cbc0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
cbd0: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
cbe0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
cbf0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
cc00: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
cc10: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
cc20: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
cc30: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
cc40: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
cc50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cc60: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
cc70: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
cc80: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
cc90: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
cca0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ccb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
ccc0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
ccd0: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
cce0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
ccf0: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
cd00: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
cd10: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
cd20: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
cd30: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
cd40: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
cd50: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
cd60: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
cd70: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
cd80: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
cd90: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
cda0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
cdb0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
cdc0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
cdd0: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
cde0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
cdf0: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
ce00: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
ce10: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
ce20: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
ce30: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
ce40: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
ce50: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
ce60: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
ce70: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
ce80: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
ce90: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
cea0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
ceb0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
cec0: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
ced0: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
cee0: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
cef0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
cf00: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
cf10: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
cf20: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
cf30: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
cf40: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
cf50: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
cf60: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
cf70: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
cf80: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
cf90: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
cfa0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
cfb0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
cfc0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
cfd0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
cfe0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
cff0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d000: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d010: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d020: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
d030: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d040: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
d050: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
d060: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
d070: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
d080: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
d090: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
d0a0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d0b0: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
d0c0: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
d0d0: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
d0e0: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
d0f0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
d100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d110: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
d120: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
d130: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
d140: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
d150: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d160: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
d170: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
d180: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d190: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d1a0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d1b0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d1c0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d1d0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d1e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d1f0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
d200: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d220: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
d240: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
d250: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
d260: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
d270: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
d280: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
d290: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
d2a0: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
d2b0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
d2c0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
d2d0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
d2e0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
d2f0: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
d300: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
d310: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
d320: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
d330: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
d340: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
d350: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
d360: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
d370: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
d380: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
d390: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
d3a0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
d3b0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
d3c0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
d3d0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
d3e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
d3f0: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
d400: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
d410: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
d420: 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  es;..    /* Sele
d430: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
d440: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
d450: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
d460: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
d470: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d480: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
d4a0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
d4b0: 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
d4c0: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
d4d0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
d4e0: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38  tf(db, "%s-mj%08
d4f0: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69  X", zMainFile, i
d500: 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66  Random&0x7ffffff
d510: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  f);.      if( !z
d520: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
d530: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d540: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
d550: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d560: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
d570: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
d580: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
d590: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
d5a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d5b0: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
d5c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d5d0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
d5e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d5f0: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
d600: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
d610: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
d620: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
d630: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
d640: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
d650: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
d660: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
d670: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
d680: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
d690: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
d6a0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
d6b0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
d6c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d6d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d6e0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
d6f0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d700: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
d710: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
d720: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
d730: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
d740: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
d750: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
d760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
d770: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d780: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
d790: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
d7a0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
d7b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
d7c0: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
d7d0: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
d7e0: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
d7f0: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
d800: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d810: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
d820: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
d830: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
d840: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
d850: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
d860: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d870: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
d880: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
d890: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d8a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
d8b0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
d8c0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
d8d0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
d8e0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
d8f0: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
d900: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
d910: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
d920: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
d930: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
d940: 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
d950: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
d960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
d970: 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
d980: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
d990: 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21  ( !needSync && !
d9a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
d9b0: 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b  Disabled(pBt) ){
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
d9d0: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
d9e0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
d9f0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
da00: 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
da10: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
da20: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
da30: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
da40: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
da50: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
da60: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
da70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
da80: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
da90: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
daa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dab0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
dac0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
dad0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dae0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
daf0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
db00: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
db10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
db20: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
db30: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
db40: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
db50: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
db60: 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
db70: 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
db80: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
db90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
dba0: 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
dbb0: 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
dbc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
dbd0: 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
dbe0: 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
dbf0: 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
dc00: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
dc10: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
dc20: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
dc30: 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
dc40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
dc50: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
dc60: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
dc70: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
dc80: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
dc90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
dca0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
dcb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dcc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
dcd0: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
dce0: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
dcf0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dd00: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
dd10: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
dd20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
dd30: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
dd40: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
dd50: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
dd60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
dd70: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
dd80: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dd90: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
dda0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
ddb0: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
ddc0: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
ddd0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
dde0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
ddf0: 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
de00: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
de10: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
de20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
de30: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
de40: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
de50: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
de60: 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
de70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
de80: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
de90: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
dea0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
deb0: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
dec0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
ded0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
dee0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
def0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
df00: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
df10: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
df20: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
df30: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
df40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df50: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
df60: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
df70: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
df80: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
df90: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
dfa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
dfb0: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
dfc0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
dfd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dfe0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dff0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e000: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e010: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
e020: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
e030: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
e040: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
e050: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
e060: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
e070: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
e080: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
e090: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
e0a0: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
e0b0: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
e0c0: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
e0d0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
e0e0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
e0f0: 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
e100: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e110: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
e120: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
e130: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
e140: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e150: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
e160: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
e170: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
e180: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
e190: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
e1a0: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
e1b0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
e1c0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
e1d0: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
e1e0: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
e1f0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
e200: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
e210: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
e220: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
e230: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
e240: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
e250: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
e260: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
e270: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
e280: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
e290: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
e2a0: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
e2b0: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
e2c0: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
e2d0: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
e2e0: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
e2f0: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
e300: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
e310: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
e320: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
e330: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
e340: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
e350: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
e360: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
e370: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e380: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e390: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
e3a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e3b0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
e3c0: 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20  eTwo(pBt, 1);.  
e3d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e3e0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
e3f0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
e400: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
e410: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
e420: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
e430: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
e440: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
e450: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
e460: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
e470: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
e480: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
e490: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
e4a0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
e4b0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
e4c0: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
e4d0: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
e4e0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
e4f0: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
e500: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
e510: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
e520: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
e530: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
e540: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
e550: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
e560: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
e570: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
e580: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
e590: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
e5a0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
e5b0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
e5c0: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
e5d0: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
e5e0: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
e5f0: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
e600: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
e610: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
e620: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
e630: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
e640: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
e650: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
e660: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
e670: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
e680: 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
e690: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
e6a0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
e6b0: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
e6c0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
e6d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
e6e0: 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56  rite==db->writeV
e6f0: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
e700: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
e710: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
e720: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
e730: 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68  r every Btree th
e740: 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  at in database c
e750: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69  onnection db whi
e760: 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ch .** has been 
e770: 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22  modified, "trip"
e780: 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65   or invalidate e
e790: 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a  ach cursor in.**
e7a0: 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68   that Btree migh
e7b0: 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  t have been modi
e7c0: 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  fied so that the
e7d0: 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e   cursor.** can n
e7e0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61  ever be used aga
e7f0: 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  in.  This happen
e800: 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  s when a rollbac
e810: 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57  k.*** occurs.  W
e820: 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61  e have to trip a
e830: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72  ll the other cur
e840: 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75  sors, even.** cu
e850: 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20  rsor from other 
e860: 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  VMs in different
e870: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e880: 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61  tions,.** so tha
e890: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74  t none of them t
e8a0: 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61  ry to use the da
e8b0: 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79  ta at which they
e8c0: 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e  .** were pointin
e8d0: 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20  g and which now 
e8e0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68  may have been ch
e8f0: 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20  anged due.** to 
e900: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
e910: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
e920: 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e  t a rollback can
e930: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63   delete tables c
e940: 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72  omplete and.** r
e950: 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73  eorder rootpages
e960: 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20  .  So it is not 
e970: 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20  sufficient just 
e980: 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73  to save.** the s
e990: 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
e9a0: 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  or.  We have to 
e9b0: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
e9c0: 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74  ursor.** so that
e9d0: 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65   it is never use
e9e0: 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  d again..*/.stat
e9f0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
ea00: 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
ea10: 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65  iedBtrees(sqlite
ea20: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
ea30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
ea40: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
ea50: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
ea60: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
ea70: 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33  if( p && sqlite3
ea80: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
ea90: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
eaa0: 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
eab0: 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f  rsors(p, SQLITE_
eac0: 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20  ABORT);.    }.  
ead0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
eae0: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
eaf0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
eb00: 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
eb10: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
eb20: 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
eb30: 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
eb40: 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
eb50: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
eb60: 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
eb70: 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
eb80: 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
eb90: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
eba0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
ebb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
ebc0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
ebd0: 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
ebe0: 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
ebf0: 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
ec00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
ec10: 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ommtted..**.** I
ec20: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
ec30: 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
ec40: 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
ec50: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
ec60: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
ec70: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
ec80: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
ec90: 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
eca0: 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
ecb0: 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
ecc0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
ecd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ece0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
ecf0: 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
ed00: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
ed10: 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
ed20: 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
ed30: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ed40: 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
ed50: 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
ed60: 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
ed70: 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
ed80: 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
ed90: 61 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75  ave occured, cau
eda0: 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
edb0: 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
edc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
edd0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
ede0: 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
edf0: 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
ee00: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
ee10: 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
ee20: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
ee30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
ee40: 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
ee50: 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
ee60: 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
ee70: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
ee80: 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
ee90: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
eea0: 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
eeb0: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
eec0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
eed0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
eee0: 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
eef0: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
ef00: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
ef10: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ef20: 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
ef30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ef40: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ef50: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ef60: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ef70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
ef80: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
ef90: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
efa0: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
efb0: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
efc0: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
efd0: 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
efe0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
eff0: 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
f000: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f010: 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
f020: 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
f030: 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
f040: 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
f050: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
f060: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
f070: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f080: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
f090: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
f0a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
f0b0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
f0c0: 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
f0d0: 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nt = 0;..    /* 
f0e0: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
f0f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f100: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
f110: 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
f120: 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
f130: 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
f140: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
f150: 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
f160: 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
f170: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  n .    ** the st
f180: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f190: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
f1a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   */.    if( eOp=
f1b0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
f1c0: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ACK ){.      db-
f1d0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
f1e0: 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
f1f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f200: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f210: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f220: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
f230: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
f240: 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
f250: 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
f260: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
f270: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
f280: 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
f290: 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
f2a0: 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
f2b0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
f2c0: 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
f2d0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
f2e0: 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
f2f0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f300: 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
f310: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
f320: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
f330: 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
f340: 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
f350: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
f360: 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
f370: 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
f380: 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
f390: 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
f3a0: 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a  INT and write.**
f3b0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
f3c0: 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
f3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f3e0: 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
f3f0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f400: 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
f410: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
f420: 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
f430: 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
f440: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
f450: 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 64  ( (deferred && d
f460: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
f470: 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65  >0) || (!deferre
f480: 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
f490: 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20  raint>0) ){.    
f4a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
f4b0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70  ONSTRAINT;.    p
f4c0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
f4d0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
f4e0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
f4f0: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
f500: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  "foreign key con
f510: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
f520: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
f530: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
f540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f550: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
f560: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f570: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
f580: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
f590: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
f5a0: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
f5b0: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
f5c0: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
f5d0: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
f5e0: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
f5f0: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
f600: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
f610: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
f620: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
f630: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
f640: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
f650: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
f660: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
f670: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
f680: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
f690: 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
f6a0: 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
f6b0: 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
f6c0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
f6d0: 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
f6e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
f6f0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
f700: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
f710: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
f720: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
f730: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
f740: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
f750: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
f760: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
f770: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
f780: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
f790: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
f7a0: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
f7b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
f7c0: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
f7d0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f7f0: 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
f800: 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
f810: 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
f820: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
f830: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
f840: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
f850: 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
f860: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
f870: 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
f880: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
f890: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
f8a0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
f8b0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
f8c0: 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
f8d0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
f8e0: 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
f8f0: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
f900: 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
f910: 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
f920: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
f930: 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
f940: 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
f950: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
f960: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
f970: 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
f980: 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
f990: 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
f9a0: 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
f9b0: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
f9c0: 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
f9d0: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
f9e0: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
f9f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
fa00: 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
fa10: 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
fa20: 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
fa30: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
fa40: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
fa50: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
fa60: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
fa70: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
fa80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
fa90: 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  M;.  }.  closeAl
faa0: 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
fab0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
fac0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
fad0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fae0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
faf0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
fb00: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
fb10: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
fb20: 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
fb30: 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
fb40: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
fb50: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=0 ){.    int 
fb60: 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
fb70: 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
fb80: 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
fb90: 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
fba0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
fbb0: 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
fbc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
fbd0: 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
fbe0: 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
fbf0: 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
fc00: 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
fc10: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
fc20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
fc30: 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
fc40: 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
fc50: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
fc60: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
fc70: 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
fc80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
fc90: 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
fca0: 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54  BLOCKED );  /* T
fcb0: 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e  his error no lon
fcc0: 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ger exists */.  
fcd0: 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
fce0: 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
fcf0: 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
fd00: 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
fd20: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
fd30: 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
fd40: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
fd50: 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
fd60: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
fd70: 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
fd80: 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
fd90: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
fda0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
fdb0: 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
fdc0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
fdd0: 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
fde0: 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
fdf0: 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
fe00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
fe10: 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
fe20: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
fe30: 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
fe40: 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
fe50: 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
fe60: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
fe70: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
fe80: 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
fe90: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
fea0: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
feb0: 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
fec0: 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
fed0: 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
fee0: 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
fef0: 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 65  .      ** occure
ff00: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
ff10: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
ff20: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
ff30: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
ff40: 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
ff50: 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
ff60: 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
ff70: 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
ff80: 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
ff90: 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
ffa0: 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
ffb0: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
ffc0: 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
ffd0: 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
ffe0: 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
fff0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
10000 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
10010 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
10020 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
10030 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
10040 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
10050 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
10060 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
10070 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
10080 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
10090 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
100a0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
100b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
100c0 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
100d0 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
100e0 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
100f0 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
10100 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
10110 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
10120 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
10130 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
10140 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
10150 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
10160 20 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69            invali
10170 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
10180 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
10190 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
101a0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
101b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
101c0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
101d0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
101e0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
101f0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
10200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10210 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
10220 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
10230 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
10240 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
10250 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10260 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10270 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
10280 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
10290 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
102a0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
102b0 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
102c0 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
102d0 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
102e0 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
102f0 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
10300 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
10310 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
10320 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
10330 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
10340 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
10350 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
10360 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
10370 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
10380 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
10390 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
103a0 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
103b0 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
103c0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
103d0 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56     && db->writeV
103e0 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64  dbeCnt==(p->read
103f0 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
10400 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
10410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
10420 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
10430 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
10440 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
10450 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10460 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
10470 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
10480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
104a0 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
104b0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
104c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
104d0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
104e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
104f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
10500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
10510 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
10520 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d  RAINT;.        }
10530 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
10540 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
10550 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
10560 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
10570 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
10580 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
10590 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
105a0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
105b0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
105c0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
105d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
105e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
105f0 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
10600 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
10610 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
10620 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
10630 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
10640 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
10650 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
10660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
10680 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
10690 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
106a0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
106b0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
106c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
106d0 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
106e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
106f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10700 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
10710 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10720 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10740 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
10750 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
10760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
10770 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
10780 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
10790 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
107a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
107b0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
107c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
107d0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
107e0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
107f0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
10800 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
10810 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
10820 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
10830 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
10840 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10850 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
10860 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
10870 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
10880 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
10890 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
108a0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
108b0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
108c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
108d0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
108e0 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
108f0 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
10900 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10910 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10920 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10930 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
10940 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
10950 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
10960 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
10970 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
10980 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
10990 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
109a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
109b0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
109c0 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
109d0 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
109e0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
109f0 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
10a00 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
10a10 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
10a20 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
10a30 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
10a40 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
10a50 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
10a60 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
10a70 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
10a80 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20  en promote the. 
10a90 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74     ** current st
10aa0 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f  atement error co
10ab0 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
10ac0 2a 20 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69  * Note that sqli
10ad0 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
10ae0 65 6d 65 6e 74 28 29 20 63 61 6e 20 6f 6e 6c 79  ement() can only
10af0 20 66 61 69 6c 20 69 66 20 65 53 74 61 74 65 6d   fail if eStatem
10b00 65 6e 74 4f 70 0a 20 20 20 20 2a 2a 20 69 73 20  entOp.    ** is 
10b10 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10b20 43 4b 2e 20 20 42 75 74 20 69 66 20 70 2d 3e 72  CK.  But if p->r
10b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  c==SQLITE_OK the
10b40 6e 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20  n eStatementOp. 
10b50 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 53 41     ** must be SA
10b60 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
10b70 20 20 48 65 6e 63 65 20 74 68 65 20 4e 45 56 45    Hence the NEVE
10b80 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  R(p->rc==SQLITE_
10b90 4f 4b 29 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  OK) in .    ** t
10ba0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
10bb0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
10bc0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
10bd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10be0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
10bf0 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
10c00 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
10c10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
10c20 20 61 73 73 65 72 74 28 20 65 53 74 61 74 65 6d   assert( eStatem
10c30 65 6e 74 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  entOp==SAVEPOINT
10c40 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
10c50 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70       if( NEVER(p
10c60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc==SQLITE_OK)
10c70 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
10c80 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
10c90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
10ca0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
10cb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10cc0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
10cd0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
10ce0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
10cf0 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c   }.        inval
10d00 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
10d10 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
10d20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10d30 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10d40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10d50 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
10d60 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
10d70 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
10d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10d90 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
10da0 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
10db0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
10dc0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
10dd0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
10de0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
10df0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
10e00 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
10e10 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
10e20 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
10e30 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
10e40 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
10e50 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
10e60 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
10e70 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
10e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
10e90 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
10ea0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
10eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10ec0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
10ed0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
10ee0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
10ef0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
10f00 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62  .  .    /* Rollb
10f10 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e  ack or commit an
10f20 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  y schema changes
10f30 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20   that occurred. 
10f40 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
10f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  !=SQLITE_OK && d
10f60 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
10f70 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
10f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
10f90 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
10fa0 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20 20 20  a(db, -1);.     
10fb0 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
10fc0 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
10fd0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
10fe0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
10ff0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
11000 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
11010 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
11020 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
11030 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
11040 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
11050 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
11060 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
11070 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
11080 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
11090 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  Cnt--;.    if( !
110a0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
110b0 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64       db->writeVd
110c0 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  beCnt--;.    }. 
110d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
110e0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62  ctiveVdbeCnt>=db
110f0 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
11100 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
11110 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
11120 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
11130 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
11140 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
11150 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
11160 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
11170 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
11180 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
11190 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
111a0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
111b0 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
111c0 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
111d0 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
111e0 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
111f0 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
11200 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
11210 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
11220 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
11230 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
11240 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
11250 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
11260 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11270 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11280 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
11290 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74   assert( db->act
112a0 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20  iveVdbeCnt>0 || 
112b0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
112c0 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
112d0 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
112e0 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
112f0 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
11300 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
11310 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
11320 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
11330 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
11340 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
11350 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
11360 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
11370 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
11380 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
11390 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
113a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
113b0 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
113c0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
113d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
113e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
113f0 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
11400 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
11410 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
11420 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
11430 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
11440 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
11450 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
11460 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
11470 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
11480 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
11490 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
114a0 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
114b0 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
114c0 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
114d0 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
114e0 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
114f0 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
11500 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
11510 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
11520 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
11530 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
11540 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
11550 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
11560 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11570 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
11580 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
11590 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
115a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
115b0 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
115c0 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
115d0 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
115e0 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
115f0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
11600 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
11610 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
11620 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
11630 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
11640 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
11650 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
11660 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
11670 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
11680 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
11690 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
116a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
116b0 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
116c0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
116d0 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
116e0 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
116f0 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
11700 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
11710 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
11720 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
11730 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
11740 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
11750 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
11760 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
11770 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
11780 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
11790 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
117a0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
117b0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
117c0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
117d0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
117e0 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
117f0 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
11800 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
11810 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
11820 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11830 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64  alloc();.      d
11840 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
11850 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
11860 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11870 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70  ErrMsg);.      p
11880 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
11890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
118a0 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
118b0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
118c0 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
118d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
118e0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
118f0 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
11900 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
11910 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
11920 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
11930 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
11940 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
11950 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
11960 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
11970 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
11980 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
11990 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
119a0 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
119b0 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
119c0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
119d0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
119e0 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
119f0 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
11a00 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
11a10 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
11a20 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
11a30 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11a40 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
11a50 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
11a60 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
11a70 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
11a80 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
11a90 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11aa0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
11ab0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
11ac0 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
11ad0 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
11ae0 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
11af0 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
11b00 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
11b10 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
11b20 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
11b30 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
11b40 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
11b50 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
11b60 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
11b70 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
11b80 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
11b90 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
11ba0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
11bb0 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
11bc0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
11bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11be0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
11bf0 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
11c00 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
11c10 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
11c20 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
11c30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
11c40 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
11c50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
11c60 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
11c70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
11c80 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
11c90 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
11ca0 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
11cb0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
11cc0 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
11cd0 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
11ce0 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
11cf0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
11d00 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
11d10 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
11d20 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
11d30 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
11d40 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11d50 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
11d60 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
11d70 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
11d80 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
11d90 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
11da0 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
11db0 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
11dc0 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
11dd0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
11de0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
11df0 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
11e00 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
11e10 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
11e20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11e30 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
11e40 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
11e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
11e60 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
11e70 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
11e80 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
11e90 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
11ea0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
11eb0 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
11ec0 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
11ed0 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
11ee0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11ef0 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
11f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11f10 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
11f20 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
11f30 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
11f40 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
11f50 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
11f60 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
11f70 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
11f80 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
11f90 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
11fa0 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
11fb0 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
11fc0 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
11fd0 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
11fe0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
11ff0 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
12000 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12010 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
12020 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
12030 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
12040 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
12050 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
12060 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
12070 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
12080 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
12090 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
120a0 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
120b0 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20  (((u32)1)<<i))) 
120c0 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
120d0 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
120e0 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
120f0 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
12100 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
12110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
12120 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
12130 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12140 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
12150 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12160 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
12170 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
12180 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64  gument..** The d
12190 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
121a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
121b0 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
121c0 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
121d0 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
121e0 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
121f0 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
12200 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
12210 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
12220 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12230 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
12240 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12250 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
12260 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
12270 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
12280 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  , *pNext;.  asse
12290 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
122a0 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
122b0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
122c0 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
122d0 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
122e0 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
122f0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
12300 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
12310 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
12320 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
12330 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
12340 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
12350 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
12360 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
12370 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
12380 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12390 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
123a0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
123b0 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
123c0 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
123d0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
123e0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  bel);.  sqlite3D
123f0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
12400 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
12410 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
12420 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
12430 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
12440 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ee);.  sqlite3Db
12450 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
12460 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
12470 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
12480 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
12490 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
124a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
124b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
124c0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
124d0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
124e0 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
124f0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
12500 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12510 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
12520 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
12530 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
12540 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
12550 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
12560 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
12570 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
12580 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
12590 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
125a0 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b  AD;.  p->db = 0;
125b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
125c0 6c 65 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70  leteObject(db, p
125d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
125e0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
125f0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
12600 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
12610 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
12620 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
12630 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
12640 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
12650 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
12660 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
12670 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
12680 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
12690 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
126a0 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
126b0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
126c0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
126d0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
126e0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
126f0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
12700 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
12710 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
12720 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
12730 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
12740 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
12750 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
12760 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
12770 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
12780 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
12790 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
127a0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
127b0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
127c0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
127d0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
127e0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
127f0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
12800 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
12810 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
12820 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12830 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
12840 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
12850 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
12860 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
12870 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
12880 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
12890 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
128a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
128b0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
128c0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
128d0 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
128e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
128f0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
12900 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
12910 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
12920 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
12930 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
12940 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61  rn rc;.    p->la
12950 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76  stRowid = p->mov
12960 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69  etoTarget;.    i
12970 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
12980 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12990 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72  T_BKPT;.    p->r
129a0 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b  owidIsValid = 1;
129b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
129c0 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
129d0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
129e0 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
129f0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
12a00 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
12a10 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
12a20 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
12a30 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f  ALWAYS(p->pCurso
12a40 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  r) ){.    int ha
12a50 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
12a60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12a70 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
12a80 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
12a90 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
12aa0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12ab0 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
12ac0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
12ad0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
12ae0 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
12af0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
12b00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12b20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
12b30 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
12b40 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
12b50 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
12b60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
12b70 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
12b80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
12b90 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
12ba0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
12bb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12bc0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
12bd0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
12be0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
12bf0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
12c00 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
12c10 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
12c20 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
12c30 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
12c40 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
12c50 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
12c60 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
12c70 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
12c80 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
12c90 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
12ca0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
12cb0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
12cc0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
12cd0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
12ce0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
12cf0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
12d00 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
12d10 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
12d20 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
12d30 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
12d40 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
12d50 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
12d60 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
12d70 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
12d80 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
12d90 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
12da0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
12db0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
12dc0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
12dd0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
12de0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
12df0 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
12e00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
12e10 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
12e20 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
12e30 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
12e40 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
12e50 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
12e60 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
12e70 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
12e80 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
12e90 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
12ea0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
12ec0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
12ed0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
12ee0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
12ef0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12f00 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
12f10 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
12f20 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
12f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f40 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
12f50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
12f60 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
12f70 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
12f80 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
12f90 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
12fa0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
12fb0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
12fc0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
12fd0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
13000 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13010 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
13020 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
13030 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13040 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13070 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
13080 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13090 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
130a0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
130b0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
130c0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
130d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
130e0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
130f0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
13100 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
13130 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
13140 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
13150 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
13160 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
13170 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
13180 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
13190 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
131a0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
131b0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
131c0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
131d0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
131e0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
131f0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
13200 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
13210 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
13220 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13230 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
13240 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
13250 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
13260 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13270 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
13280 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
13290 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
132a0 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
132b0 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
132c0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
132d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
132e0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
132f0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
13300 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
13310 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
13320 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
13330 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
13340 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
13350 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
13360 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
13370 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
13380 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
13390 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26  file_format>=4 &
133a0 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20  & (i&1)==i ){.  
133b0 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
133c0 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  2)i;.    }.    i
133d0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
133e0 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54  if( i<(-MAX_6BYT
133f0 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20  E) ) return 6;. 
13400 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
13410 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20   test prevents: 
13420 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30   u = -(-92233720
13430 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a  36854775808) */.
13440 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20        u = -i;.  
13450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
13460 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
13470 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
13480 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
13490 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
134a0 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
134b0 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
134c0 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
134d0 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
134e0 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
134f0 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
13500 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
13510 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
13520 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
13530 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
13540 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
13550 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13560 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
13570 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
13580 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
13590 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
135a0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
135b0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
135c0 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
135d0 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
135e0 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
135f0 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
13600 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
13610 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
13620 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
13630 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
13640 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
13650 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
13660 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13670 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
13680 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
13690 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
136a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
136b0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
136c0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
136d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
136e0 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
136f0 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
13700 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
13710 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
13720 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
13730 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
13740 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
13750 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
13760 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
13770 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
13780 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
13790 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
137a0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
137b0 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
137c0 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
137d0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
137e0 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
137f0 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
13800 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
13810 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
13820 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
13830 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
13840 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
13850 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
13860 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
13870 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
13880 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
13890 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
138a0 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
138b0 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
138c0 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
138d0 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
138e0 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
138f0 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
13900 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
13910 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
13920 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
13930 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
13940 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
13950 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
13960 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
13970 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
13980 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
13990 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
139a0 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
139b0 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
139c0 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
139d0 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
139e0 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
139f0 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
13a00 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
13a10 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
13a20 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
13a30 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
13a40 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
13a50 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
13a60 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
13a70 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
13a80 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
13a90 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
13aa0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
13ab0 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
13ac0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
13ad0 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
13ae0 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
13af0 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
13b00 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
13b10 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
13b20 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
13b30 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
13b40 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
13b50 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
13b60 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
13b70 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
13b80 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
13b90 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
13ba0 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
13bb0 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
13bc0 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
13bd0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
13be0 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
13bf0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
13c00 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
13c10 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
13c20 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
13c30 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
13c40 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
13c50 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
13c60 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
13c70 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
13c80 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
13c90 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
13ca0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
13cb0 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
13cc0 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
13cd0 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
13ce0 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
13cf0 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
13d00 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
13d10 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
13d20 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
13d30 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
13d40 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
13d50 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
13d60 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
13d70 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
13d80 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
13d90 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
13da0 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
13db0 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
13dc0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
13dd0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
13de0 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
13df0 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
13e00 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
13e10 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
13e20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
13e30 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
13e40 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
13e50 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
13e60 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
13e70 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
13e80 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
13e90 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
13ea0 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
13eb0 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
13ec0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
13ed0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
13ee0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
13ef0 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
13f00 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
13f10 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
13f20 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
13f30 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
13f40 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
13f50 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
13f60 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
13f70 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
13f80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
13f90 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
13fa0 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
13fb0 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
13fc0 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
13fd0 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
13fe0 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
13ff0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
14000 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
14010 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
14020 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
14030 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
14040 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
14050 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
14060 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
14070 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
14080 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
14090 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
140a0 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
140b0 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
140c0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
140d0 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
140e0 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
140f0 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
14100 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
14110 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
14120 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
14130 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
14140 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
14150 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
14160 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
14170 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
14180 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
14190 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
141a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
141b0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
141c0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
141d0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
141e0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
141f0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
14200 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
14210 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
14220 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
14230 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
14240 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
14250 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
14260 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
14270 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
14280 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
14290 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
142a0 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
142b0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
142c0 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
142d0 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
142e0 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
142f0 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
14300 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
14310 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
14320 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
14330 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
14340 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
14350 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14360 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
14370 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
14380 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
14390 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
143a0 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
143b0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
143c0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
143d0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
143e0 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
143f0 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
14400 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14410 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
14420 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
14430 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
14440 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
14450 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
14460 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
14470 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
14480 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
14490 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
144a0 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
144b0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
144c0 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
144d0 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
144e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
144f0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
14500 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
14510 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
14520 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14530 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
14540 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
14550 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
14560 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
14570 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
14580 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
14590 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
145a0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
145b0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
145c0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
145d0 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
145e0 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
145f0 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
14600 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
14610 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
14620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14630 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
14640 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
14650 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
14660 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
14670 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
14680 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
14690 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
146a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
146b0 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
146c0 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
146d0 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
146e0 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
146f0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
14700 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
14710 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14720 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
14730 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
14740 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
14750 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
14760 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
14770 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
14780 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
14790 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
147a0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
147b0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
147c0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
147d0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
14800 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
14810 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
14820 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
14830 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
14840 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
14850 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
14860 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
14870 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
14880 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
14890 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
148a0 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
148b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
148c0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
148d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
148e0 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
148f0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14900 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
14910 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
14920 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
14930 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14940 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14950 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
14960 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
14970 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14980 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
14990 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
149a0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
149b0 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
149c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
149d0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
149e0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
149f0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
14a00 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
14a10 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
14a20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
14a30 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
14a40 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
14a50 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
14a60 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
14a70 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
14a80 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
14a90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
14aa0 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
14ab0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
14ac0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14ad0 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
14ae0 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
14af0 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
14b00 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
14b10 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
14b30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14b40 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
14b50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14b60 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
14b70 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
14b80 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
14b90 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
14ba0 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
14bb0 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
14bc0 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
14bd0 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
14be0 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
14bf0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
14c00 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
14c10 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14c20 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14c30 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
14c40 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
14c50 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14c60 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
14c70 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
14c80 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
14c90 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
14ca0 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
14cb0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
14cc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14cd0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14ce0 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
14cf0 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
14d00 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
14d10 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
14d20 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
14d30 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
14d40 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
14d50 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
14d60 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
14d70 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
14d80 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
14d90 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
14da0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
14db0 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
14dc0 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
14dd0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
14de0 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
14df0 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
14e00 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
14e10 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
14e20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
14e30 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
14e40 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14e50 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
14e60 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
14e70 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
14e80 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
14e90 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
14ea0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
14eb0 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
14ec0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
14ed0 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
14ee0 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
14ef0 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
14f00 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
14f10 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
14f20 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
14f30 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
14f40 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
14f50 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
14f60 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
14f70 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
14f80 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14f90 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
14fa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
14fb0 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
14fc0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
14fd0 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
14fe0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
14ff0 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
15000 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
15010 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
15020 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
15030 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
15040 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
15050 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
15060 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
15070 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
15080 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
15090 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
150a0 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
150b0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
150c0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
150d0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
150e0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
150f0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15100 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
15110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
15120 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
15130 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
15140 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
15150 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
15160 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
15170 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
15180 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
15190 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
151a0 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
151b0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
151c0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
151d0 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
151e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
151f0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15200 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
15210 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
15220 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
15230 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15240 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  n 0;.}.../*.** G
15250 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
15260 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
15270 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
15280 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20  ], parse the.** 
15290 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e  record into a Un
152a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
152b0 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
152c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
152d0 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a  that structure..
152e0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
152f0 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74  g function might
15300 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65   provide szSpace
15310 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
15320 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70  .** space at pSp
15330 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65  ace.  This space
15340 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
15350 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
15360 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52  d.** VDbeParsedR
15370 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
15380 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65  if it is large e
15390 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73  nough.  If it is
153a0 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75  .** not big enou
153b0 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74  gh, space is obt
153c0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
153d0 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3_malloc()..**.
153e0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
153f0 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64  structure should
15400 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20   be closed by a 
15410 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
15420 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
15430 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f  ckedRecord()..*/
15440 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   .UnpackedRecord
15450 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63   *sqlite3VdbeRec
15460 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
15470 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
15480 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
15490 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
154a0 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
154b0 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
154c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
154d0 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
154e0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
154f0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
15500 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
15510 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
15520 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
15530 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
15540 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ace available to
15550 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74   hold the object
15560 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
15570 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
15580 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
15590 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
155a0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
155b0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
155c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
155d0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70  ar *)pKey;.  Unp
155e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
155f0 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64   /* The unpacked
15600 20 72 65 63 6f 72 64 20 74 68 61 74 20 77 65 20   record that we 
15610 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20  will return */. 
15620 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
15630 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
15640 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68  pace needed to h
15650 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20  old p, in bytes 
15660 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33  */.  int d;.  u3
15670 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20  2 idx;.  u16 u; 
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15690 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
156a0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
156b0 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
156c0 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  m;.  int nOff;  
156d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
156e0 65 61 73 65 20 70 53 70 61 63 65 20 62 79 20 74  ease pSpace by t
156f0 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79  his much to 8-by
15700 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  te align it */. 
15710 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77   .  /*.  ** We w
15720 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65  ant to shift the
15730 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20   pointer pSpace 
15740 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20  up such that it 
15750 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  is 8-byte aligne
15760 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65  d..  ** Thus, we
15770 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61   need to calcula
15780 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66  te a value, nOff
15790 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  , between 0 and 
157a0 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a  7, to shift .  *
157b0 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70  * it by.  If pSp
157c0 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38  ace is already 8
157d0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e  -byte aligned, n
157e0 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  Off should be ze
157f0 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20  ro..  */.  nOff 
15800 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50  = (8 - (SQLITE_P
15810 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65  TR_TO_INT(pSpace
15820 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70  ) & 7)) & 7;.  p
15830 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20  Space += nOff;. 
15840 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66   szSpace -= nOff
15850 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
15860 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
15870 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
15880 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
15890 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
158a0 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
158b0 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  ce ){.    p = sq
158c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
158d0 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
158e0 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
158f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
15900 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
15910 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45  NPACKED_NEED_FRE
15920 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  E | UNPACKED_NEE
15930 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c  D_DESTROY;.  }el
15940 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
15950 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70  ackedRecord*)pSp
15960 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ace;.    p->flag
15970 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s = UNPACKED_NEE
15980 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20  D_DESTROY;.  }. 
15990 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
159a0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
159b0 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
159c0 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70  >nField + 1;.  p
159d0 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20  ->aMem = pMem = 
159e0 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
159f0 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
15a00 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
15a10 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
15a20 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
15a30 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
15a40 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
15a50 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
15a60 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
15a70 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
15a80 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46  szHdr && u<p->nF
15a90 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20  ield && d<=nKey 
15aa0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
15ab0 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
15ac0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
15ad0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
15ae0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
15af0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
15b00 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
15b10 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
15b20 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ->db;.    pMem->
15b30 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  flags = 0;.    p
15b40 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
15b50 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
15b60 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
15b70 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
15b80 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
15b90 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
15ba0 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
15bb0 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
15bc0 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
15bd0 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72  >nField = u;.  r
15be0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a  eturn (void*)p;.
15bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15c00 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61  utine destroys a
15c10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
15c20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
15c30 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15c40 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
15c50 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
15c60 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
15c70 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73  em *pMem;..  ass
15c80 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
15c90 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 20  ssert( p->flags 
15ca0 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
15cb0 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f 72  DESTROY );.  for
15cc0 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d  (i=0, pMem=p->aM
15cd0 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b  em; i<p->nField;
15ce0 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
15cf0 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b     /* The unpack
15d00 65 64 20 72 65 63 6f 72 64 20 69 73 20 61 6c 77  ed record is alw
15d10 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ays constructed 
15d20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  by the.    ** sq
15d30 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63 6b 52  lite3VdbeUnpackR
15d40 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e  ecord() function
15d50 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20 6d 61   above, which ma
15d60 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  kes all.    ** s
15d70 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
15d80 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20 6e 6f   static.  And no
15d90 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e  ne of the elemen
15da0 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 65 76  ts are.    ** ev
15db0 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20  er transformed, 
15dc0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
15dd0 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65  r anything to de
15de0 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lete..    */.   
15df0 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65 6d 2d   if( NEVER(pMem-
15e00 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69  >zMalloc) ) sqli
15e10 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
15e20 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  e(pMem);.  }.  i
15e30 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e  f( p->flags & UN
15e40 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45  PACKED_NEED_FREE
15e50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
15e60 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66  bFree(p->pKeyInf
15e70 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  o->db, p);.  }.}
15e80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15e90 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
15ea0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
15eb0 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
15ec0 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
15ed0 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
15ee0 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
15ef0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
15f00 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
15f10 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
15f20 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
15f30 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
15f40 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
15f50 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
15f60 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
15f70 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
15f80 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
15f90 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
15fa0 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
15fb0 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
15fc0 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
15fd0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
15fe0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
15ff0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
16000 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
16010 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
16020 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
16030 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
16040 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
16050 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77  ds..** The key w
16060 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73  ith fewer fields
16070 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70   is usually comp
16080 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ares less than t
16090 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65  he .** longer ke
160a0 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74  y.  However if t
160b0 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
160c0 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b  KEY flags in pPK
160d0 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e  ey2 is set.** an
160e0 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
160f0 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c  fixes are equal,
16100 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65   then key1 is le
16110 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a  ss than key2..**
16120 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43   Or if the UNPAC
16130 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58  KED_MATCH_PREFIX
16140 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
16150 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72   the prefixes ar
16160 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e  e.** equal, then
16170 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f   the keys are co
16180 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
16190 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20  qual and.** the 
161a0 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65  parts beyond the
161b0 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61   common prefix a
161c0 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  re ignored..**.*
161d0 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  * If the UNPACKE
161e0 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66  D_IGNORE_ROWID f
161f0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
16200 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
16210 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  f.** the header 
16220 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f  of pKey1 is igno
16230 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  red.  It is assu
16240 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69  med that pKey1 i
16250 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65  s.** an index ke
16260 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73  y, and thus ends
16270 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61   with a rowid va
16280 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62  lue.  The last b
16290 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65  yte.** of the he
162a0 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66  ader will theref
162b0 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61  ore be the seria
162c0 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
162d0 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31  wid:.** one of 1
162e0 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c  , 2, 3, 4, 5, 6,
162f0 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69   8, or 9 - the i
16300 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79  nteger serial ty
16310 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69  pes..** The seri
16320 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  al type of the f
16330 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20  inal rowid will 
16340 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67  always be a sing
16350 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69  le byte..** By i
16360 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73  gnoring this las
16370 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
16380 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74  ader, we force t
16390 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  he comparison.**
163a0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72   to ignore the r
163b0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
163c0 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20  of key1..*/.int 
163d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
163e0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
163f0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
16400 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
16410 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
16420 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
16430 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
16440 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  t key */.){.  in
16450 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  t d1;           
16460 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
16470 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
16480 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
16490 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
164a0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
164b0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
164c0 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
164d0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
164e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
164f0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
16500 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
16510 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
16520 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
16530 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
16540 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
16550 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
16560 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
16570 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16580 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
16590 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
165a0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
165b0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
165c0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
165d0 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
165e0 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
165f0 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
16600 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
16610 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
16620 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
16630 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
16640 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
16650 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
16660 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
16670 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
16680 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
16690 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
166a0 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
166b0 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
166c0 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
166d0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
166e0 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
166f0 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
16700 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
16710 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
16720 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
16730 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
16740 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  d initialized, a
16750 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
16760 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
16770 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
16780 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
16790 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
167a0 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
167b0 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
167c0 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
167d0 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
167e0 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
167f0 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
16800 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16810 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
16820 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
16830 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
16840 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
16850 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
16860 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
16870 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
16880 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
16890 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
168a0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
168b0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
168c0 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
168d0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
168e0 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  ORE_ROWID ){.   
168f0 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20   szHdr1--;.  }. 
16900 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
16910 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
16920 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
16930 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
16940 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
16950 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
16960 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
16970 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
16980 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
16990 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
169a0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
169b0 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
169c0 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
169d0 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
169e0 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
169f0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16a00 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
16a10 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
16a20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
16a30 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
16a40 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
16a50 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
16a60 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
16a70 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
16a80 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
16a90 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
16aa0 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
16ab0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16ac0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
16ad0 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
16ae0 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
16b10 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
16b20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
16b30 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
16b40 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
16b50 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
16b60 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  mment below */..
16b70 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20        /* Invert 
16b80 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65  the result if we
16b90 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20   are using DESC 
16ba0 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
16bb0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
16bc0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
16bd0 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65   i<nField && pKe
16be0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
16bf0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
16c00 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
16c10 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
16c20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
16c30 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
16c40 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
16c50 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
16c60 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
16c70 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c  field were equal
16c80 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
16c90 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
16ca0 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20  lag and set .   
16cb0 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f     ** pPKey2->ro
16cc0 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
16cd0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
16ce0 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
16cf0 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20  Key1)..      ** 
16d00 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
16d10 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
16d20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  opcode..      */
16d30 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65  .      if( (pPKe
16d40 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
16d50 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
16d60 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79  CH) && i==(pPKey
16d70 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a  2->nField-1) ){.
16d80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16d90 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
16da0 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rc );.        as
16db0 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73  sert( mem1.flags
16dc0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
16dd0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c        pPKey2->fl
16de0 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
16df0 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
16e00 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
16e10 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69  rowid = mem1.u.i
16e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
16e30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16e40 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
16e50 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f   }..  /* No memo
16e60 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
16e70 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
16e80 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
16e90 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
16ea0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
16eb0 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
16ec0 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
16ed0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
16ee0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
16ef0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
16f00 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
16f10 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
16f20 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
16f30 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
16f40 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
16f50 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
16f60 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
16f70 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
16f80 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
16f90 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
16fa0 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
16fb0 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
16fc0 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c  _INCRKEY.  ** fl
16fd0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
16fe0 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
16ff0 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
17000 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49  s larger..  ** I
17010 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52  f the UPACKED_PR
17020 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20  EFIX_MATCH flag 
17030 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79  is set, then key
17040 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72  s with common pr
17050 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20  efixes.  ** are 
17060 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
17070 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
17080 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
17090 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  ey is the .  ** 
170a0 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
170b0 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
170c0 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
170d0 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a  e the longer.  *
170e0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
170f0 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
17100 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
17110 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32   );.  if( pPKey2
17120 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
17130 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
17140 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c    rc = -1;.  }el
17150 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
17160 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
17170 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
17180 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
17190 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  =0 */.  }else if
171a0 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b  ( idx1<szHdr1 ){
171b0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
171c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
171d0 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
171e0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
171f0 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
17200 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
17210 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
17220 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
17230 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
17240 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
17250 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
17260 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
17270 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17280 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
17290 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
172a0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
172b0 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
172c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
172d0 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
172e0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
172f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
17300 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
17310 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
17320 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
17330 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
17340 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
17350 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
17360 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
17370 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17380 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
17390 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
173a0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
173b0 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
173c0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
173d0 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
173e0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
173f0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
17400 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
17410 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
17420 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
17430 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
17440 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17450 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
17460 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
17470 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
17480 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
17490 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
174a0 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
174b0 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
174c0 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
174d0 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
174e0 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
174f0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
17500 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
17510 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
17520 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
17530 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
17540 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
17550 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
17560 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
17570 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17580 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17590 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
175a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
175b0 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
175c0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
175d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
175e0 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
175f0 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
17600 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
17610 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
17620 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
17630 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
17640 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
17650 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
17660 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
17670 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
17680 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
17690 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
176a0 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
176b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
176c0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
176d0 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
176e0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
176f0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
17700 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
17710 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
17720 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
17730 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
17740 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
17750 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
17760 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
17770 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
17780 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
17790 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
177a0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
177b0 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
177c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
177d0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
177e0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
177f0 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
17800 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
17810 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
17820 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
17830 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
17840 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
17850 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
17860 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
17870 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
17880 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
17890 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
178a0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
178b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
178c0 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
178d0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
178e0 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
178f0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17900 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
17910 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
17920 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17930 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
17940 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17950 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
17960 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17970 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
17980 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
17990 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
179a0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
179b0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
179c0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
179d0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
179e0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
179f0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
17a00 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
17a10 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
17a20 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
17a30 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17a40 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
17a50 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
17a60 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
17a70 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
17a80 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
17a90 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
17aa0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
17ab0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
17ac0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
17ad0 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
17ae0 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
17af0 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
17b00 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
17b10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
17b20 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
17b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
17b40 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
17b50 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
17b60 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
17b70 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
17b80 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
17b90 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
17ba0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
17bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
17bc0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
17bd0 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
17be0 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
17bf0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
17c00 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
17c10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17c20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
17c40 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
17c50 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
17c60 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
17c70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
17c80 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
17c90 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
17ca0 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
17cb0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
17cc0 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
17cd0 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
17ce0 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
17cf0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
17d00 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
17d10 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
17d20 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
17d30 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
17d40 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
17d50 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
17d60 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
17d70 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
17d80 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
17d90 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
17da0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
17db0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
17dc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
17dd0 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
17de0 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
17df0 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
17e00 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
17e10 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
17e20 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
17e30 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
17e40 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
17e50 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
17e60 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
17e70 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
17e80 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
17e90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
17ea0 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
17eb0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
17ec0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
17ed0 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70  npacked,  /* Unp
17ee0 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
17ef0 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
17f00 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
17f10 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
17f20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17f30 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
17f40 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
17f50 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
17f60 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
17f70 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17f80 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
17f90 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
17fa0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
17fb0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
17fc0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  Cur) );.  rc = s
17fd0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
17fe0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
17ff0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
18000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
18010 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
18020 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
18030 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
18040 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
18050 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
18060 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
18070 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
18080 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20  se of the say.  
18090 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
180a0 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
180b0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
180c0 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
180d0 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
180e0 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
180f0 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
18100 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
18110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18120 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18130 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
18140 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
18150 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18160 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
18170 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
18180 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
18190 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
181a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
181b0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
181c0 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
181d0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
181e0 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a  ORE_ROWID );.  *
181f0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
18200 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
18210 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
18220 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
18230 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
18240 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18250 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
18260 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
18270 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
18280 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
18290 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
182a0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
182b0 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
182c0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
182d0 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
182e0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
182f0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
18300 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
18310 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18320 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
18330 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
18340 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
18350 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
18360 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
18370 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
18380 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
18390 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
183a0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
183b0 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
183c0 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
183d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
183e0 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
183f0 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
18400 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
18410 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
18420 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
18430 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
18440 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
18450 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
18460 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
18470 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
18480 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
18490 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
184a0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
184b0 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
184c0 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
184d0 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
184e0 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
184f0 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
18500 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
18510 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
18520 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
18530 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
18540 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
18550 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
18560 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
18570 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
18580 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
18590 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
185a0 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
185b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
185c0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
185d0 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
185e0 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
185f0 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
18600 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
18610 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
18620 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
18630 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18640 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
18650 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18660 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
18670 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
18680 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
18690 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
186a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
186b0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
186c0 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
186d0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
186e0 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
186f0 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
18700 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
18710 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
18720 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
18730 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
18740 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
18750 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
18760 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
18770 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
18780 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
18790 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
187a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
187b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
187c0 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
187d0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
187e0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
187f0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
18800 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
18810 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
18820 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  etValue(Vdbe *v,
18830 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
18840 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
18850 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
18860 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
18870 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
18880 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
18890 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
188a0 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
188b0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
188c0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
188d0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
188e0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
188f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18900 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
18910 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
18920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18930 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
18940 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
18950 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
18960 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
18970 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d  emStoreType((Mem
18980 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20   *)pRet);.      
18990 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
189a0 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
189b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
189c0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
189d0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
189e0 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
189f0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
18a00 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
18a10 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
18a20 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
18a30 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
18a40 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
18a50 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
18a60 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
18a70 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
18a80 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
18a90 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
18aa0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
18ab0 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
18ac0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
18ad0 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
18ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
18af0 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
18b00 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
18b10 20 20 7d 0a 7d 0a                                  }.}.