/ Hex Artifact Content
Login

Artifact dd5d10ae523bbc6ed55ac73daa28a9ea1f2fa42a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6c 6f 63 61 6c 20 61 6c 6c 20 62  also local all b
13a0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  trees..**.** The
13b0: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
13c0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
13d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
13e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
13f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1400: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1410: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1420: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1430: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
1440: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
1450: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
1460: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
1470: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
1480: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1490: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
14a0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
14b0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
14c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
14d0: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
14e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
14f0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1500: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1510: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1520: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1530: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1540: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1550: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
1560: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
1570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1580: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
1590: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
15a0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
15b0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
15c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
15d0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
15e0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
15f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1600: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1610: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1620: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1630: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1640: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1650: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1660: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
1670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1680: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
1690: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
16a0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
16b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16c0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
16d0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
16e0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
16f0: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1700: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1710: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1720: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1730: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
1740: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
1750: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1760: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
1770: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
1780: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
1790: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
17a0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
17b0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
17c0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
17d0: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
17e0: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
17f0: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1800: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1810: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1820: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1830: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
1840: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
1850: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
1860: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
1870: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
1880: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
1890: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
18a0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
18b0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
18c0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
18d0: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
18e0: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
18f0: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
1900: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
1910: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
1920: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
1930: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
1940: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
1950: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
1960: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
1970: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
1980: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
1990: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
19b0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
19c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
19d0: 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a   = p->nLabel++;.
19e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
19f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1a00: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  NIT );.  if( i>=
1a10: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29  p->nLabelAlloc )
1a20: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d  {.    int n = p-
1a30: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1a40: 20 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   5;.    p->aLabe
1a50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1a60: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1a70: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e      n*sizeof(p->
1ab0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20  aLabel[0]));.   
1ac0: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
1ad0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1ae0: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  cSize(p->db, p->
1af0: 61 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70  aLabel)/sizeof(p
1b00: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20  ->aLabel[0]);.  
1b10: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1b20: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b30: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1b40: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1b60: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1b80: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1b90: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1ba0: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1bb0: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
1bc0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1bd0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
1be0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
1bf0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
1c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c10: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1c20: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1c30: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1c40: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1c50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1c60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1c70: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1c80: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1c90: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1ca0: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1cb0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
1cc0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
1cd0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
1ce0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
1cf0: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
1d00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
1d10: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
1d20: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
1d30: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
1d40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1d50: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
1d60: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
1d70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1d80: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
1d90: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
1da0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1db0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
1dc0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
1dd0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
1de0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
1df0: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
1e00: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
1e10: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
1e20: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
1e30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1e40: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1e50: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
1e60: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
1e70: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
1e80: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
1e90: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
1ea0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
1ed0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
1ee0: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
1ef0: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
1f00: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
1f10: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
1f20: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
1f30: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
1f40: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
1f50: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
1f60: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1f70: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
1f80: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
1f90: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
1fa0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
1fc0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
1fd0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
1fe0: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
1ff0: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2000: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2010: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2020: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2040: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2050: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2060: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2080: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2090: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
20a0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
20d0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
20e0: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
20f0: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2100: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2110: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2120: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2130: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2140: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2150: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2160: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2170: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2180: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2190: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
21a0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
21b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21c0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
21d0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
21e0: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
21f0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2200: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
2210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
2220: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
2230: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
2240: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
2250: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
2260: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2270: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
2280: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
2290: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
22a0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
22b0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
22c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
22d0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
22e0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
22f0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2300: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
2310: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
2320: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2330: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
2340: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
2350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2360: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2370: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2380: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2390: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
23a0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
23b0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
23c0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
23d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
23e0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
23f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2400: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
2410: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
2420: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
2430: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2440: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2450: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
2460: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2470: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2480: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2490: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
24a0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
24b0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
24c0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
24d0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
24e0: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
24f0: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2500: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
2510: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
2520: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
2530: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
2540: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
2550: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2560: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2570: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2580: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2590: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
25a0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
25b0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
25c0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
25d0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
25e0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
25f0: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2600: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
2610: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
2620: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
2630: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
2640: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2650: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2660: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
2670: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
2680: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
2690: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
26a0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
26b0: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
26c0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
26d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
26e0: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
26f0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2700: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2710: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
2720: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
2730: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
2740: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
2750: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
2760: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
2770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
2780: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2790: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27a0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
27b0: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
27c0: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
27d0: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
27e0: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
27f0: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
2800: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56  ;.  Op *pOp;.  V
2810: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2820: 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72  .  memset(&sIter
2830: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2840: 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d  r));.  sIter.v =
2850: 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70   v;..  while( (p
2860: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
2870: 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20  &sIter))!=0 ){. 
2880: 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20     int opcode = 
2890: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pOp->opcode;.   
28a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
28b0: 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64  Destroy || opcod
28c0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c  e==OP_VUpdate ||
28d0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e   opcode==OP_VRen
28e0: 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ame .#ifndef SQL
28f0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
2900: 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70  _KEY.     || (op
2910: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
2920: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
2930: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20   && pOp->p2==1) 
2940: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20  .#endif.     || 
2950: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
2960: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
2970: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
2980: 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d     && (pOp->p1==
2990: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
29a0: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
29b0: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
29c0: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
29d0: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
29f0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
2a00: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
2a10: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
2a20: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
2a30: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
2a40: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2a50: 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66  occured..  ** If
2a60: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2a70: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2a80: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
2a90: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
2aa0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
2ab0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
2ac0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
2ad0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
2ae0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2af0: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2b00: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
2b10: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
2b20: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
2b30: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
2b40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
2b50: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2b60: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2b70: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2b80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2b90: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2ba0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2bb0: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2bc0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2bd0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2be0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2bf0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2c00: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
2c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2c20: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
2c30: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
2c40: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
2c50: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
2c60: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2c70: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2c80: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2ca0: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2cb0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2cc0: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2cd0: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2ce0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2cf0: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2d00: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2d10: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2d20: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2d30: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2d40: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2d50: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2d60: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2d70: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2d80: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2d90: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2da0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2db0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2dc0: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2df0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2e00: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2e10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2e20: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2e30: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2e40: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2e50: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2e60: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2e70: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
2e80: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
2e90: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
2ea0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
2eb0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
2ec0: 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20     pOp->opflags 
2ed0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
2ee0: 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b  roperty[opcode];
2ef0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2f00: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20  =OP_Function || 
2f10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
2f20: 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ep ){.      if( 
2f30: 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73  pOp->p5>nMaxArgs
2f40: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2f50: 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65  p->p5;.    }else
2f60: 20 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50   if( (opcode==OP
2f70: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  _Transaction && 
2f80: 70 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f  pOp->p2!=0) || o
2f90: 70 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d  pcode==OP_Vacuum
2fa0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61   ){.      p->rea
2fb0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64  dOnly = 0;.#ifnd
2fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2fd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2fe0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2ff0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
3000: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
3010: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
3020: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
3030: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3040: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
3050: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
3060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3070: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
3080: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3090: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
30a0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
30b0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
30c0: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
30d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
30e0: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
30f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3100: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 29  pcode==OP_Next )
3110: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e  {.      pOp->p4.
3120: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3130: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3140: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3150: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
3160: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3170: 65 3d 3d 4f 50 5f 50 72 65 76 20 29 7b 0a 20 20  e==OP_Prev ){.  
3180: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3190: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
31a0: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
31b0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
31c0: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
31d0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
31e0: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
31f0: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
3200: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
3210: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
3220: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
3230: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
3240: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
3250: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
3260: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
3270: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
3280: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
3290: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
32a0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
32b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
32c0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
32d0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
32e0: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
32f0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3300: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3310: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3320: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3330: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3340: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3350: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3360: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
3370: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
3380: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
3390: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
33a0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
33b0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
33c0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
33d0: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
33e0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
33f0: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
3400: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
3410: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3420: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3430: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3440: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3450: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
3460: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
3470: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
3480: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
3490: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
34a0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
34b0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
34c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
34d0: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
34e0: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
34f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3500: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
3510: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3520: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3530: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3540: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3550: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3560: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
3570: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
3580: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
3590: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
35a0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
35b0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
35c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
35d0: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
35e0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
35f0: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
3600: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
3610: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3620: 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  rt( p->btreeMask
3630: 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  ==0 );..  resolv
3640: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
3650: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
3660: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
3670: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
3680: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
3690: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
36a0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
36b0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
36c0: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
36d0: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
36e0: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
36f0: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
3700: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
3710: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
3720: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
3730: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
3740: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
3750: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3760: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3770: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
3780: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
3790: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
37a0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
37b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
37c0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
37d0: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
37e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
37f0: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
3800: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
3810: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3820: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3830: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3840: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
3850: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
3860: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
3870: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
3880: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
3890: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
38a0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
38b0: 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 73 71   if( p2<0 && (sq
38c0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
38d0: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
38e0: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
38f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  =0 ){.        pO
3900: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
3910: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
3920: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
3930: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
3940: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
3950: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
3960: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
3970: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3980: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
3990: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
39a0: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
39b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
39c0: 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d       pOut->zComm
39d0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ent = 0;.      i
39e0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
39f0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
3a00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
3a10: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
3a20: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
3a30: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
3a40: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
3a50: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
3a60: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
3a70: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3a80: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3a90: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
3aa0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3ab0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3ac0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3ad0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3ae0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3af0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3b00: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3b10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3b20: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3b30: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3b40: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3b50: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
3b60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b70: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
3b80: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3b90: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3ba0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3bb0: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3bc0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3bd0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
3be0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3bf0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3c00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
3c10: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3c20: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3c30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3c40: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
3c50: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
3c60: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3c70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3c80: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3c90: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3ca0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3cb0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3cc0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3cd0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3ce0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3cf0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3d00: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3d10: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3d20: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3d30: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3d40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3d50: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
3d60: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3d70: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3d80: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
3d90: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
3da0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20  >aOp[addr].p3 = 
3db0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
3dc0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3dd0: 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65  ue of the P5 ope
3de0: 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73  rand for the mos
3df0: 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64  t recently.** ad
3e00: 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ded operation..*
3e10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3e20: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
3e30: 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61  *p, u8 val){.  a
3e40: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3e50: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
3e60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
3e70: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
3e80: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
3e90: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
3ea0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
3eb0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
3ec0: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
3ed0: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
3ee0: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
3ef0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3f00: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
3f10: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
3f20: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3f30: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
3f40: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
3f50: 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c  addr>=0 );.  sql
3f60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3f70: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
3f80: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
3f90: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
3fa0: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
3fb0: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
3fc0: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
3fd0: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
3fe0: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
3ff0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
4000: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4010: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
4020: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  n(sqlite3 *db, F
4030: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
4040: 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66   if( ALWAYS(pDef
4050: 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  ) && (pDef->flag
4060: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4070: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
4080: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4090: 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a  b, pDef);.  }.}.
40a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
40b0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
40c0: 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e  ite3 *, Op *, in
40d0: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  t);../*.** Delet
40e0: 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20  e a P4 value if 
40f0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74  necessary..*/.st
4100: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34  atic void freeP4
4110: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4120: 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a  t p4type, void *
4130: 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b  p4){.  if( p4 ){
4140: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20  .    assert( db 
4150: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  );.    switch( p
4160: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  4type ){.      c
4170: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
4180: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
4190: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
41a0: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63  DYNAMIC:.      c
41b0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a  ase P4_KEYINFO:.
41c0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
41d0: 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61  TARRAY:.      ca
41e0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  se P4_KEYINFO_HA
41f0: 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20  NDOFF: {.       
4200: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4210: 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20  b, p4);.        
4220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4230: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52       case P4_MPR
4240: 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  INTF: {.        
4250: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
4260: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
4270: 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20  3_free(p4);.    
4280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4290: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
42a0: 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20  _VDBEFUNC: {.   
42b0: 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70       VdbeFunc *p
42c0: 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65  VdbeFunc = (Vdbe
42d0: 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20  Func *)p4;.     
42e0: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
42f0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64  Function(db, pVd
4300: 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a  beFunc->pFunc);.
4310: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
4320: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
4330: 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
4340: 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65  eteAuxData(pVdbe
4350: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  Func, 0);.      
4360: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4370: 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a  db, pVdbeFunc);.
4380: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
43a0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
43b0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
43c0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
43d0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
43e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
43f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4400: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
4410: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4420: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4430: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4440: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
4450: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
4460: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4470: 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20           Mem *p 
4480: 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20  = (Mem*)p4;.    
4490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
44a0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
44b0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
44c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
44d0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
44e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
44f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4500: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
4510: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4520: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4530: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
4540: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
4550: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4560: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
4580: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
4590: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
45a0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
45b0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
45c0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
45d0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
45e0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
45f0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
4600: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
4610: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
4620: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
4630: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
4640: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
4650: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
4660: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
4670: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
4680: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
4690: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
46a0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
46b0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
46c0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
46d0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73  TE_DEBUG.      s
46e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
46f0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
4700: 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20  .#endif     .   
4710: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4720: 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b  DbFree(db, aOp);
4730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74  .}../*.** Link t
4740: 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62  he SubProgram ob
4750: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
4760: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4770: 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  nt into the link
4780: 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64  ed.** list at Vd
4790: 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20  be.pSubProgram. 
47a0: 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65  This list is use
47b0: 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  d to delete all 
47c0: 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f  sub-program.** o
47d0: 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20  bjects when the 
47e0: 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  VM is no longer 
47f0: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69  required..*/.voi
4800: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e  d sqlite3VdbeLin
4810: 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65  kSubProgram(Vdbe
4820: 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67   *pVdbe, SubProg
4830: 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e  ram *p){.  p->pN
4840: 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72  ext = pVdbe->pPr
4850: 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e  ogram;.  pVdbe->
4860: 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a  pProgram = p;.}.
4870: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20  ./*.** Change N 
4880: 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67  opcodes starting
4890: 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f   at addr to No-o
48a0: 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ps..*/.void sqli
48b0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
48c0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
48d0: 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20   addr, int N){. 
48e0: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
48f0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
4900: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4910: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4920: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69  = p->db;.    whi
4930: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20  le( N-- ){.     
4940: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
4950: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
4960: 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  .p);.      memse
4970: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
4980: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20  (pOp[0]));.     
4990: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
49a0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f  P_Noop;.      pO
49b0: 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p++;.    }.  }.}
49c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
49d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
49e0: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
49f0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4a00: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
4a10: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
4a20: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
4a30: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
4a40: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
4a50: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
4a60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
4a70: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
4a80: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
4a90: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
4aa0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
4ab0: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
4ac0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
4ad0: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
4ae0: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
4af0: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
4b00: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
4b10: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4b20: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4b30: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
4b40: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
4b50: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
4b60: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
4b70: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
4b80: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
4b90: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
4ba0: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
4bb0: 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45  *.** If n==P4_KE
4bc0: 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74  YINFO it means t
4bd0: 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69  hat zP4 is a poi
4be0: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
4bf0: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  o structure..** 
4c00: 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
4c10: 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  f the KeyInfo st
4c20: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d  ructure into mem
4c30: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4c40: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
4c50: 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64  loc, to be freed
4c60: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
4c70: 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  s finalized..** 
4c80: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P4_KEYINFO_HA
4c90: 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20  NDOFF indicates 
4ca0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20  that zP4 points 
4cb0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
4cc0: 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64  ucture.** stored
4cd0: 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   in memory that 
4ce0: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
4cf0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4d00: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65  ite3_malloc. The
4d10: 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75   .** caller shou
4d20: 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20  ld not free the 
4d30: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77  allocation, it w
4d40: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65  ill be freed whe
4d50: 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a  n the Vdbe is.**
4d60: 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a   finalized..** .
4d70: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
4d80: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
4d90: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
4da0: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
4db0: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
4dc0: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
4dd0: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
4de0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
4df0: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
4e00: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
4e10: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
4e20: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
4e30: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
4e40: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
4e50: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
4e60: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
4e70: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
4e80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
4e90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4ea0: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
4eb0: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
4ec0: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
4ed0: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
4ee0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
4ef0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4f00: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
4f10: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4f20: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4f30: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
4f40: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
4f50: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
4f60: 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46  f ( n!=P4_KEYINF
4f70: 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  O && n!=P4_VTAB 
4f80: 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  ) {.      freeP4
4f90: 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a  (db, n, (void*)*
4fa0: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
4fb0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b     }.    return;
4fc0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4fd0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
4fe0: 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  ert( addr<p->nOp
4ff0: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
5000: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
5010: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
5020: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
5030: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64  ddr];.  freeP4(d
5040: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
5050: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f  pOp->p4.p);.  pO
5060: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69  p->p4.p = 0;.  i
5070: 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29  f( n==P4_INT32 )
5080: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74  {.    /* Note: t
5090: 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65  his cast is safe
50a0: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72  , because the or
50b0: 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20  igin data point 
50c0: 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a  was an int.    *
50d0: 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20  * that was cast 
50e0: 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72  to a (const char
50f0: 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d   *). */.    pOp-
5100: 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50  >p4.i = SQLITE_P
5110: 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a  TR_TO_INT(zP4);.
5120: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5130: 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65  = P4_INT32;.  }e
5140: 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29  lse if( zP4==0 )
5150: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5160: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
5170: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
5180: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  D;.  }else if( n
5190: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a  ==P4_KEYINFO ){.
51a0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
51b0: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e  yInfo;.    int n
51c0: 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20  Field, nByte;.. 
51d0: 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65     nField = ((Ke
51e0: 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69  yInfo*)zP4)->nFi
51f0: 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  eld;.    nByte =
5200: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
5210: 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a  o) + (nField-1)*
5220: 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d  sizeof(pKeyInfo-
5230: 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69  >aColl[0]) + nFi
5240: 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  eld;.    pKeyInf
5250: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
5260: 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74 65 29  locRaw(0, nByte)
5270: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b  ;.    pOp->p4.pK
5280: 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
5290: 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  o;.    if( pKeyI
52a0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20  nfo ){.      u8 
52b0: 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  *aSortOrder;.   
52c0: 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a     memcpy((char*
52d0: 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20  )pKeyInfo, zP4, 
52e0: 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b  nByte - nField);
52f0: 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65  .      aSortOrde
5300: 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  r = pKeyInfo->aS
5310: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
5320: 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29  if( aSortOrder )
5330: 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  {.        pKeyIn
5340: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
5350: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
5360: 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  )&pKeyInfo->aCol
5370: 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  l[nField];.     
5380: 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e     memcpy(pKeyIn
5390: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  fo->aSortOrder, 
53a0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65  aSortOrder, nFie
53b0: 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
53c0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
53d0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20   P4_KEYINFO;.   
53e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
53f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5400: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70  d = 1;.      pOp
5410: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
5420: 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  TUSED;.    }.  }
5430: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5440: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29  EYINFO_HANDOFF )
5450: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5460: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5470: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5480: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P4_KEYINFO;.  }e
5490: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54  lse if( n==P4_VT
54a0: 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  AB ){.    pOp->p
54b0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
54c0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
54d0: 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20  e = P4_VTAB;.   
54e0: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
54f0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b  ((VTable *)zP4);
5500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56  .    assert( ((V
5510: 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62  Table *)zP4)->db
5520: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c  ==p->db );.  }el
5530: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
5540: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5550: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5560: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
5570: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
5580: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
5590: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
55a0: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
55b0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
55c0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
55d0: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
55e0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
55f0: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
5600: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
5610: 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  UG./*.** Change 
5620: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
5630: 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  he the most rece
5640: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
5650: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
5660: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
5670: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
5680: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
5690: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
56a0: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
56b0: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
56c0: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
56d0: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
56e0: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
56f0: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
5700: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
5710: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
5720: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
5730: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
5740: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
5750: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
5760: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rn;.  assert( p-
5770: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
5780: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5790: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
57a0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
57b0: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
57c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
57d0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
57e0: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  p ){.    char **
57f0: 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  pz = &p->aOp[p->
5800: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b  nOp-1].zComment;
5810: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
5820: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
5830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
5840: 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a  >db, *pz);.    *
5850: 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  pz = sqlite3VMPr
5860: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
5870: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5880: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5890: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
58a0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
58b0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
58c0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
58d0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
58e0: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
58f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5900: 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(p, OP_Noop)
5910: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
5920: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
5930: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5940: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
5950: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5960: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
5970: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5980: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5990: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
59a0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
59b0: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
59c0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
59d0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
59e0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
59f0: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  b, *pz);.    *pz
5a00: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
5a10: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
5a20: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
5a30: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
5a40: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
5a50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
5a60: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
5a70: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
5a80: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
5a90: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
5aa0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
5ab0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
5ac0: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
5ad0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
5ae0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
5af0: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
5b00: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
5b10: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
5b20: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
5b30: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
5b40: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
5b50: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
5b60: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
5b70: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
5b80: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
5b90: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
5ba0: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
5bb0: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
5bc0: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
5bd0: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
5be0: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
5bf0: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f  ng.** after a OO
5c00: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
5c10: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
5c20: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
5c30: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
5c40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
5c50: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
5c60: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
5c70: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
5c80: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
5c90: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
5ca0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
5cb0: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
5cc0: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
5cd0: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
5ce0: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a  h Valgrind..**.*
5cf0: 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66 64  * About the #ifd
5d00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
5d10: 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c  RACE:  Normally,
5d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5d30: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a   never called.**
5d40: 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30   unless p->nOp>0
5d50: 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75  .  This is becau
5d60: 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73  se in the absens
5d70: 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
5d80: 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50  _TRACE,.** an OP
5d90: 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74 69  _Trace instructi
5da0: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73  on is always ins
5db0: 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  erted by sqlite3
5dc0: 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f  VdbeGet() as soo
5dd0: 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44  n as.** a new VD
5de0: 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  BE is created.  
5df0: 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20 74  So we are free t
5e00: 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d  o set addr to p-
5e10: 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a  >nOp-1 without.*
5e20: 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62  * having to doub
5e30: 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  le-check to make
5e40: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
5e50: 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67  esult is non-neg
5e60: 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66  ative. But.** if
5e70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5e80: 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  CE is defined, t
5e90: 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f  he OP_Trace is o
5ea0: 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f  mitted and we do
5eb0: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63   need to.** chec
5ec0: 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  k the value of p
5ed0: 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63  ->nOp-1 before c
5ee0: 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64  ontinuing..*/.Vd
5ef0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
5f00: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
5f10: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
5f20: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
5f30: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
5f40: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
5f50: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
5f60: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
5f70: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
5f80: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
5f90: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
5fa0: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
5fb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
5fc0: 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67  Op dummy;  /* Ig
5fd0: 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61  nore the MSVC wa
5fe0: 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69  rning about no i
5ff0: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20  nitializer */.  
6000: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
6010: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
6020: 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  T );.  if( addr<
6030: 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
6040: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
6050: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20    if( p->nOp==0 
6060: 29 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70  ) return (VdbeOp
6070: 2a 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66  *)&dummy;.#endif
6080: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
6090: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
60a0: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
60b0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
60c0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
60d0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
60e0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
60f0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
6100: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
6110: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6120: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
6130: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
6140: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6150: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c  OMIT_EXPLAIN) ||
6160: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
6170: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
6180: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
6190: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
61a0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
61b0: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
61c0: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
61d0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
61e0: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
61f0: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
6200: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
6210: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
6220: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
6230: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
6240: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
6250: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
6260: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
6270: 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74   zTemp;.  assert
6280: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
6290: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
62a0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
62b0: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
62c0: 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  IC:.    case P4_
62d0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
62e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
62f0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
6300: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
6310: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c  yInfo;.      sql
6320: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6330: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79  emp, zTemp, "key
6340: 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e  info(%d", pKeyIn
6350: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
6360: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
6370: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
6380: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
6390: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
63a0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
63b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
63c0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
63d0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
63e0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
63f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
6400: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
6410: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
6420: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
6430: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
6440: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
6450: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
6460: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6470: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
6480: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
6490: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
64a0: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
64b0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
64c0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
64d0: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
64e0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
64f0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
6500: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6510: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
6520: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
6530: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
6540: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
6550: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
6560: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
6570: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6580: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
6590: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
65a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65b0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
65c0: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
65d0: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
65e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
65f0: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
6600: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6610: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
6620: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
6630: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
6640: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
6650: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6660: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
6670: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
6680: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
6690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
66a0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
66b0: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
66c0: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
66d0: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
66e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
66f0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6700: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
6710: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
6720: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
6730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6740: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
6750: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6760: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6770: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
6780: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
6790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
67a0: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
67b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
67c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
67d0: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
67e0: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
67f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6800: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
6810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6820: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6830: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
6840: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
6850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6860: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
6870: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
6880: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
6890: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
68a0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
68b0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
68c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
68d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
68e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
68f0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
6900: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
6910: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
6920: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
6930: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6940: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
6950: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
6960: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6970: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6980: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
6990: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
69a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
69b0: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
69c0: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
69d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
69e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
69f0: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
6a00: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
6a10: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
6a20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
6a30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6a40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
6a50: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
6a60: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6a70: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
6a80: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
6a90: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
6aa0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6ab0: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
6ac0: 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70  %p:%p", pVtab, p
6ad0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a  Vtab->pModule);.
6ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6af0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
6b00: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
6b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6b20: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6b30: 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79  zTemp, "intarray
6b40: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
6b50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6b60: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b  P4_SUBPROGRAM: {
6b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6b80: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6b90: 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29  Temp, "program")
6ba0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6bb0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
6bc0: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
6bd0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
6be0: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
6bf0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
6c00: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
6c10: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
6c20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
6c30: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
6c40: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
6c50: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
6c60: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
6c70: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
6c80: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
6c90: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
6ca0: 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65  *.** The prepare
6cb0: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65  d statements nee
6cc0: 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76  d to know in adv
6cd0: 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  ance the complet
6ce0: 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61  e set of.** atta
6cf0: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
6d00: 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
6d10: 20 75 73 69 6e 67 2e 20 20 41 20 6d 61 73 6b 20   using.  A mask 
6d20: 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73  of these databas
6d30: 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69  es.** is maintai
6d40: 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  ned in p->btreeM
6d50: 61 73 6b 20 61 6e 64 20 69 73 20 75 73 65 64 20  ask and is used 
6d60: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 61 6e 64 20  for locking and 
6d70: 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a  other purposes..
6d80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6d90: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
6da0: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
6db0: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
6dc0: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
6dd0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
6de0: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
6df0: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
6e00: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
6e10: 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65  )*8 );.  p->btre
6e20: 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61  eMask |= ((yDbMa
6e30: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20  sk)1)<<i;.  if( 
6e40: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
6e50: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
6e60: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
6e70: 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61  ){.    p->lockMa
6e80: 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29  sk |= ((yDbMask)
6e90: 31 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  1)<<i;.  }.}..#i
6ea0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6eb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
6ec0: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
6ed0: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
6ee0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
6ef0: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
6f00: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
6f10: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
6f20: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
6f30: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
6f40: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
6f50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
6f60: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
6f70: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
6f80: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
6f90: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
6fa0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
6fb0: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
6fc0: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
6fd0: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
6fe0: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
6ff0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
7000: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
7010: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
7020: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
7030: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
7040: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
7050: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
7060: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
7070: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
7080: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
7090: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
70a0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
70b0: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
70c0: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
70d0: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
70e0: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
70f0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
7100: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
7110: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
7120: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
7130: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
7140: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
7150: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
7160: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
7170: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
7180: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
7190: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
71a0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
71b0: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
71c0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
71d0: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
71e0: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
71f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
7200: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
7210: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
7220: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
7230: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
7240: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
7250: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
7260: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
7270: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
7280: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
7290: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
72a0: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
72b0: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
72c0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
72d0: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
72e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
72f0: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
7300: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
7310: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7320: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
7330: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
7340: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
7350: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
7360: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7370: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
7380: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
7390: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
73a0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
73b0: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
73c0: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
73d0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
73e0: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
73f0: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
7400: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
7410: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7420: 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62  e3BtreeEnter(aDb
7430: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7440: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
7450: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7460: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
7470: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
7480: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
7490: 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20  * Unlock all of 
74a0: 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69  the btrees previ
74b0: 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20  ously locked by 
74c0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
74d0: 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f  3VdbeEnter()..*/
74e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
74f0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
7500: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d  .  int i;.  yDbM
7510: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69  ask mask;.  sqli
7520: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
7530: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
7540: 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   if( p->lockMask
7550: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
7560: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7570: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
7580: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
7590: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
75a0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  nDb;.  for(i=0, 
75b0: 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69  mask=1; i<nDb; i
75c0: 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b  ++, mask += mask
75d0: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
75e0: 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f  && (mask & p->lo
75f0: 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c  ckMask)!=0 && AL
7600: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
7610: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
7620: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61  ite3BtreeLeave(a
7630: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
7640: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
7650: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
7660: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
7670: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
7680: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
7690: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
76a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
76b0: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
76c0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
76d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
76e0: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
76f0: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
7700: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
7710: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
7720: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
7730: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
7740: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
7750: 25 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32  %4d %4d %-4s %.2
7760: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
7770: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
7780: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
7790: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
77a0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
77b0: 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f  ));.  fprintf(pO
77c0: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
77d0: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
77e0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
77f0: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
7800: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
7810: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
7820: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
7830: 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d  DEBUG.      pOp-
7840: 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d  >zComment ? pOp-
7850: 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23  >zComment : "".#
7860: 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65  else.      "".#e
7870: 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75  ndif.  );.  fflu
7880: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
7890: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
78a0: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
78b0: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
78c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
78d0: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
78e0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
78f0: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
7900: 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73  Mem *pEnd;.    s
7910: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
7920: 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f  db;.    u8 mallo
7930: 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  c_failed = db->m
7940: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
7950: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
7960: 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66  Freed ){.      f
7970: 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70  or(pEnd=&p[N]; p
7980: 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20  <pEnd; p++){.   
7990: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
79a0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
79b0: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
79c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
79d0: 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b      for(pEnd=&p[
79e0: 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  N]; p<pEnd; p++)
79f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7a00: 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c  (&p[1])==pEnd ||
7a10: 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64   p[0].db==p[1].d
7a20: 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  b );..      /* T
7a30: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
7a40: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
7a50: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
7a60: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
7a70: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
7a80: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
7a90: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
7aa0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
7ab0: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
7ac0: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
7ad0: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
7ae0: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
7af0: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
7b00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
7b10: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
7b20: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
7b30: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
7b40: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
7b50: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
7b60: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
7b70: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
7b80: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
7b90: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
7ba0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
7bb0: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
7bc0: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
7bd0: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
7be0: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
7bf0: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
7c00: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
7c10: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
7c20: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
7c30: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
7c40: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
7c50: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
7c60: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
7c70: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
7c80: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
7c90: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
7ca0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
7cb0: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
7cc0: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
7cd0: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
7ce0: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
7cf0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
7d00: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
7d10: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
7d20: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
7d30: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
7d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
7d50: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
7d60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
7d70: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
7d80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7d90: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7da0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61  ;.        p->zMa
7db0: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
7dc0: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
7dd0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
7de0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c    }.    db->mall
7df0: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
7e00: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
7e10: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
7e20: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
7e30: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
7e40: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
7e50: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
7e60: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
7e70: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
7e80: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
7e90: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
7ea0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
7eb0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
7ec0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
7ed0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
7ee0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
7ef0: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
7f00: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
7f10: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
7f20: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
7f30: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
7f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
7f50: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
7f60: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
7f70: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
7f80: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
7f90: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
7fa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
7fb0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
7fc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7fd0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
7fe0: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
7ff0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
8000: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
8010: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
8020: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
8030: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
8040: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
8050: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
8060: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
8070: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
8080: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
8090: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
80a0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
80b0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
80c0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
80d0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
80e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
80f0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
8100: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
8110: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
8120: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
8130: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
8140: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
8150: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
8160: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
8170: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
8180: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
8190: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
81a0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
81b0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
81c0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
81d0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
81e0: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
81f0: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
8200: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
8210: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
8220: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
8230: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
8240: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
8270: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
82a0: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
82b0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
82c0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
82d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
82e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
82f0: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
8300: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
8310: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
8320: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
8330: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
8340: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
8350: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
8380: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
8390: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
83a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
83b0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
83c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
83d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
83e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8410: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8420: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8430: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
8440: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
8450: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
8460: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
8470: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
8480: 3b 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20  ;  /* First Mem 
8490: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
84a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
84b0: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
84c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
84d0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
84e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
84f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
8500: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
8510: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
8520: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
8530: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
8540: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
8550: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
8560: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
8570: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
8580: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
8590: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
85a0: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
85b0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
85c0: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
85d0: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
85e0: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
85f0: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
8600: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
8610: 65 6d 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20 70  em, 8);..  if( p
8620: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
8630: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
8640: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
8650: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
8660: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8670: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
8680: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
8690: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
86a0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
86b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
86c0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
86d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
86e0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
86f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
8700: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
8710: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
8720: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
8730: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
8740: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
8750: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
8760: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
8770: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
8780: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
8790: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
87a0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
87b0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
87c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
87d0: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
87e0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
87f0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
8800: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
8810: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
8820: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
8830: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
8840: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
8850: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
8860: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
8870: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
8880: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
8890: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
88a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
88b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
88c0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
88d0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
88e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
88f0: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
8900: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
8910: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
8920: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
8930: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
8940: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
8950: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
8960: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
8970: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
8980: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
8990: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
89a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
89b0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
89c0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
89d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
89e0: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
89f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
8a00: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
8a10: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
8a20: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
8a30: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
8a40: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
8a50: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
8a60: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
8a70: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
8a80: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
8a90: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
8aa0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
8ab0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
8ac0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
8ad0: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
8ae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
8af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
8b00: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
8b10: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
8b20: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
8b30: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
8b40: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
8b50: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
8b60: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
8b70: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
8b80: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
8b90: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
8ba0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
8bb0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
8bc0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
8bd0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
8be0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8bf0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
8c00: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
8c10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
8c20: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
8c30: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
8c40: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
8c50: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
8c60: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f    char *z;.    O
8c70: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20  p *pOp;.    if( 
8c80: 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  i<p->nOp ){.    
8c90: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
8ca0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73  line number is s
8cb0: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74  mall enough that
8cc0: 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e   we are still in
8cd0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61   the.      ** ma
8ce0: 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  in program. */. 
8cf0: 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61       pOp = &p->a
8d00: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  Op[i];.    }else
8d10: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72  {.      /* We ar
8d20: 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74  e currently list
8d30: 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ing subprograms.
8d40: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
8d50: 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20  ch one and.     
8d60: 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20   ** pick up the 
8d70: 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f  appropriate opco
8d80: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  de. */.      int
8d90: 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70   j;.      i -= p
8da0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72  ->nOp;.      for
8db0: 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a  (j=0; i>=apSub[j
8dc0: 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20  ]->nOp; j++){.  
8dd0: 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62        i -= apSub
8de0: 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  [j]->nOp;.      
8df0: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
8e00: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
8e10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8e20: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
8e30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
8e40: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
8e50: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
8e60: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
8e70: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
8e80: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
8eb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
8ec0: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
8ed0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
8ee0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
8ef0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
8f00: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
8f10: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
8f20: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
8f30: 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  );  /* Opcode */
8f40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8f50: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
8f60: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
8f70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
8f80: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
8f90: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8fa0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
8fb0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
8fc0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
8fd0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  ++;..      /* Wh
8fe0: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
8ff0: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
9000: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
9010: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
9020: 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42       ** a P4_SUB
9030: 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74  PROGRAM argument
9040: 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69  ), expand the si
9050: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
9060: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20  of subprograms. 
9070: 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20       ** kept in 
9080: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
9090: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
90a0: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
90b0: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
90c0: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74        ** has not
90d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
90e0: 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  en..      */.   
90f0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
9100: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
9110: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
9120: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31   nByte = (nSub+1
9130: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
9140: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69  ram*);.        i
9150: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
9160: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a  r(j=0; j<nSub; j
9170: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
9180: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
9190: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
91a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
91b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
91c0: 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f  nSub && SQLITE_O
91d0: 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65  K==sqlite3VdbeMe
91e0: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
91f0: 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  e, 1) ){.       
9200: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
9210: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
9220: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
9230: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
9240: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
9250: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
9260: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
9270: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
9280: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
9290: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
92a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
92b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
92c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
92d0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
92e0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
9310: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9320: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
9330: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
9340: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
9350: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
9360: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
9390: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
93a0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
93b0: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
93c0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
93d0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
93e0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
93f0: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9410: 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P3 */.    pMem-
9420: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
9430: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
9440: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  ++;..    if( sql
9450: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9460: 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20  pMem, 32, 0) ){ 
9470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34             /* P4
9480: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9490: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
94a0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
94b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
94c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  OR;.    }.    pM
94d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
94e0: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
94f0: 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69  Term;.    z = di
9500: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
9510: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
9520: 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b  f( z!=pMem->z ){
9530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9540: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
9550: 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
9560: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
9570: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9580: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
9590: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
95a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
95b0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
95c0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
95d0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
95e0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
95f0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
9600: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
9610: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
9620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
9630: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
9640: 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a  (pMem, 4, 0) ){.
9650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9660: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
9670: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
9680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
9690: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
96a0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
96b0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
96c0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
96d0: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
96e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
96f0: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
9700: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
9710: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
9720: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9730: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9740: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
9750: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
9760: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
9770: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9780: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
9790: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
97a0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
97b0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
97c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
97d0: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ->z = pOp->zComm
97e0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  ent;.        pMe
97f0: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
9800: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
9810: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
9820: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
9830: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
9840: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
9850: 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  XT;.      }else.
9860: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
9870: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
9880: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
98b0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  */.        pMem-
98c0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
98d0: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
98e0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
98f0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
9900: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
9910: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
9920: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
9930: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
9940: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
9950: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9960: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
9970: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9980: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
9990: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
99a0: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
99b0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
99c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
99d0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
99e0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
99f0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
9a00: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
9a10: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
9a20: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
9a30: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
9a40: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
9a50: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
9a60: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
9a70: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  r *z = pOp->p4.z
9a80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
9a90: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
9aa0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74  ) z++;.    print
9ab0: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
9ac0: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9ad0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
9af0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
9b00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
9b10: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
9b20: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
9b30: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
9b40: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
9b50: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
9b60: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
9b70: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
9b80: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
9b90: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
9ba0: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
9bb0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
9bc0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9bd0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9be0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9bf0: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9c00: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9c10: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
9c20: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
9c30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9c40: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
9c50: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
9c60: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
9c70: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
9c80: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
9c90: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
9ca0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9cb0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
9cc0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
9cd0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
9ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
9cf0: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
9d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
9d10: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
9d20: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
9d30: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
9d40: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
9d50: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
9d60: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
9d70: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9d80: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
9d90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
9da0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  RACE */../*.** A
9db0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72  llocate space fr
9dc0: 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20  om a fixed size 
9dd0: 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72  buffer and retur
9de0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
9df0: 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49  * that space.  I
9e00: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  f insufficient s
9e10: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
9e20: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
9e30: 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70  **.** The pBuf p
9e40: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
9e50: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
9e60: 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68   a pointer which
9e70: 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65   will.** receive
9e80: 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   the new memory.
9e90: 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c    pBuf is normal
9ea0: 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75  ly NULL.  If pBu
9eb0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
9ec0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
9ed0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73  memory space has
9ee0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
9ef0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74  located and that
9f00: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
9f10: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f   should not allo
9f20: 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d  cate any new mem
9f30: 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20  ory.  When pBuf 
9f40: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73  is not.** NULL s
9f50: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75  imply return pBu
9f60: 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74  f.  Only allocat
9f70: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61  e new memory spa
9f80: 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20  ce when pBuf.** 
9f90: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e  is NULL..**.** n
9fa0: 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Byte is the numb
9fb0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
9fc0: 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  pace needed..**.
9fd0: 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74  ** *ppFrom point
9fe0: 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  s to available s
9ff0: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
a000: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
a010: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
a020: 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e  ble space.  When
a030: 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   space is alloca
a040: 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20  ted, *ppFrom is 
a050: 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a  advanced past.**
a060: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a070: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
a080: 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69  .**.** *pnByte i
a090: 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  s a counter of t
a0a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a0b0: 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74  es of space that
a0c0: 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20   have failed.** 
a0d0: 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66  to allocate.  If
a0e0: 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66   there is insuff
a0f0: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20  icient space in 
a100: 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73  *ppFrom to satis
a110: 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  fy the.** reques
a120: 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  t, then incremen
a130: 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65  t *pnByte by the
a140: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72   amount of the r
a150: 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  equest..*/.stati
a160: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
a170: 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  ce(.  void *pBuf
a180: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
a190: 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  ere return point
a1a0: 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  er will be store
a1b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
a1c0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
a1d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
a1e0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
a1f0: 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20  u8 **ppFrom,    
a200: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
a210: 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70  Allocate from *p
a220: 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70  pFrom */.  u8 *p
a230: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
a240: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
a250: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
a260: 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66  d of *ppFrom buf
a270: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
a280: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Byte          /*
a290: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
a2a0: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
a2b0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
a2c0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
a2d0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
a2e0: 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29  NMENT(*ppFrom) )
a2f0: 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72  ;.  if( pBuf ) r
a300: 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42  eturn pBuf;.  nB
a310: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
a320: 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70  te);.  if( &(*pp
a330: 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20  From)[nByte] <= 
a340: 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66  pEnd ){.    pBuf
a350: 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f   = (void*)*ppFro
a360: 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b  m;.    *ppFrom +
a370: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65  = nByte;.  }else
a380: 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d  {.    *pnByte +=
a390: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
a3a0: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
a3b0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
a3c0: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
a3d0: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
a3e0: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
a3f0: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
a400: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
a410: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
a420: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
a430: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
a440: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
a450: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
a460: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
a470: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
a480: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
a490: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
a4a0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
a4b0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a4c0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
a4d0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
a4e0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
a4f0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
a500: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
a510: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
a520: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
a530: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
a540: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
a550: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31  _DEBUG.  for(i=1
a560: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
a570: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a580: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
a590: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
a5a0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
a5b0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
a5c0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
a5d0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
a5e0: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
a5f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
a600: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
a610: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
a620: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
a630: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
a640: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
a650: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
a660: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
a670: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
a680: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
a690: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
a6a0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
a6b0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
a6c0: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
a6d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
a6e0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
a6f0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
a700: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
a710: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
a720: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
a730: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
a740: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
a750: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
a760: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
a770: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
a780: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
a790: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
a7a0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
a7b0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
a7c0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
a7d0: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
a7e0: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
a7f0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
a800: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
a810: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
a820: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
a830: 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20   once on a each 
a840: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
a850: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
a860: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a870: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
a880: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
a890: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
a8a0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
a8b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a8c0: 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20  d, futher calls 
a8d0: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
a8e0: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
a8f0: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
a900: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
a910: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
a920: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
a930: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
a940: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
a950: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
a960: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
a970: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
a980: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
a990: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
a9a0: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
a9b0: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
a9c0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
a9d0: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
a9e0: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
a9f0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
aa00: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
aa10: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
aa20: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
aa30: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
aa40: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
aa50: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
aa80: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
aa90: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
aaa0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
aab0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
aac0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aae0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
aaf0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
ab00: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab20: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
ab30: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
ab40: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
ab50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ab60: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
ab70: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
ab80: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aba0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
abb0: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
abc0: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
abf0: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
ac00: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
ac10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
ac30: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
ac40: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac60: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
ac70: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
ac80: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
acb0: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
acc0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
acd0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
acf0: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
ad00: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
ad10: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
ad20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ad30: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
ad40: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
ad50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ad60: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
ad70: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 64 62 20 3d  C_INIT );.  db =
ad80: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
ad90: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ada0: 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
adb0: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
adc0: 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
add0: 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
ade0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
adf0: 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
ae00: 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20  ->nMaxArg;.  .  
ae10: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
ae20: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
ae30: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
ae40: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
ae50: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
ae60: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
ae70: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
ae80: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
ae90: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
aea0: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
aeb0: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
aec0: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
aed0: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62  ace for.  ** Vdb
aee0: 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72  eCursor/BtCursor
aef0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
af00: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
af10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
af20: 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69  .  ** cursor 0 i
af30: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
af40: 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65  ry cell nMem. Me
af50: 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d  mory cell (nMem-
af60: 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  1).  ** stores t
af70: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
af80: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
af90: 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e  h cursor 1, etc.
afa0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
afb0: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
afc0: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
afd0: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a  em += nCursor;..
afe0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
aff0: 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72  ace for memory r
b000: 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61  egisters, SQL va
b010: 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75  riables, VDBE cu
b020: 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20  rsors and .  ** 
b030: 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73  an array to mars
b040: 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  hal SQL function
b050: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20   arguments in.. 
b060: 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38   */.  zCsr = (u8
b070: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  *)&p->aOp[p->nOp
b080: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f  ];       /* Memo
b090: 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72  ry avaliable for
b0a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
b0b0: 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d   zEnd = (u8*)&p-
b0c0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  >aOp[p->nOpAlloc
b0d0: 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  ];  /* First byt
b0e0: 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43  e past end of zC
b0f0: 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c  sr[] */..  resol
b100: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
b110: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
b120: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
b130: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
b140: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
b150: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
b160: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
b170: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
b180: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
b190: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73    }.  memset(zCs
b1a0: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
b1b0: 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73  ;.  zCsr += (zCs
b1c0: 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20  r - (u8*)0)&7;. 
b1d0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
b1e0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
b1f0: 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69  sr) );.  p->expi
b200: 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  red = 0;..  /* M
b210: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
b220: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
b230: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
b240: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
b250: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
b260: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
b270: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
b280: 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  se unused space 
b290: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
b2a0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
b2b0: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
b2c0: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
b2d0: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
b2e0: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
b2f0: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
b300: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
b310: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
b320: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
b330: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73   fill in the res
b340: 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  t using a fresh 
b350: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
b360: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
b370: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
b380: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
b390: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
b3a0: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
b3b0: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61  the leftover spa
b3c0: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
b3d0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
b3e0: 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e  y can significan
b3f0: 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20  tly.  ** reduce 
b400: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
b410: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
b420: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
b430: 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20  t..  */.  do {. 
b440: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
b450: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
b460: 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20  cSpace(p->aMem, 
b470: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
b480: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
b490: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
b4a0: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
b4b0: 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73  (p->aVar, nVar*s
b4c0: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
b4d0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b4e0: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d  ;.    p->apArg =
b4f0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
b500: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
b510: 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20  f(Mem*), &zCsr, 
b520: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b530: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c     p->azVar = al
b540: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61  locSpace(p->azVa
b550: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  r, nVar*sizeof(c
b560: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  har*), &zCsr, zE
b570: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b580: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
b590: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
b5a0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
b5b0: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a          &zCsr, z
b5e0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b5f0: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
b600: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
b610: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
b620: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
b630: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
b640: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a   p->pFree;.    z
b650: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
b660: 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42  e];.  }while( nB
b670: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
b680: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
b690: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36  ->nCursor = (u16
b6a0: 29 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  )nCursor;.  if( 
b6b0: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70  p->aVar ){.    p
b6c0: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
b6d0: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  nVar;.    for(n=
b6e0: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
b6f0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
b700: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
b710: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  ll;.      p->aVa
b720: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
b730: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
b740: 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  >azVar ){.    p-
b750: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >nzVar = pParse-
b760: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63  >nzVar;.    memc
b770: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61  py(p->azVar, pPa
b780: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e  rse->azVar, p->n
b790: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  zVar*sizeof(p->a
b7a0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d  zVar[0]));.    m
b7b0: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a  emset(pParse->az
b7c0: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  Var, 0, pParse->
b7d0: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61  nzVar*sizeof(pPa
b7e0: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  rse->azVar[0]));
b7f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
b800: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
b810: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
b820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
b830: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
b840: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
b850: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b870: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
b880: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
b890: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
b8a0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
b8b0: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
b8c0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
b8d0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
b8e0: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
b8f0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50   p->explain = pP
b900: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20  arse->explain;. 
b910: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
b920: 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
b930: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
b940: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
b950: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
b960: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
b970: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
b980: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
b990: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
b9a0: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
b9b0: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
b9c0: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
b9d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
b9e0: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43  lite3VdbeSorterC
b9f0: 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29  lose(p->db, pCx)
ba00: 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  ;.  if( pCx->pBt
ba10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
ba20: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
ba30: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
ba40: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
ba50: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
ba60: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
ba70: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
ba80: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
ba90: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
baa0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
bab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
bac0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
bad0: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
bae0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
baf0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
bb00: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
bb10: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
bb20: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
bb30: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
bb40: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
bb50: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
bb60: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
bb70: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
bb80: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
bb90: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
bba0: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
bbb0: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
bbc0: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
bbd0: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
bbe0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ndif.}../*.** Co
bbf0: 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  py the values st
bc00: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
bc10: 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20  Frame structure 
bc20: 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69  to its Vdbe. Thi
bc30: 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f  s.** is used, fo
bc40: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
bc50: 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72  a trigger sub-pr
bc60: 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20  ogram is halted 
bc70: 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f  to restore.** co
bc80: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69  ntrol to the mai
bc90: 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e  n program..*/.in
bca0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
bcb0: 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72  meRestore(VdbeFr
bcc0: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
bcd0: 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65  Vdbe *v = pFrame
bce0: 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  ->v;.  v->aOp = 
bcf0: 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
bd00: 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
bd10: 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
bd20: 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
bd30: 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
bd40: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
bd50: 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
bd60: 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
bd70: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
bd80: 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
bd90: 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
bda0: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
bdb0: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
bdc0: 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72  me->nChange;.  r
bdd0: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
bde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
bdf0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
be00: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
be10: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
be20: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
be30: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
be40: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
be50: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
be60: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
be70: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
be80: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
be90: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
bea0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
beb0: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
bec0: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
bed0: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
bee0: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
bef0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
bf00: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
bf10: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
bf20: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
bf30: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
bf40: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
bf50: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
bf60: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
bf70: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
bf80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
bf90: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
bfa0: 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rame);.  }.  p->
bfb0: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  pFrame = 0;.  p-
bfc0: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  >nFrame = 0;..  
bfd0: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
bfe0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
bff0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
c000: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
c010: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
c020: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
c030: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
c040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c050: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
c060: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
c070: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
c080: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c090: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
c0a0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
c0b0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
c0c0: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
c0d0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
c0e0: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
c0f0: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
c100: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
c110: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
c120: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
c130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
c140: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
c150: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
c160: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
c170: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a  fter execution..
c180: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
c190: 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ne will automati
c1a0: 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20  cally close any 
c1b0: 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20  cursors, lists, 
c1c0: 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72  and/or.** sorter
c1d0: 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74  s that were left
c1e0: 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20   open.  It also 
c1f0: 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75  deletes the valu
c200: 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c  es of.** variabl
c210: 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d  es in the aVar[]
c220: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
c230: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
c240: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
c250: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
c260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
c270: 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74  EBUG.  /* Execut
c280: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
c290: 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
c2a0: 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70  that the Vdbe.ap
c2b0: 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20  Csr[] and .  ** 
c2c0: 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61  Vdbe.aMem[] arra
c2d0: 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ys have already 
c2e0: 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e  been cleaned up.
c2f0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20    */.  int i;.  
c300: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
c310: 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
c320: 72 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20  rt( p->apCsr==0 
c330: 7c 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d  || p->apCsr[i]==
c340: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  0 );.  for(i=1; 
c350: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29  i<=p->nMem; i++)
c360: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
c370: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69  ==0 || p->aMem[i
c380: 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c  ].flags==MEM_Nul
c390: 6c 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  l );.#endif..  s
c3a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c3b0: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
c3c0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
c3d0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
c3e0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
c3f0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
c400: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
c410: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
c420: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
c430: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
c440: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
c450: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
c460: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
c470: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
c480: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
c490: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
c4a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
c4b0: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
c4c0: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
c4d0: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
c4e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
c4f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c500: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
c510: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
c520: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
c530: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
c540: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c550: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61   p->db;..  relea
c560: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
c570: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
c580: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
c590: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
c5a0: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
c5b0: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
c5c0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
c5d0: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
c5e0: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
c5f0: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
c600: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
c610: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
c620: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c630: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
c640: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
c650: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
c660: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
c670: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
c680: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
c690: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
c6a0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
c6b0: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
c6c0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
c6d0: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
c6e0: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
c6f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
c700: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
c710: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
c720: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
c730: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
c740: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
c750: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
c760: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
c770: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
c780: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
c790: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
c7a0: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
c7b0: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
c7c0: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
c7d0: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
c7e0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
c7f0: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
c800: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
c810: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c820: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
c830: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
c840: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
c850: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
c860: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
c870: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
c880: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
c890: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c8b0: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
c8c0: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
c8d0: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8f0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
c900: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
c910: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
c940: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
c950: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
c960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c980: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
c990: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
c9a0: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
c9b0: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
c9c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
c9d0: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
c9e0: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
c9f0: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
ca00: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
ca10: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
ca20: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
ca30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
ca40: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
ca50: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
ca60: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
ca70: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
ca80: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
ca90: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
caa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
cab0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
cac0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
cad0: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
cae0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
caf0: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
cb00: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
cb10: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
cb20: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
cb30: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
cb40: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
cb50: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
cb60: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
cb70: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
cb80: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
cb90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
cba0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
cbb0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
cbc0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
cbd0: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
cbe0: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
cbf0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
cc00: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
cc10: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
cc20: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
cc30: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
cc40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
cc50: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
cc60: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
cc70: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
cc80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
cc90: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
cca0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
ccb0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
ccc0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
ccd0: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
cce0: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
ccf0: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
cd00: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
cd10: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
cd20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cd30: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
cd40: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
cd50: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
cd60: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
cd70: 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
cd80: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
cd90: 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
cda0: 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
cdb0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
cdc0: 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
cdd0: 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
cde0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
cdf0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
ce00: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
ce10: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
ce20: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
ce30: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
ce40: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
ce50: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
ce60: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
ce70: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
ce80: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
ce90: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
cea0: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
ceb0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
cec0: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
ced0: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
cee0: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
cef0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
cf00: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
cf10: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
cf20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
cf30: 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a  abSync(db, &p->z
cf40: 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20 54  ErrMsg);..  /* T
cf50: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
cf60: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
cf70: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
cf80: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
cf90: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
cfa0: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
cfb0: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
cfc0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
cfd0: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
cfe0: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
cff0: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
d000: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
d010: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
d020: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
d030: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
d040: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
d050: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
d060: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
d070: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
d080: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
d090: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
d0a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d0b0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d0c0: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
d0d0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
d0e0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
d0f0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
d100: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
d110: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
d120: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
d130: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
d140: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d150: 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
d160: 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ck(sqlite3BtreeP
d170: 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
d180: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  }.  }.  if( rc!=
d190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d1a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d1b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
d1c0: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
d1d0: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
d1e0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
d1f0: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
d200: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
d210: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d220: 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  back ){.    rc =
d230: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d240: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
d250: 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Arg);.    if( rc
d260: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d270: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
d280: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NT;.    }.  }.. 
d290: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
d2a0: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
d2b0: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
d2c0: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
d2d0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
d2e0: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
d2f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
d300: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
d310: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
d320: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d330: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
d340: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
d350: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
d360: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
d370: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
d380: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
d390: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
d3a0: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
d3b0: 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
d3c0: 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
d3d0: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
d3e0: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
d3f0: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
d400: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
d410: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
d420: 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
d430: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
d440: 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
d450: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
d460: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
d470: 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
d480: 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
d490: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
d4a0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
d4b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
d4c0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d4d0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d4e0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
d4f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d500: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d510: 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
d520: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d530: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
d540: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
d550: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
d560: 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
d570: 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
d580: 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
d590: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
d5a0: 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
d5b0: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
d5c0: 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
d5d0: 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
d5e0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
d5f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
d600: 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
d610: 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
d620: 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
d630: 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
d640: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
d650: 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
d660: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
d670: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d680: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
d690: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
d6a0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
d6b0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
d6c0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
d6d0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d6e0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
d6f0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
d700: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
d710: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d720: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
d730: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
d740: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
d750: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
d760: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
d770: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
d780: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
d790: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
d7a0: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
d7b0: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
d7c0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
d7d0: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
d7e0: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
d7f0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
d800: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
d810: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
d820: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
d830: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
d840: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
d850: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
d860: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
d870: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
d880: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
d890: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
d8a0: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
d8b0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
d8c0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
d8d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
d8e0: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
d8f0: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
d900: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
d910: 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  s;..    /* Selec
d920: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
d930: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
d940: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
d950: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
d960: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d970: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
d980: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
d990: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
d9a0: 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
d9b0: 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72  );.      zMaster
d9c0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d9d0: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58  f(db, "%s-mj%08X
d9e0: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52  ", zMainFile, iR
d9f0: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
da00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
da10: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
da20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
da30: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
da40: 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
da50: 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
da60: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
da70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
da80: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
da90: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
daa0: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
dab0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
dac0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dad0: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
dae0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
daf0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
db00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
db10: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
db20: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
db30: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
db40: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
db50: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
db60: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
db70: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
db80: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
db90: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
dba0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
dbb0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
dbc0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
dbd0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
dbe0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
dbf0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
dc00: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
dc10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
dc20: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
dc30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
dc40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
dc50: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
dc60: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
dc70: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
dc80: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
dc90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
dca0: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
dcb0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
dcc0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
dcd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
dce0: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
dcf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
dd00: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
dd10: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
dd20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
dd30: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
dd40: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
dd50: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
dd60: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
dd70: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
dd80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
dd90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
dda0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
ddb0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
ddc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ddd0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
dde0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
ddf0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
de00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
de10: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
de20: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
de30: 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
de40: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
de50: 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
de60: 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
de70: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
de80: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
de90: 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
dea0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
deb0: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
dec0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
ded0: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
dee0: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
def0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
df00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
df10: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
df20: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
df30: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
df40: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
df50: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
df60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
df70: 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
df80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
df90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
dfa0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
dfb0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
dfc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dfd0: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
dfe0: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
dff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e000: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
e010: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e020: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
e030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e040: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
e050: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e060: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
e070: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
e080: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
e090: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
e0a0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
e0b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
e0c0: 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d  Sync .     && 0=
e0d0: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
e0e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
e0f0: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
e100: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
e110: 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
e120: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
e130: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
e140: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
e150: 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
e160: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
e170: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
e180: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
e190: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
e1a0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
e1b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e1c0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e1d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e1e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
e1f0: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
e200: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
e210: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
e220: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
e230: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
e240: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
e250: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
e260: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
e270: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
e280: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
e290: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
e2a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e2b0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
e2c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
e2d0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
e2e0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
e2f0: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
e300: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e310: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
e320: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
e330: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
e340: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e350: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
e360: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
e370: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
e380: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
e390: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e3a0: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
e3b0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e3c0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
e3d0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
e3e0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
e3f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e400: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e410: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e420: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
e430: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e440: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e450: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e460: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e470: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e480: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
e490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e4a0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e4b0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
e4c0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
e4d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
e4e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e4f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e500: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e510: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e520: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e530: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
e540: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e550: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
e560: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
e570: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
e580: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
e590: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
e5a0: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
e5b0: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
e5c0: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
e5d0: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
e5e0: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
e5f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e600: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
e610: 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
e620: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e630: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e640: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
e650: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
e660: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e670: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
e680: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
e690: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
e6a0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
e6b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
e6c0: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
e6d0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
e6e0: 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
e6f0: 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
e700: 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
e710: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
e720: 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
e730: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
e740: 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
e750: 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
e760: 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
e770: 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
e780: 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
e790: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
e7a0: 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
e7b0: 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
e7c0: 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
e7d0: 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
e7e0: 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
e7f0: 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
e800: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
e810: 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
e820: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
e830: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
e840: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
e850: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
e860: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e870: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
e880: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
e890: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e8a0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e8b0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
e8c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
e8d0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
e8e0: 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
e8f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e900: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
e910: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
e920: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
e930: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
e940: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
e950: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
e960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e970: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
e980: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
e990: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
e9a0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
e9b0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
e9c0: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
e9d0: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
e9e0: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
e9f0: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
ea00: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
ea10: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
ea20: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
ea30: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
ea40: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
ea50: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
ea60: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
ea70: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
ea80: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
ea90: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
eaa0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
eab0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
eac0: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
ead0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
eae0: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
eaf0: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
eb00: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
eb10: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
eb20: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
eb30: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
eb40: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
eb50: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
eb60: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
eb70: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
eb80: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
eb90: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
eba0: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
ebb0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
ebc0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
ebd0: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
ebe0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
ebf0: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
ec00: 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  e==db->writeVdbe
ec10: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
ec20: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
ec30: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
ec40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65  dif../*.** For e
ec50: 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20  very Btree that 
ec60: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
ec70: 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20  ection db which 
ec80: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  .** has been mod
ec90: 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72  ified, "trip" or
eca0: 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68   invalidate each
ecb0: 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68   cursor in.** th
ecc0: 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68  at Btree might h
ecd0: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
ece0: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75  d so that the cu
ecf0: 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65  rsor.** can neve
ed00: 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e  r be used again.
ed10: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
ed20: 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hen a rollback.*
ed30: 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68  ** occurs.  We h
ed40: 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20  ave to trip all 
ed50: 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  the other cursor
ed60: 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f  s, even.** curso
ed70: 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73  r from other VMs
ed80: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61   in different da
ed90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
eda0: 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e  ns,.** so that n
edb0: 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20  one of them try 
edc0: 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20  to use the data 
edd0: 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  at which they.**
ede0: 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61   were pointing a
edf0: 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79  nd which now may
ee00: 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67   have been chang
ee10: 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65  ed due.** to the
ee20: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
ee30: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61   Remember that a
ee40: 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   rollback can de
ee50: 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70  lete tables comp
ee60: 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72  lete and.** reor
ee70: 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20  der rootpages.  
ee80: 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  So it is not suf
ee90: 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20  ficient just to 
eea0: 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74  save.** the stat
eeb0: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
eec0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
eed0: 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
eee0: 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  or.** so that it
eef0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
ef00: 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gain..*/.static 
ef10: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
ef20: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
ef30: 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a  Btrees(sqlite3 *
ef40: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
ef50: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
ef60: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
ef70: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
ef80: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
ef90: 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72   p && sqlite3Btr
efa0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
efb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
efc0: 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
efd0: 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f  rs(p, SQLITE_ABO
efe0: 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  RT);.    }.  }.}
eff0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
f000: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
f010: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
f020: 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
f030: 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
f040: 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
f050: 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
f060: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
f070: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f080: 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
f090: 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
f0a0: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
f0b0: 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
f0c0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
f0d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
f0e0: 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
f0f0: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
f100: 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
f110: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
f120: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
f130: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
f140: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f150: 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
f160: 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
f170: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
f180: 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
f190: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
f1a0: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
f1b0: 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
f1c0: 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
f1d0: 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
f1e0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
f1f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
f200: 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
f210: 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
f220: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
f230: 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
f240: 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
f250: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
f260: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
f270: 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
f280: 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
f290: 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
f2a0: 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
f2b0: 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e   occured, causin
f2c0: 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
f2d0: 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
f2e0: 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
f2f0: 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
f300: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
f310: 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
f320: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
f330: 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
f340: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
f350: 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
f360: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
f370: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
f380: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
f390: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
f3a0: 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
f3b0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
f3c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
f3d0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
f3e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
f3f0: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
f400: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
f410: 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
f420: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f430: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
f440: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
f450: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
f460: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
f470: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
f480: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
f490: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
f4a0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f4b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
f4c0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
f4d0: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
f4e0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
f4f0: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
f500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f510: 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
f520: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f530: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
f540: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
f550: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
f560: 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
f570: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
f580: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
f590: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f5a0: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
f5b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f5c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
f5d0: 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
f5e0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
f5f0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
f600: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f610: 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
f620: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f630: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f640: 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
f650: 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
f660: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
f670: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
f680: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
f690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f6a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f6b0: 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
f6c0: 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
f6d0: 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
f6e0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
f6f0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
f700: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f710: 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
f720: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
f730: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
f740: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
f750: 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
f760: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
f770: 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
f780: 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
f790: 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
f7a0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
f7b0: 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
f7c0: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
f7d0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
f7e0: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
f7f0: 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
f800: 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
f810: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
f820: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
f830: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
f840: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
f850: 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
f860: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
f870: 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
f880: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
f890: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
f8a0: 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
f8b0: 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
f8c0: 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
f8d0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
f8e0: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
f8f0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
f900: 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
f910: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
f920: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
f930: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
f940: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
f950: 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
f960: 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
f970: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
f980: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
f990: 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
f9a0: 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
f9b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
f9c0: 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72  d write.** an er
f9d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
f9e0: 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
f9f0: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
fa00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fa10: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
fa20: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
fa30: 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
fa40: 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
fa50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
fa60: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
fa70: 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65  erred && db->nDe
fa80: 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c  ferredCons>0) ||
fa90: 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
faa0: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
fab0: 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  0) ){.    p->rc 
fac0: 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
fad0: 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  INT;.    p->erro
fae0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
faf0: 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rt;.    sqlite3S
fb00: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
fb10: 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69  rMsg, db, "forei
fb20: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
fb30: 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
fb40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
fb50: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
fb60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
fb70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
fb80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
fb90: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
fba0: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
fbb0: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
fbc0: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
fbd0: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
fbe0: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
fbf0: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
fc00: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
fc10: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
fc20: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
fc30: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
fc40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fc50: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
fc60: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
fc70: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
fc80: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
fc90: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
fca0: 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
fcb0: 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
fcc0: 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
fcd0: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
fce0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
fcf0: 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
fd00: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fd10: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
fd20: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
fd30: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
fd40: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
fd50: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
fd60: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
fd70: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
fd80: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
fd90: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
fda0: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
fdb0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
fdc0: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
fdd0: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
fde0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
fe10: 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
fe20: 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
fe30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
fe40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
fe50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
fe60: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
fe70: 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
fe80: 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
fe90: 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
fea0: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
feb0: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
fec0: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
fed0: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
fee0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
fef0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
ff00: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
ff10: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
ff20: 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
ff30: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
ff40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
ff50: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
ff60: 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
ff70: 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
ff80: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
ff90: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
ffa0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
ffb0: 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
ffc0: 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
ffd0: 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
ffe0: 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
fff0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
10000 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10010 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
10020 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
10030 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
10040 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
10050 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
10060 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
10070 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
10080 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10090 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
100a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
100b0 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
100c0 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
100d0 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
100e0 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
100f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10100 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
10110 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
10120 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
10130 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
10140 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
10150 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
10160 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
10170 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
10180 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
10190 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
101a0 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
101b0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
101c0 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
101d0 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
101e0 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
101f0 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
10200 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
10210 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
10220 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
10230 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
10240 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70  lite3VdbeEnter(p
10250 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
10260 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
10270 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
10280 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
10290 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73  c & 0xff;.    as
102a0 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
102b0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
102c0 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72  D );  /* This er
102d0 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78  ror no longer ex
102e0 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70  ists */.    isSp
102f0 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63  ecialError = mrc
10300 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
10310 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
10320 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERR.            
10330 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d           || mrc=
10340 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
10350 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  T || mrc==SQLITE
10360 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69  _FULL;.    if( i
10370 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b  sSpecialError ){
10380 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10390 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d   query was read-
103a0 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72  only and the err
103b0 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
103c0 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20  E_INTERRUPT, .  
103d0 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61      ** no rollba
103e0 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  ck is necessary.
103f0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c   Otherwise, at l
10400 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74  east a savepoint
10410 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
10420 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
10430 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65  olled back to re
10440 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
10450 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a  se to a .      *
10460 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  * consistent sta
10470 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
10480 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68     ** Even if th
10490 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  e statement is r
104a0 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20  ead-only, it is 
104b0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72  important to per
104c0 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20  form.      ** a 
104d0 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61  statement or tra
104e0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
104f0 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20  k operation. If 
10500 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20  the error .     
10510 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 69 6c   ** occured whil
10520 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
10530 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
10540 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
10550 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
10560 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
10570 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
10580 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
10590 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
105a0 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
105b0 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
105c0 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
105d0 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
105e0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
105f0 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
10600 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
10610 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
10620 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
10630 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
10640 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
10650 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
10660 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
10670 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
10680 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
10690 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
106a0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
106b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
106c0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
106d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
106e0 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
106f0 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
10700 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
10710 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
10720 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
10730 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
10740 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
10750 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
10760 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
10770 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10780 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
10790 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
107a0 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
107b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
107c0 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
107d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
107e0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
107f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
10800 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
10810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10820 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10830 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
10840 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
10850 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
10860 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
10870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10880 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
10890 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
108a0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
108b0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
108c0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
108d0 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
108e0 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
108f0 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
10900 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
10910 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
10920 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
10930 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
10940 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
10950 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
10960 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
10970 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
10980 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
10990 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
109a0 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
109b0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
109c0 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
109d0 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
109e0 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
109f0 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10a00 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
10a10 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
10a20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10a30 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
10a40 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10a50 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
10a60 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
10a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
10a80 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
10a90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
10aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10ab0 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
10ac0 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
10ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
10ae0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
10af0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
10b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10b10 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
10b20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10b30 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
10b40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
10b50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
10b60 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
10b70 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
10b80 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
10b90 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
10ba0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
10bb0 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
10bc0 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
10bd0 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
10be0 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
10bf0 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
10c00 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
10c10 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
10c20 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
10c30 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
10c40 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
10c50 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
10c60 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
10c70 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
10c80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
10c90 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10ca0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
10cb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10cc0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
10cd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10ce0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10cf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
10d00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10d10 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
10d20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
10d30 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
10d40 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
10d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10d60 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
10d70 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
10d80 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
10d90 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
10da0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
10db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10dc0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
10dd0 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
10de0 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74   }.      db->nSt
10df0 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
10e00 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
10e10 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20  ementOp==0 ){.  
10e20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
10e30 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
10e40 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
10e50 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ail ){.        e
10e60 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
10e70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b  VEPOINT_RELEASE;
10e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
10e90 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
10ea0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
10eb0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10ec0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
10ed0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65  LLBACK;.      }e
10ee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
10ef0 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
10f00 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
10f10 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
10f20 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
10f30 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
10f40 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
10f50 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
10f60 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
10f70 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
10f80 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65  }.  .    /* If e
10f90 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e  StatementOp is n
10fa0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
10fb0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10fc0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20  ction needs to. 
10fd0 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74     ** be committ
10fe0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
10ff0 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56  k. Call sqlite3V
11000 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
11010 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  t() to.    ** do
11020 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65   so. If this ope
11030 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  ration returns a
11040 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65  n error, and the
11050 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
11060 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  nt.    ** error 
11070 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f  code is SQLITE_O
11080 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53  K or SQLITE_CONS
11090 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f  TRAINT, then pro
110a0 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  mote the.    ** 
110b0 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
110c0 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20  t error code..  
110d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
110e0 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
110f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
11100 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
11110 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
11120 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
11130 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11140 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11150 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
11160 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
11170 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
11180 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
11190 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
111a0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
111b0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
111c0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
111d0 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c   }.        inval
111e0 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
111f0 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29  difiedBtrees(db)
11200 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11210 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
11220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11230 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
11240 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
11250 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
11260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11270 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
11280 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
11290 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
112a0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
112b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
112c0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
112d0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
112e0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
112f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
11300 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
11310 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
11320 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
11330 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
11340 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
11350 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
11360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
11370 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
11380 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
11390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
113a0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
113b0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
113c0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
113d0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
113e0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62  .  .    /* Rollb
113f0 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e  ack or commit an
11400 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  y schema changes
11410 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20   that occurred. 
11420 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
11430 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  !=SQLITE_OK && d
11440 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
11450 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
11460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
11470 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
11480 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20 20 20  a(db, -1);.     
11490 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
114a0 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
114b0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
114c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
114d0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
114e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
114f0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
11500 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
11510 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
11520 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
11530 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
11540 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
11550 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
11560 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
11570 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  Cnt--;.    if( !
11580 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
11590 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64       db->writeVd
115a0 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  beCnt--;.    }. 
115b0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
115c0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62  ctiveVdbeCnt>=db
115d0 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
115e0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
115f0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
11600 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
11610 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
11620 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
11630 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
11640 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
11650 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
11660 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
11670 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
11680 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
11690 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
116a0 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
116b0 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
116c0 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
116d0 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
116e0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
116f0 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
11700 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
11710 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
11720 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
11730 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
11740 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11750 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11760 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
11770 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74   assert( db->act
11780 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20  iveVdbeCnt>0 || 
11790 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
117a0 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
117b0 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
117c0 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
117d0 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
117e0 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
117f0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
11800 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
11810 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
11820 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
11830 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
11840 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
11850 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
11860 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
11870 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
11880 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11890 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
118a0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
118b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
118c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
118d0 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
118e0 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
118f0 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
11900 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
11910 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
11920 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
11930 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
11940 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
11950 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
11960 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
11970 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
11980 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
11990 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
119a0 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
119b0 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
119c0 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
119d0 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
119e0 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
119f0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
11a00 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
11a10 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
11a20 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
11a30 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
11a40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11a50 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
11a60 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
11a70 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
11a80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
11a90 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
11aa0 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
11ab0 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
11ac0 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
11ad0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
11ae0 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
11af0 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
11b00 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
11b10 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
11b20 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
11b30 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
11b40 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
11b50 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
11b60 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
11b70 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
11b80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
11b90 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
11ba0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11bb0 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
11bc0 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
11bd0 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
11be0 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
11bf0 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
11c00 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
11c10 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
11c20 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
11c30 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
11c40 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
11c50 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
11c60 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
11c70 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
11c80 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
11c90 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11ca0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
11cb0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
11cc0 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
11cd0 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
11ce0 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
11cf0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
11d00 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11d10 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64  alloc();.      d
11d20 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
11d30 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
11d40 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11d50 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70  ErrMsg);.      p
11d60 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
11d70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
11d80 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
11d90 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
11da0 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
11db0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
11dc0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
11dd0 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
11de0 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
11df0 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
11e00 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
11e10 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
11e20 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
11e30 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
11e40 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
11e50 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
11e60 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
11e70 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
11e80 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
11e90 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
11ea0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
11eb0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
11ec0 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
11ed0 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
11ee0 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
11ef0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
11f00 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
11f10 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11f20 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
11f30 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
11f40 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
11f50 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
11f60 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
11f70 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11f80 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
11f90 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
11fa0 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
11fb0 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
11fc0 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
11fd0 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
11fe0 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
11ff0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
12000 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
12010 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
12020 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
12030 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
12040 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
12050 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
12060 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
12070 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
12080 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
12090 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
120a0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
120b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
120c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
120d0 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
120e0 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
120f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
12100 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
12110 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
12120 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
12130 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
12140 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
12150 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
12160 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
12170 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
12180 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
12190 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
121a0 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
121b0 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
121c0 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
121d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
121e0 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
121f0 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
12200 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
12210 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
12220 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
12230 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12240 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
12250 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
12260 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
12270 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
12280 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
12290 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
122a0 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
122b0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
122c0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
122d0 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
122e0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
122f0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
12300 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12310 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
12320 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12340 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
12350 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
12360 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
12370 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
12380 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
12390 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
123a0 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
123b0 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
123c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
123d0 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
123e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
123f0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
12400 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
12410 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
12420 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
12430 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
12440 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
12450 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
12460 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
12470 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
12480 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
12490 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
124a0 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
124b0 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
124c0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
124d0 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
124e0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
124f0 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
12500 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
12510 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
12520 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
12530 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
12540 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
12550 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
12560 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
12570 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
12580 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
12590 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20  (((u32)1)<<i))) 
125a0 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
125b0 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
125c0 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
125d0 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
125e0 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
125f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
12600 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
12610 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12620 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
12630 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12640 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
12650 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
12660 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64  gument..** The d
12670 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
12680 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12690 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
126a0 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
126b0 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
126c0 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
126d0 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
126e0 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
126f0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
12700 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12710 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
12720 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12730 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
12740 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
12750 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
12760 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20  , *pNext;.  int 
12770 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
12780 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
12790 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
127a0 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
127b0 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
127c0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
127d0 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
127e0 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
127f0 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
12800 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
12810 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
12820 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
12830 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
12840 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
12850 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
12860 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
12870 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
12880 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
12890 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
128a0 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
128b0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
128c0 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65  r[i]);.  vdbeFre
128d0 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
128e0 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
128f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12900 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
12910 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12920 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
12930 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12940 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
12950 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12960 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73  , p->pFree);.  s
12970 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12980 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
12990 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
129a0 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
129b0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
129c0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
129d0 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
129e0 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
129f0 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
12a00 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  b;.  if( p->pPre
12a10 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
12a20 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
12a30 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
12a40 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
12a50 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
12a60 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
12a70 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
12a80 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
12a90 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
12aa0 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
12ab0 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
12ac0 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
12ad0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
12ae0 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65  e3VdbeDeleteObje
12af0 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ct(db, p);.}../*
12b00 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
12b10 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
12b20 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
12b30 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
12b40 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
12b50 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
12b60 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
12b70 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
12b80 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
12b90 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
12ba0 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
12bb0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
12bc0 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
12bd0 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
12be0 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
12bf0 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
12c00 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
12c10 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
12c20 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
12c30 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
12c40 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
12c50 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
12c60 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
12c70 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
12c80 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
12c90 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
12ca0 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
12cb0 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
12cc0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
12cd0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
12ce0 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
12cf0 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
12d00 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
12d10 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
12d20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
12d30 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
12d40 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
12d50 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
12d60 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
12d70 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
12d80 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
12d90 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
12da0 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
12db0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
12dc0 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
12dd0 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
12de0 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
12df0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
12e00 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
12e10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
12e20 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
12e30 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
12e40 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
12e50 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
12e60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12e70 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
12e80 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
12e90 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d  t;.    if( res!=
12ea0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
12eb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12ec0 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61      p->rowidIsVa
12ed0 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lid = 1;.#ifdef 
12ee0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
12ef0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
12f00 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
12f10 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
12f20 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
12f30 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
12f40 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65  ACHE_STALE;.  }e
12f50 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
12f60 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  ->pCursor) ){.  
12f70 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a    int hasMoved;.
12f80 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
12f90 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
12fa0 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
12fb0 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a  or, &hasMoved);.
12fc0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
12fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
12fe0 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  hasMoved ){.    
12ff0 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
13000 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
13010 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77        p->nullRow
13020 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
13030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13040 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
13050 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
13060 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
13070 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13080 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
13090 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
130a0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
130b0 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
130c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
130d0 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
130e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
130f0 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
13100 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
13110 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
13120 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
13130 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
13140 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
13150 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
13160 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
13170 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
13180 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
13190 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
131a0 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
131b0 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
131c0 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
131d0 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
131e0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
131f0 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
13200 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
13210 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
13220 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
13230 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
13240 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
13250 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
13260 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
13270 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
13280 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
13290 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
132a0 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
132b0 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
132c0 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
132d0 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
132e0 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
132f0 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
13300 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
13310 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
13320 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
13330 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
13340 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
13350 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
13360 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
13370 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
13380 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
13390 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
133a0 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
133d0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
133e0 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
13410 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
13440 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13450 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
13460 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
13470 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13480 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
134b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
134c0 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
134e0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
134f0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13500 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
13510 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
13520 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13530 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
13560 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13570 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
13580 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
13590 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
135a0 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135c0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
135d0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
135e0 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
13610 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
13620 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
13650 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
13660 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
13670 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
13680 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
13690 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
136a0 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
136b0 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
136c0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
136d0 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
136e0 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
136f0 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
13700 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
13710 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
13720 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
13730 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
13740 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
13750 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
13760 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
13770 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
13780 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
13790 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
137a0 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
137b0 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
137c0 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
137d0 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
137e0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
137f0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
13800 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
13810 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
13820 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
13830 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
13840 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
13850 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
13860 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
13870 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
13880 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
13890 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
138a0 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
138b0 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
138c0 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
138d0 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
138e0 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20  rn 8+(u32)i;.   
138f0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29   }.    if( i<0 )
13900 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28 2d  {.      if( i<(-
13910 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65 74  MAX_6BYTE) ) ret
13920 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 6;.      /* 
13930 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70 72  Previous test pr
13940 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d  events:  u = -(-
13950 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
13960 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75 20  808) */.      u 
13970 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -i;.    }else{
13980 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
13990 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
139a0 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
139b0 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
139c0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
139d0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
139e0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
139f0 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
13a00 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
13a10 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
13a20 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
13a30 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
13a40 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
13a50 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
13a60 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
13a70 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
13a80 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
13a90 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
13aa0 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20  _Blob) );.  n = 
13ab0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
13ac0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
13ad0 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
13ae0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
13af0 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
13b00 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
13b10 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
13b20 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
13b30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
13b40 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
13b50 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
13b60 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
13b70 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
13b80 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
13b90 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
13ba0 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
13bb0 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
13bc0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
13bd0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
13be0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
13bf0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
13c00 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
13c10 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
13c20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
13c30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
13c40 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
13c50 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
13c60 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
13c70 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
13c80 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
13c90 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
13ca0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
13cb0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
13cc0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
13cd0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
13ce0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
13cf0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
13d00 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
13d10 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
13d20 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
13d30 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
13d40 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
13d50 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
13d60 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
13d70 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
13d80 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
13d90 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
13da0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
13db0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
13dc0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
13dd0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
13de0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
13df0 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
13e00 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
13e10 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
13e20 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
13e30 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
13e40 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
13e50 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
13e60 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
13e70 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
13e80 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
13e90 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
13ea0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
13eb0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
13ec0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
13ed0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
13ee0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
13ef0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
13f00 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
13f10 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
13f20 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
13f30 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
13f40 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
13f50 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
13f60 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
13f70 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
13f80 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
13f90 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
13fa0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
13fb0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
13fc0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
13fd0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
13fe0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
13ff0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
14000 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
14010 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
14020 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
14030 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
14040 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
14050 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
14060 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
14070 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
14080 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
14090 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
140a0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
140b0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
140c0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
140d0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
140e0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
140f0 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
14100 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
14110 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
14120 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
14130 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
14140 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
14150 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
14160 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
14170 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
14180 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
14190 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
141a0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
141b0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
141c0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
141d0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
141e0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
141f0 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
14200 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
14210 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
14220 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
14230 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
14240 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
14250 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
14260 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
14270 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
14280 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
14290 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
142a0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
142b0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
142c0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
142d0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
142e0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
142f0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
14300 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
14310 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
14320 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
14330 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
14340 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
14350 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
14360 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
14370 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
14380 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
14390 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
143a0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
143b0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
143c0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
143d0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
143e0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
143f0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
14400 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
14410 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
14420 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
14430 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
14440 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
14450 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
14460 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
14470 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
14480 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
14490 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
144a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
144b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
144c0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
144d0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
144e0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
144f0 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73  buf[].  nBuf mus
14500 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c  t always be.** l
14510 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
14520 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
14530 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ield.  Except, i
14540 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a  f the field is.*
14550 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20  * a blob with a 
14560 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
14570 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67  , then buf[] mig
14580 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72  ht be just the r
14590 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20  ight.** size to 
145a0 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20  hold everything 
145b0 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a  except for the z
145c0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e  ero-filled tail.
145d0 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73    If buf[].** is
145e0 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68   only big enough
145f0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e   to hold the non
14600 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68  -zero prefix, th
14610 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  en only write th
14620 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74  at.** prefix int
14630 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66  o buf[].  But if
14640 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20   buf[] is large 
14650 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62  enough to hold b
14660 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69  oth the.** prefi
14670 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74  x and the tail t
14680 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72  hen write the pr
14690 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65  efix and set the
146a0 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20   tail to all.** 
146b0 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  zeros..**.** Ret
146c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
146d0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
146e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
146f0 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
14700 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
14710 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
14720 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
14730 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
14740 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
14750 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
14760 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
14770 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
14780 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
14790 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66  8 *buf, int nBuf
147a0 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  , Mem *pMem, int
147b0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
147c0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
147d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
147e0 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66  rialType(pMem, f
147f0 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75  ile_format);.  u
14800 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
14810 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
14820 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
14830 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
14840 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
14850 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
14860 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
14870 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
14880 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14890 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
148a0 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  >r) );.      mem
148b0 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72  cpy(&v, &pMem->r
148c0 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
148d0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
148e0 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
148f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
14900 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
14910 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
14920 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14930 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
14940 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  _type);.    asse
14950 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42  rt( len<=(u32)nB
14960 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  uf );.    while(
14970 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
14980 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  f[i] = (u8)(v&0x
14990 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
149a0 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
149b0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
149c0 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
149d0 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
149e0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
149f0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
14a00 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
14a10 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
14a20 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
14a40 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
14a50 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
14a60 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
14a70 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
14a80 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
14a90 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
14aa0 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
14ab0 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
14ac0 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
14ad0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
14ae0 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
14af0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20  ->u.nZero;.     
14b00 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30   assert( nBuf>=0
14b10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   );.      if( le
14b20 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b  n > (u32)nBuf ){
14b30 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28  .        len = (
14b40 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20  u32)nBuf;.      
14b50 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  }.      memset(&
14b60 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c  buf[pMem->n], 0,
14b70 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20   len-pMem->n);. 
14b80 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
14b90 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
14ba0 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
14bb0 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
14bc0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14bd0 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
14be0 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
14bf0 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
14c00 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
14c10 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
14c20 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
14c30 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
14c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14c50 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33  tes read..*/ .u3
14c60 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
14c70 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
14c80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
14c90 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
14ca0 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
14cb0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
14cc0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
14cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
14ce0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
14cf0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
14d00 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
14d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
14d20 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
14d30 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
14d40 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
14d50 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
14d60 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
14d70 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
14d80 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
14d90 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
14da0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
14db0 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
14dc0 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
14dd0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14de0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
14df0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14e00 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
14e10 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
14e20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
14e30 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69   pMem->u.i = (si
14e40 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
14e50 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
14e60 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
14e70 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
14e80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
14e90 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
14ea0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
14eb0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
14ec0 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
14ed0 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
14ee0 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[1];.      pMem
14ef0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14f00 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
14f10 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
14f20 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
14f30 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14f40 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
14f50 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
14f60 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29  har)buf[0])<<16)
14f70 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c   | (buf[1]<<8) |
14f80 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70   buf[2];.      p
14f90 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
14fa0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
14fb0 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
14fc0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
14fd0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
14fe0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
14ff0 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c  ->u.i = (buf[0]<
15000 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
15010 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
15020 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
15030 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15040 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
15050 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
15060 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
15070 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
15080 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  teger */.      u
15090 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64  64 x = (((signed
150a0 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
150b0 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
150c0 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32    u32 y = (buf[2
150d0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d  ]<<24) | (buf[3]
150e0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c  <<16) | (buf[4]<
150f0 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20  <8) | buf[5];.  
15100 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
15110 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  | y;.      pMem-
15120 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
15130 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
15140 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15150 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
15160 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
15170 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
15180 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15190 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
151a0 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
151b0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  int */.      u64
151c0 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b   x;.      u32 y;
151d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
151e0 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
151f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
15200 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
15210 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
15220 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
15230 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
15240 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
15250 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
15260 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
15270 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
15280 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
15290 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a  LOAT is.      **
152a0 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
152b0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
152c0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
152d0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
152e0 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
152f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
15300 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
15310 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
15320 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73  00)<<32;.      s
15330 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
15340 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
15350 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
15360 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
15370 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
15380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
15390 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
153a0 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
153b0 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
153c0 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
153d0 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
153e0 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
153f0 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
15400 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
15410 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
15420 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
15430 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
15440 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
15450 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
15460 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
15470 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
15480 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
15490 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
154a0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
154b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
154c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
154d0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
154e0 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
154f0 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20  eof(pMem->r)==8 
15500 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d  );.        swapM
15510 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
15520 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  x);.        memc
15530 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c  py(&pMem->r, &x,
15540 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
15550 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15560 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
15570 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e  pMem->r) ? MEM_N
15580 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
15590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
155a0 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
155b0 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
155c0 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
155d0 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
155e0 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
155f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
15600 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
15610 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15620 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
15630 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
15640 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
15650 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28       u32 len = (
15660 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
15670 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
15680 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
15690 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
156a0 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
156b0 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
156c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
156d0 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
156e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
156f0 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
15700 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
15710 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
15720 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
15730 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
15740 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
15750 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
15760 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
15770 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
15780 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
15790 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
157a0 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65  in pKey[], parse
157b0 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69   the.** record i
157c0 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65  nto a UnpackedRe
157d0 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e 20  cord structure. 
157e0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
157f0 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72  r to.** that str
15800 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
15810 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
15820 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65  on might provide
15830 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f   szSpace bytes o
15840 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  f memory.** spac
15850 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54 68  e at pSpace.  Th
15860 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  is space can be 
15870 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  used to hold the
15880 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62   returned.** VDb
15890 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74  eParsedRecord st
158a0 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69 73  ructure if it is
158b0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20   large enough.  
158c0 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  If it is.** not 
158d0 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63  big enough, spac
158e0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
158f0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
15900 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  c()..**.** The r
15910 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75 72  eturned structur
15920 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
15930 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ed by a call to.
15940 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  ** sqlite3VdbeDe
15950 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
15960 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b  rd()..*/ .Unpack
15970 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
15980 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
15990 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
159a0 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
159b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
159c0 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
159d0 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
159e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
159f0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
15a00 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
15a10 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
15a20 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
15a30 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
15a40 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
15a50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c           /* Unal
15a60 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69  igned space avai
15a70 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  lable to hold th
15a80 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
15a90 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20 20  t szSpace       
15aa0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
15ab0 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65  pSpace[] in byte
15ac0 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
15ad0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
15ae0 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
15af0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
15b00 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  y;.  UnpackedRec
15b10 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20  ord *p;  /* The 
15b20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
15b30 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74  that we will ret
15b40 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  urn */.  int nBy
15b50 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
15b60 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65  Memory space nee
15b70 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69  ded to hold p, i
15b80 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
15b90 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20   d;.  u32 idx;. 
15ba0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
15bb0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
15bc0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
15bd0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
15be0 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74  Mem *pMem;.  int
15bf0 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
15c00 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70   /* Increase pSp
15c10 61 63 65 20 62 79 20 74 68 69 73 20 6d 75 63 68  ace by this much
15c20 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   to 8-byte align
15c30 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20   it */.  .  /*. 
15c40 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   ** We want to s
15c50 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
15c60 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
15c70 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
15c80 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
15c90 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
15ca0 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
15cb0 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
15cc0 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
15cd0 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
15ce0 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
15cf0 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
15d00 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
15d10 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
15d20 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
15d30 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15d40 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
15d50 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d  & 7;.  pSpace +=
15d60 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65   nOff;.  szSpace
15d70 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74   -= nOff;.  nByt
15d80 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
15d90 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
15da0 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
15db0 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
15dc0 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
15dd0 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20  te>szSpace ){.  
15de0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
15df0 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
15e00 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
15e10 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
15e20 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66  turn 0;.    p->f
15e30 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
15e40 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41  NEED_FREE | UNPA
15e50 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
15e60 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
15e70 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
15e80 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20  ord*)pSpace;.   
15e90 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41   p->flags = UNPA
15ea0 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
15eb0 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79  Y;.  }.  p->pKey
15ec0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
15ed0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
15ee0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
15ef0 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  + 1;.  p->aMem =
15f00 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28   pMem = (Mem*)&(
15f10 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
15f20 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
15f30 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
15f40 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
15f50 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
15f60 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  );.  idx = getVa
15f70 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
15f80 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72  dr);.  d = szHdr
15f90 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  u = 0;.  whi
15fa0 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26  le( idx<szHdr &&
15fb0 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20   u<p->nField && 
15fc0 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
15fd0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
15fe0 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
15ff0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
16000 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
16010 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
16020 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
16030 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
16040 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
16050 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
16060 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
16070 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
16080 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
16090 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
160a0 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
160b0 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
160c0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
160d0 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
160e0 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
160f0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a  Mem++;.    u++;.
16100 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
16110 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  =pKeyInfo->nFiel
16120 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
16130 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75  ield = u;.  retu
16140 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a  rn (void*)p;.}..
16150 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16160 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e  ne destroys a Un
16170 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a  packedRecord obj
16180 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
16190 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
161a0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70  packedRecord(Unp
161b0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
161c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
161d0 45 42 55 47 0a 20 20 69 6e 74 20 69 3b 0a 20 20  EBUG.  int i;.  
161e0 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73  Mem *pMem;..  as
161f0 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
16200 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
16210 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   & UNPACKED_NEED
16220 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f  _DESTROY );.  fo
16230 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61  r(i=0, pMem=p->a
16240 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64  Mem; i<p->nField
16250 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a  ; i++, pMem++){.
16260 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63      /* The unpac
16270 6b 65 64 20 72 65 63 6f 72 64 20 69 73 20 61 6c  ked record is al
16280 77 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65 64  ways constructed
16290 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   by the.    ** s
162a0 71 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63 6b  qlite3VdbeUnpack
162b0 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
162c0 6e 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20 6d  n above, which m
162d0 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  akes all.    ** 
162e0 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62  strings and blob
162f0 73 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20 6e  s static.  And n
16300 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d 65  one of the eleme
16310 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 65  nts are.    ** e
16320 76 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c  ver transformed,
16330 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
16340 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64  er anything to d
16350 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  elete..    */.  
16360 20 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65 6d    if( NEVER(pMem
16370 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c  ->zMalloc) ) sql
16380 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
16390 73 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 23 65  se(pMem);.  }.#e
163a0 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 66 6c  ndif.  if( p->fl
163b0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e  ags & UNPACKED_N
163c0 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20  EED_FREE ){.    
163d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
163e0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
163f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
16400 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
16410 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
16420 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
16430 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
16440 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
16450 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
16460 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
16470 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
16480 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
16490 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
164a0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
164b0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
164c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
164d0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
164e0 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
164f0 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
16500 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61  ated by th OP_Ma
16510 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
16520 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
16530 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
16540 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
16550 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
16560 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
16570 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
16580 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  cord..**.** Key1
16590 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
165a0 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
165b0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
165c0 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54   of fields..** T
165d0 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65  he key with fewe
165e0 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61  r fields is usua
165f0 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73  lly compares les
16600 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c  s than the .** l
16610 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65  onger key.  Howe
16620 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43  ver if the UNPAC
16630 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67  KED_INCRKEY flag
16640 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73  s in pPKey2 is s
16650 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  et.** and the co
16660 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72  mmon prefixes ar
16670 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65  e equal, then ke
16680 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  y1 is less than 
16690 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74  key2..** Or if t
166a0 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43  he UNPACKED_MATC
166b0 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73  H_PREFIX flag is
166c0 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65   set and the pre
166d0 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75  fixes are.** equ
166e0 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79  al, then the key
166f0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
16700 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64   to be equal and
16710 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65  .** the parts be
16720 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  yond the common 
16730 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72  prefix are ignor
16740 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
16750 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45   UNPACKED_IGNORE
16760 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73  _ROWID flag is s
16770 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  et, then the las
16780 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65  t byte of.** the
16790 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31   header of pKey1
167a0 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74   is ignored.  It
167b0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
167c0 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20   pKey1 is.** an 
167d0 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74  index key, and t
167e0 68 75 73 20 65 6e 64 73 20 77 69 74 68 20 61 20  hus ends with a 
167f0 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68  rowid value.  Th
16800 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f  e last byte.** o
16810 66 20 74 68 65 20 68 65 61 64 65 72 20 77 69 6c  f the header wil
16820 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74  l therefore be t
16830 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
16840 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20  f the rowid:.** 
16850 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20  one of 1, 2, 3, 
16860 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39  4, 5, 6, 8, or 9
16870 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20 73   - the integer s
16880 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20  erial types..** 
16890 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
168a0 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  of the final row
168b0 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  id will always b
168c0 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  e a single byte.
168d0 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20  .** By ignoring 
168e0 74 68 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f  this last byte o
168f0 66 20 74 68 65 20 68 65 61 64 65 72 2c 20 77 65  f the header, we
16900 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61   force the compa
16910 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f  rison.** to igno
16920 72 65 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  re the rowid at 
16930 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e  the end of key1.
16940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16950 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
16960 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
16970 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
16980 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
16990 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
169a0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
169b0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
169c0 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20  .){.  int d1;   
169d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
169e0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
169f0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
16a00 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
16a10 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
16a20 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
16a30 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
16a40 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
16a50 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
16a60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16a70 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
16a80 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
16a90 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e  int nField;.  in
16aa0 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
16ab0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
16ac0 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
16ad0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
16ae0 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
16af0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
16b00 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
16b10 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
16b20 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65  eyInfo;.  mem1.e
16b30 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
16b40 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
16b50 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
16b60 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
16b70 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
16b80 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
16b90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
16ba0 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
16bb0 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  LY( mem1.zMalloc
16bc0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
16bd0 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
16be0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
16bf0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
16c00 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
16c10 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
16c20 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
16c30 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
16c40 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
16c50 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
16c60 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
16c70 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
16c80 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
16c90 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
16ca0 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
16cb0 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
16cc0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
16cd0 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
16ce0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
16cf0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
16d00 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
16d10 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
16d20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
16d30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16d40 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
16d50 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
16d60 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
16d70 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
16d80 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
16d90 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
16da0 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
16db0 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
16dc0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
16dd0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
16de0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
16df0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
16e00 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
16e10 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
16e20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
16e30 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70 50  szHdr1;.  if( pP
16e40 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
16e50 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
16e60 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64 72  WID ){.    szHdr
16e70 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c  1--;.  }.  nFiel
16e80 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
16e90 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
16ea0 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
16eb0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
16ec0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
16ed0 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
16ee0 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
16ef0 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
16f00 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
16f10 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
16f20 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
16f30 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
16f40 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
16f50 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
16f60 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
16f70 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16f80 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
16f90 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45  break;..    /* E
16fa0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
16fb0 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
16fc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
16fd0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
16fe0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
16ff0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
17000 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
17010 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
17020 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
17030 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
17040 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
17050 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20  Key2->aMem[i],. 
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65            i<nFie
17080 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ld ? pKeyInfo->a
17090 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
170a0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
170b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
170c0 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  1.zMalloc==0 ); 
170d0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
170e0 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20  below */..      
170f0 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
17100 73 75 6c 74 20 69 66 20 77 65 20 61 72 65 20 75  sult if we are u
17110 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74 20 6f  sing DESC sort o
17120 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rder. */.      i
17130 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
17140 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e 46 69  rtOrder && i<nFi
17150 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  eld && pKeyInfo-
17160 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
17170 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
17180 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17190 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
171a0 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
171b0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61  lag is set and a
171c0 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70 74  ll fields except
171d0 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20   the final.     
171e0 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20   ** rowid field 
171f0 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e  were equal, then
17200 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46 49   clear the PREFI
17210 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e  X_SEARCH flag an
17220 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20  d set .      ** 
17230 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f  pPKey2->rowid to
17240 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17250 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e  e rowid field in
17260 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e   (pKey1, nKey1).
17270 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
17280 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f 50  s used by the OP
17290 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65  _IsUnique opcode
172a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
172b0 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c   if( (pPKey2->fl
172c0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
172d0 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26 26  REFIX_SEARCH) &&
172e0 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69   i==(pPKey2->nFi
172f0 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  eld-1) ){.      
17300 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d    assert( idx1==
17310 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a  szHdr1 && rc );.
17320 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17330 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d  mem1.flags & MEM
17340 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  _Int );.        
17350 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d  pPKey2->flags &=
17360 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49   ~UNPACKED_PREFI
17370 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20  X_SEARCH;.      
17380 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20    pPKey2->rowid 
17390 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20  = mem1.u.i;.    
173a0 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72    }.    .      r
173b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
173c0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
173d0 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
173e0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
173f0 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
17400 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
17410 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
17420 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
17430 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
17440 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
17450 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
17460 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
17470 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
17480 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
17490 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
174a0 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
174b0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
174c0 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
174d0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
174e0 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
174f0 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
17500 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
17510 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
17520 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68  ere equal. If th
17530 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  e UNPACKED_INCRK
17540 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  EY.  ** flag is 
17550 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20  set, then break 
17560 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74  the tie by treat
17570 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67  ing key2 as larg
17580 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  er..  ** If the 
17590 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  UPACKED_PREFIX_M
175a0 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ATCH flag is set
175b0 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68  , then keys with
175c0 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73   common prefixes
175d0 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64  .  ** are consid
175e0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
175f0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
17600 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20  e longer key is 
17610 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72  the .  ** larger
17620 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73  .  As it happens
17630 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c  , the pPKey2 wil
17640 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  l always be the 
17650 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74  longer.  ** if t
17660 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72  here is a differ
17670 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ence..  */.  ass
17680 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
17690 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
176a0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  s & UNPACKED_INC
176b0 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d  RKEY ){.    rc =
176c0 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   -1;.  }else if(
176d0 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
176e0 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
176f0 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a  _MATCH ){.    /*
17700 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a   Leave rc==0 */.
17710 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31    }else if( idx1
17720 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72  <szHdr1 ){.    r
17730 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 1;.  }.  ret
17740 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a  urn rc;.}. ../*.
17750 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
17760 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
17770 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
17780 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
17790 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
177a0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
177b0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
177c0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
177d0 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
177e0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
177f0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
17800 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
17810 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
17820 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
17830 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
17840 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
17850 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
17860 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
17870 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
17880 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
17890 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
178a0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
178b0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
178c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
178d0 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
178e0 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
178f0 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
17900 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
17910 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
17920 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
17930 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17940 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
17950 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
17960 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
17970 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
17980 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
17990 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
179a0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
179b0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55  Mem m, v;..  UNU
179c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
179d0 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  );..  /* Get the
179e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
179f0 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
17a00 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
17a10 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
17a20 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
17a30 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
17a40 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
17a50 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
17a60 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
17a70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
17a80 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
17a90 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
17aa0 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
17ab0 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
17ac0 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
17ad0 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
17ae0 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
17af0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
17b00 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
17b10 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
17b20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
17b30 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
17b40 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
17b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
17b60 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
17b70 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
17b80 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
17b90 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
17ba0 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
17bb0 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
17bc0 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
17bd0 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
17be0 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
17bf0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
17c00 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ntry */.  memset
17c10 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
17c20 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
17c30 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
17c40 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ee(pCur, 0, (int
17c50 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
17c60 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
17c70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17c80 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
17c90 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
17ca0 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
17cb0 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
17cc0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
17cd0 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
17ce0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
17cf0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
17d00 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
17d10 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
17d20 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
17d30 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
17d40 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
17d50 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
17d60 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
17d70 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
17d80 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
17d90 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
17da0 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
17db0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
17dc0 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
17dd0 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
17de0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
17df0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
17e00 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
17e10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17e20 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
17e30 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17e40 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
17e50 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17e60 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
17e70 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
17e80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17e90 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
17ea0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17eb0 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
17ec0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17ed0 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
17ee0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
17ef0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
17f00 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
17f10 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
17f20 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
17f30 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
17f40 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
17f50 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
17f60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17f70 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
17f80 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
17f90 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
17fa0 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
17fb0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
17fc0 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
17fd0 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
17fe0 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
17ff0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
18000 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
18010 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
18020 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
18030 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
18040 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
18050 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
18060 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
18070 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
18080 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
18090 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
180a0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
180b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
180c0 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
180d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
180e0 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
180f0 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
18100 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
18110 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
18120 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18130 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
18140 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
18150 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
18160 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  m.zMalloc!=0 );.
18170 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18180 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
18190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
181a0 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
181b0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
181c0 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
181d0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
181e0 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
181f0 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
18200 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
18210 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
18220 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
18230 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
18240 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
18250 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
18260 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
18270 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
18280 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
18290 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
182a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
182b0 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
182c0 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
182d0 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
182e0 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
182f0 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
18300 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
18310 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
18320 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
18330 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
18340 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
18350 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
18360 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
18370 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
18380 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
18390 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
183a0 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
183b0 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
183c0 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
183d0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
183e0 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
183f0 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72  re(.  VdbeCursor
18400 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
18410 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
18420 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
18430 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
18440 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
18450 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  d,  /* Unpacked 
18460 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74  version of key t
18470 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
18480 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  t */.  int *res 
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
184b0 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
184c0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
184d0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
184e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
184f0 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
18500 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
18510 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   m;..  assert( s
18520 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18530 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
18540 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18550 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
18560 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
18570 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
18580 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20  ITE_OK );    /* 
18590 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
185a0 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
185b0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
185c0 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
185d0 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
185e0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
185f0 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
18600 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68 61  the say.  ** tha
18610 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
18620 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
18630 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
18640 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
18650 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
18660 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
18670 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
18680 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
18690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
186a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
186b0 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
186c0 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
186d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
186e0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
186f0 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29  Cursor, 0, (int)
18700 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
18710 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
18720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
18730 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70 61  .  assert( pUnpa
18740 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e  cked->flags & UN
18750 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
18760 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20  WID );.  *res = 
18770 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
18780 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
18790 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
187a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
187b0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
187c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
187d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
187e0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
187f0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
18800 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
18810 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
18820 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
18830 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18840 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
18850 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18860 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
18870 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
18880 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
18890 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
188a0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
188b0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
188c0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
188d0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
188e0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
188f0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
18900 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
18910 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
18920 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
18930 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
18940 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
18950 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
18960 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
18970 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
18980 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
18990 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
189a0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
189b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
189c0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
189d0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
189e0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
189f0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
18a00 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
18a10 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
18a20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
18a30 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
18a40 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
18a50 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
18a60 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
18a70 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
18a80 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
18a90 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
18aa0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
18ab0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
18ac0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
18ad0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
18ae0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
18af0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
18b00 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
18b10 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18b20 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
18b30 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
18b40 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
18b50 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
18b60 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
18b70 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
18b80 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
18b90 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
18ba0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
18bb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
18bc0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
18bd0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
18be0 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
18bf0 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
18c00 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
18c10 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
18c20 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18c30 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
18c40 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
18c50 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
18c60 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
18c70 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
18c80 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
18c90 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
18ca0 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
18cb0 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
18cc0 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
18cd0 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
18ce0 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
18cf0 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
18d00 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
18d10 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
18d20 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
18d30 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
18d40 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
18d50 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
18d60 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
18d70 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
18d80 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
18d90 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
18da0 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
18db0 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20  Var, u8 aff){.  
18dc0 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
18dd0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
18de0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d   Mem *pMem = &v-
18df0 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20  >aVar[iVar-1];. 
18e00 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
18e10 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
18e20 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
18e30 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
18e40 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
18e50 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
18e60 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
18e70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
18e80 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
18e90 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
18ea0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
18eb0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
18ec0 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
18ed0 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TF8);.        sq
18ee0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
18ef0 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52 65  eType((Mem *)pRe
18f00 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
18f10 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
18f20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18f30 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
18f40 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
18f50 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
18f60 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
18f70 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
18f80 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
18f90 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
18fa0 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
18fb0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
18fc0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
18fd0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
18fe0 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
18ff0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
19000 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
19010 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
19020 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
19030 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
19040 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
19050 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
19060 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
19070 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
19080 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.