/ Hex Artifact Content
Login

Artifact 99900868d18618a07ffaf780ecc41fd807834bde:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 50 61 72    if( op==OP_Par
0f60: 73 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  seSchema ){.    
0f70: 2f 2a 20 41 6e 79 20 70 72 6f 67 72 61 6d 20 74  /* Any program t
0f80: 68 61 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f  hat uses the OP_
0f90: 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f  ParseSchema opco
0fa0: 64 65 20 6e 65 65 64 73 20 74 6f 20 6c 6f 63 6b  de needs to lock
0fb0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 62 74 72 65  .    ** all btre
0fc0: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  es. */.    int j
0fd0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
0fe0: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  <p->db->nDb; j++
0ff0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  ) sqlite3VdbeUse
1000: 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 20 20  sBtree(p, j);.  
1010: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1020: 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f  DEBUG.  pOp->zCo
1030: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  mment = 0;.  if(
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
1050: 70 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  pTrace ) sqlite3
1060: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1070: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
1080: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
1090: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
10a0: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
10b0: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
10c0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
10d0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
10e0: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
10f0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1100: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1110: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1120: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1130: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1140: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1150: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1180: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
11a0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
11b0: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
11c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
11d0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
11e0: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
11f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1200: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1210: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1220: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
1230: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1240: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
1250: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1260: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
1270: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
1280: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1290: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
12a0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
12b0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
12c0: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
12d0: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
12e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12f0: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1300: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1310: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1320: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
1330: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
1340: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
1350: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
1360: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
1370: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
1380: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13a0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
13b0: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
13c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
13d0: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
13e0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
13f0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
1400: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1410: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1420: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1430: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1440: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1450: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1460: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1470: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1480: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
14b0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
14c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
14d0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
14e0: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
14f0: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1500: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1520: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1530: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1540: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1550: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1560: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1570: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1580: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1590: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
15a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
15b0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
15c0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
15d0: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
15e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
15f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1600: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1610: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1620: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1630: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1640: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1650: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1660: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1670: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1680: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1690: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
16a0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
16b0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
16c0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
16d0: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
16e0: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
16f0: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1700: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1710: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1720: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1730: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1740: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1750: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1760: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1770: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1780: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1790: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
17a0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
17b0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
17c0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
17d0: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
17e0: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
17f0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1800: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1810: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1820: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1830: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1840: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1850: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1860: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1870: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1880: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
1890: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
18a0: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
18b0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
18c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
18d0: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
18e0: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
18f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e      int n = p->n
1900: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35  LabelAlloc*2 + 5
1910: 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  ;.    p->aLabel 
1920: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1930: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
1940: 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20  p->aLabel,.     
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c    n*sizeof(p->aL
1980: 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70  abel[0]));.    p
1990: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20  ->nLabelAlloc = 
19a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
19b0: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ize(p->db, p->aL
19c0: 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e  abel)/sizeof(p->
19d0: 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a  aLabel[0]);.  }.
19e0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
19f0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1a00: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
1a10: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
1a20: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1a30: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1a40: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1a50: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1a60: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
1a70: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
1a80: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
1a90: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
1aa0: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
1ab0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1ac0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
1ad0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1ae0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1af0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b  Vdbe *p, int x){
1b00: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
1b10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1b20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1b30: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
1b40: 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e  ( j>=0 && j<p->n
1b50: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70  Label );.  if( p
1b60: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1b70: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70  p->aLabel[j] = p
1b80: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->nOp;.  }.}../*
1b90: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
1ba0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
1bb0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
1bc0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
1be0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
1bf0: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
1c00: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
1c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
1c20: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
1c30: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
1c40: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
1c50: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
1c60: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
1c70: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1c80: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
1c90: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
1ca0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
1cb0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
1cc0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
1cd0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
1ce0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
1cf0: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
1d00: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
1d10: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1d20: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
1d30: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
1d40: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
1d50: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
1d60: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
1d70: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
1da0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
1db0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
1dc0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
1dd0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
1de0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
1df0: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
1e00: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
1e10: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
1e20: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
1e30: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1e40: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
1e50: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
1e60: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
1e70: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1e80: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
1e90: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1ea0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
1eb0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
1ec0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
1ed0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
1ee0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
1ef0: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f10: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1f20: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
1f30: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
1f40: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1f50: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
1f60: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
1f70: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
1fa0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
1fb0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
1fc0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
1fd0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
1fe0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
1ff0: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2000: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2010: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2020: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2030: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2040: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2060: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2070: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2080: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2090: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
20a0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
20b0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
20c0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
20d0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
20e0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
20f0: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2100: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2110: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2120: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2130: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2140: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2150: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2160: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
2170: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
2180: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
2190: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
21a0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
21b0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
21c0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
21d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
21e0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
21f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2200: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2210: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2230: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2240: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2250: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2260: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2270: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
2280: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
2290: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
22a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
22b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
22c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
22d0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
22e0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
22f0: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2300: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2310: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2320: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2330: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2340: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2350: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2360: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
2370: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
2380: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
2390: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
23a0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
23b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
23c0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
23d0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
23e0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
23f0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2400: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2410: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2420: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2430: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2440: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2450: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2460: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2470: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
2480: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2490: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
24a0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
24b0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
24c0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
24d0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
24e0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
24f0: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2500: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2510: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2520: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2530: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2540: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2550: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2560: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
2570: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
2580: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2590: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
25a0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
25b0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
25c0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
25d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25e0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
25f0: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2600: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2610: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2620: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2630: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2640: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2650: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2660: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
2670: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
2680: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2690: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
26a0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
26b0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
26c0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
26d0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
26e0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
26f0: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2700: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2710: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2720: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2730: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2740: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2750: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2760: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2770: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2780: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2790: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
27a0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
27b0: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
27c0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
27d0: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
27e0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
27f0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2800: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2810: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2820: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2830: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2840: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2850: 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51   && (pOp->p1==SQ
2860: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2870: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
2880: 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20  bort)).    ){.  
2890: 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31      hasAbort = 1
28a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
28c0: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
28d0: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
28e0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
28f0: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
2900: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
2910: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
2920: 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d  cured..  ** If m
2930: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68  alloc failed, th
2940: 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c  en the while() l
2950: 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f  oop above may no
2960: 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a  t have iterated.
2970: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c    ** through all
2980: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73   opcodes and has
2990: 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74  Abort may be set
29a0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65   incorrectly. Re
29b0: 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66  turn.  ** true f
29c0: 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20  or this case to 
29d0: 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65  prevent the asse
29e0: 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c  rt() in the call
29f0: 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66  ers frame.  ** f
2a00: 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f  rom failing.  */
2a10: 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64  .  return ( v->d
2a20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a30: 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  || hasAbort==may
2a40: 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69  Abort );.}.#endi
2a50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2a60: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
2a70: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
2a80: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
2a90: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
2aa0: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
2ab0: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
2ac0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
2ad0: 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69  ive.** on jump i
2ae0: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61  nstructions.  Ea
2af0: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
2b00: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
2b10: 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  ve the.** label 
2b20: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
2b30: 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  2 value to its c
2b40: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
2b50: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
2b60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2b70: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
2b80: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
2b90: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
2ba0: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
2bb0: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
2bc0: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
2bd0: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
2be0: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
2bf0: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
2c00: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
2c10: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
2c20: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
2c30: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
2c40: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
2c50: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
2c60: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
2c70: 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61  .** The Op.opfla
2c80: 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  gs field is set 
2c90: 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a  on all opcodes..
2ca0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2cb0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
2cc0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
2cd0: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
2ce0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
2cf0: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
2d00: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
2d10: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
2d20: 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  p->aLabel;.  p->
2d30: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
2d40: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
2d50: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
2d60: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
2d70: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
2d80: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
2d90: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20   pOp->opflags = 
2da0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
2db0: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20  perty[opcode];. 
2dc0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2dd0: 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70  P_Function || op
2de0: 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70  code==OP_AggStep
2df0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
2e00: 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29  p->p5>nMaxArgs )
2e10: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
2e20: 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >p5;.    }else i
2e30: 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  f( (opcode==OP_T
2e40: 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f  ransaction && pO
2e50: 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63  p->p2!=0) || opc
2e60: 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29  ode==OP_Vacuum )
2e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f  {.      p->readO
2e80: 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  nly = 0;.#ifndef
2e90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ea0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
2eb0: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
2ec0: 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20  OP_VUpdate ){.  
2ed0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
2ee0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2ef0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
2f00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2f10: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
2f20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
2f30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2f40: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
2f50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f60: 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
2f70: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
2f80: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
2f90: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
2fa0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2fb0: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
2fc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
2fd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
2fe0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
2ff0: 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20  pOp->p2<0 ){.   
3000: 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f     assert( -1-pO
3010: 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20  p->p2<p->nLabel 
3020: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  );.      pOp->p2
3030: 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70   = aLabel[-1-pOp
3040: 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->p2];.    }.  }
3050: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3060: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
3070: 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20  l);.  p->aLabel 
3080: 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e  = 0;..  *pMaxFun
3090: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
30a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30b0: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
30c0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
30d0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
30e0: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
30f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3100: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
3110: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
3120: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
3130: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
3140: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  >nOp;.}../*.** T
3150: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3160: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
3170: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
3180: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
3190: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
31a0: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
31b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
31c0: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
31d0: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
31e0: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
31f0: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
3200: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
3210: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
3220: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
3230: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
3240: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
3250: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
3260: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
3270: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3280: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
3290: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
32a0: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
32b0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
32c0: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
32d0: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
32e0: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
32f0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
3300: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
3310: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
3320: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
3330: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
3340: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
3350: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
3360: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
3370: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
3380: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
3390: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
33a0: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
33b0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
33c0: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
33d0: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
33e0: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
33f0: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
3400: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
3410: 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61  sert( p->btreeMa
3420: 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f  sk==0 );..  reso
3430: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70  lveP2Values(p, p
3440: 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f  nMaxArg);.  *pnO
3450: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d  p = p->nOp;.  p-
3460: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  >aOp = 0;.  retu
3470: 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aOp;.}../*.**
3480: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
3490: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
34a0: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
34b0: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
34c0: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
34d0: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
34e0: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
34f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
3500: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
3510: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
3520: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
3530: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
3540: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
3550: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3560: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
3570: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f  Op + nOp > p->nO
3580: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
3590: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
35a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
35b0: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
35c0: 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e   if( ALWAYS(nOp>
35d0: 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  0) ){.    int i;
35e0: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
35f0: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
3600: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3610: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
3620: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
3630: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
3640: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
3650: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
3660: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
3670: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
3680: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
3690: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
36a0: 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 28     if( p2<0 && (
36b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
36c0: 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f  perty[pOut->opco
36d0: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  de] & OPFLG_JUMP
36e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
36f0: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
3700: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
3710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3720: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
3730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3740: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
3750: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
3760: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3770: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
3780: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
3790: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
37a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
37b0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
37c0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  mment = 0;.     
37d0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
37e0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
37f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3800: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
3810: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
3820: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
3830: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
3840: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
3850: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
3860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3870: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3880: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P1 operand for
3890: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
38a0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
38b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
38c0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
38d0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
38e0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
38f0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
3900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3910: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
3920: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
3930: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
3940: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
3950: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3960: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
3970: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e  *p, int addr, in
3980: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
3990: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
39a0: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20  rt( addr>=0 );. 
39b0: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72   if( p->nOp>addr
39c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
39d0: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
39e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
39f0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3a00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
3a10: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3a20: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3a30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3a40: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
3a50: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
3a60: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3a70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3a80: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3a90: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3aa0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3ab0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
3ac0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  0 );.  if( p->nO
3ad0: 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  p>addr ){.    p-
3ae0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
3af0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
3b00: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
3b10: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
3b20: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
3b30: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
3b40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b50: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
3b60: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3b70: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3b80: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
3b90: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
3ba0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3bb0: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3bc0: 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b  [addr].p3 = val;
3bd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3be0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3bf0: 66 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64  f the P5 operand
3c00: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
3c10: 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20  cently.** added 
3c20: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  operation..*/.vo
3c30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3c40: 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20  angeP5(Vdbe *p, 
3c50: 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  u8 val){.  asser
3c60: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( p!=0 );.  if(
3c70: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61   p->aOp ){.    a
3c80: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
3c90: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
3ca0: 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c  >nOp-1].p5 = val
3cb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
3cc0: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
3cd0: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
3ce0: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
3cf0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
3d00: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
3d10: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
3d20: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
3d30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3d40: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
3d50: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
3d60: 7b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  {.  assert( addr
3d70: 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=0 );.  sqlite3
3d80: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
3d90: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
3da0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
3db0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
3dc0: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
3dd0: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
3de0: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
3df0: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
3e00: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
3e10: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
3e20: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
3e30: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71  meralFunction(sq
3e40: 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44  lite3 *db, FuncD
3e50: 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28  ef *pDef){.  if(
3e60: 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26 26   ALWAYS(pDef) &&
3e70: 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
3e80: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
3e90: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
3ea0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3eb0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
3ec0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
3ed0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
3ee0: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
3ef0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
3f00: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
3f10: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
3f20: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
3f30: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
3f40: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
3f50: 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20  .  if( p4 ){.   
3f60: 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20   assert( db );. 
3f70: 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70     switch( p4typ
3f80: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
3f90: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63  P4_REAL:.      c
3fa0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
3fb0: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
3fc0: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
3fd0: 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20  P4_KEYINFO:.    
3fe0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
3ff0: 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AY:.      case P
4000: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
4010: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  F: {.        sql
4020: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4030: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
4040: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4050: 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46   case P4_MPRINTF
4060: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4070: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4080: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72  ==0 ) sqlite3_fr
4090: 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20  ee(p4);.        
40a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
40b0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44 42       case P4_VDB
40c0: 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20  EFUNC: {.       
40d0: 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65   VdbeFunc *pVdbe
40e0: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
40f0: 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66   *)p4;.        f
4100: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
4110: 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75  tion(db, pVdbeFu
4120: 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20  nc->pFunc);.    
4130: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
4140: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
4150: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
4160: 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63  uxData(pVdbeFunc
4170: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
4180: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4190: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
41a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
41b0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
41c0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
41d0: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
41e0: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
41f0: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
4200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4210: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4220: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20  4_MEM: {.       
4230: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4240: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
4250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
4260: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
4270: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
4280: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4290: 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d       Mem *p = (M
42a0: 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  em*)p4;.        
42b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
42c0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
42d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
42e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
42f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4310: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4320: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20  VTAB : {.       
4330: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4340: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4350: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
4360: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
4370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4380: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4390: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
43a0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
43b0: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
43c0: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
43d0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
43e0: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
43f0: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
4400: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
4410: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
4420: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
4430: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
4440: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
4450: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
4460: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
4470: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
4480: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
4490: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
44a0: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
44b0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
44c0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
44d0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
44e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
44f0: 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74  EBUG.      sqlit
4500: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
4510: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e  ->zComment);.#en
4520: 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  dif     .    }. 
4530: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
4540: 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a  ee(db, aOp);.}..
4550: 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53  /*.** Link the S
4560: 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74  ubProgram object
4570: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
4580: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
4590: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a  nto the linked.*
45a0: 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70  * list at Vdbe.p
45b0: 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73  SubProgram. This
45c0: 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f   list is used to
45d0: 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d   delete all sub-
45e0: 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63  program.** objec
45f0: 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69  ts when the VM i
4600: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  s no longer requ
4610: 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ired..*/.void sq
4620: 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62  lite3VdbeLinkSub
4630: 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56  Program(Vdbe *pV
4640: 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20  dbe, SubProgram 
4650: 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  *p){.  p->pNext 
4660: 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61  = pVdbe->pProgra
4670: 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f  m;.  pVdbe->pPro
4680: 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  gram = p;.}../*.
4690: 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f  ** Change N opco
46a0: 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  des starting at 
46b0: 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a  addr to No-ops..
46c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
46d0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
46e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
46f0: 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  r, int N){.  if(
4700: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
4710: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
4720: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
4730: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4740: 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  >db;.    while( 
4750: 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65  N-- ){.      fre
4760: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4770: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4780: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  .      memset(pO
4790: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
47a0: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70  [0]));.      pOp
47b0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
47c0: 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b  op;.      pOp++;
47d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
47e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
47f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
4800: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
4810: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
4820: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
4830: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
4840: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
4850: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
4860: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
4870: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
4880: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
4890: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
48a0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
48b0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
48c0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
48d0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
48e0: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
48f0: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
4900: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
4910: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
4920: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
4930: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4940: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4950: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
4960: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
4970: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
4980: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
4990: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
49a0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
49b0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
49c0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a  es of zP4..**.**
49d0: 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46   If n==P4_KEYINF
49e0: 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  O it means that 
49f0: 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72  zP4 is a pointer
4a00: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4a10: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f  ructure..** A co
4a20: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
4a30: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
4a40: 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ure into memory 
4a50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
4a60: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c   sqlite3_malloc,
4a70: 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65   to be freed whe
4a80: 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69  n the Vdbe is fi
4a90: 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50  nalized..** n==P
4aa0: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
4ab0: 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  F indicates that
4ac0: 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61   zP4 points to a
4ad0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
4ae0: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
4af0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20  memory that the 
4b00: 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69  caller has obtai
4b10: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
4b20: 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a  _malloc. The .**
4b30: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
4b40: 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f  ot free the allo
4b50: 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  cation, it will 
4b60: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
4b70: 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e  e Vdbe is.** fin
4b80: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f  alized..** .** O
4b90: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
4ba0: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
4bb0: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
4bc0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
4bd0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
4be0: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
4bf0: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
4c00: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
4c10: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
4c20: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
4c30: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
4c40: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
4c50: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
4c60: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
4c70: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
4c80: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
4c90: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
4ca0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4cb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4cc0: 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P4(Vdbe *p, int 
4cd0: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
4ce0: 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP4, int n){. 
4cf0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69   Op *pOp;.  sqli
4d00: 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
4d10: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20  t( p!=0 );.  db 
4d20: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
4d30: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
4d40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
4d50: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
4d60: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
4d70: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20  led ){.    if ( 
4d80: 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26  n!=P4_KEYINFO &&
4d90: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a   n!=P4_VTAB ) {.
4da0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4db0: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
4dc0: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
4dd0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4de0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
4df0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
4e00: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
4e10: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
4e20: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
4e30: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
4e40: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
4e50: 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70  ;.  freeP4(db, p
4e60: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
4e70: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
4e80: 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  4.p = 0;.  if( n
4e90: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
4ea0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
4eb0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
4ec0: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
4ed0: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
4ee0: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
4ef0: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
4f00: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
4f10: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
4f20: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
4f30: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
4f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
4f50: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
4f60: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
4f70: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
4f80: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
4f90: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
4fa0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
4fb0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
4fc0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
4fd0: 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  o;.    int nFiel
4fe0: 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  d, nByte;..    n
4ff0: 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66  Field = ((KeyInf
5000: 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b  o*)zP4)->nField;
5010: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
5020: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b  eof(*pKeyInfo) +
5030: 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65   (nField-1)*size
5040: 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of(pKeyInfo->aCo
5050: 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b  ll[0]) + nField;
5060: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
5070: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5080: 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aw(0, nByte);.  
5090: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
50a0: 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
50b0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
50c0: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f  ){.      u8 *aSo
50d0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d  rtOrder;.      m
50e0: 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 4b 65  emcpy((char*)pKe
50f0: 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74  yInfo, zP4, nByt
5100: 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20  e - nField);.   
5110: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
5120: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5130: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
5140: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
5150: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
5160: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
5170: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
5180: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
5190: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
51a0: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
51b0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
51c0: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
51d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
51e0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
51f0: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
5210: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5220: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
5230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
5240: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
5250: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
5260: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
5270: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5280: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5290: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
52a0: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
52b0: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
52c0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
52d0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
52e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
52f0: 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c  P4_VTAB;.    sql
5300: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
5310: 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20  able *)zP4);.   
5320: 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c   assert( ((VTabl
5330: 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d  e *)zP4)->db==p-
5340: 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  >db );.  }else i
5350: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
5360: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5370: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5380: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
5390: 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b  char)n;.  }else{
53a0: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
53b0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
53c0: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
53d0: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
53e0: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
53f0: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
5400: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5410: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
5420: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
5430: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5440: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74  comment on the t
5450: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5460: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
5470: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72  on.  Or.** inser
5480: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64  t a No-op and ad
5490: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f  d the comment to
54a0: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75   that new instru
54b0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20  ction.  This.** 
54c0: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65  makes the code e
54d0: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75  asier to read du
54e0: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20  ring debugging. 
54f0: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61   None of this ha
5500: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72  ppens.** in a pr
5510: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a  oduction build..
5520: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5530: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
5540: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5550: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5560: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5570: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
5580: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5590: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
55a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
55b0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
55c0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
55d0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
55e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
55f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
5600: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
5610: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
5620: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
5630: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5640: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
5650: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5660: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d   *pz);.    *pz =
5670: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5680: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5690: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
56a0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
56b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
56c0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
56d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
56e0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
56f0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
5700: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
5710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5720: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5730: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5740: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
5750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
5760: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
5770: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5780: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
5790: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
57a0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
57b0: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
57c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
57d0: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
57e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
57f0: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
5800: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
5810: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
5820: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
5830: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5840: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5850: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
5860: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
5870: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5880: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
5890: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
58a0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
58b0: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
58c0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
58d0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
58e0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
58f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5900: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5910: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
5920: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
5930: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
5940: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
5950: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
5960: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5970: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5980: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5990: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
59a0: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
59b0: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
59c0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
59d0: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
59e0: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
59f0: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5a00: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5a10: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5a20: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5a30: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5a40: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5a50: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5a60: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5a70: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5a80: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5a90: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5aa0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5ab0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5ac0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5ad0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5ae0: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5af0: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5b00: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5b10: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5b20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5b30: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5b40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5b50: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5b60: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5b70: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5b80: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5b90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5ba0: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5bb0: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5bc0: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5bd0: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5be0: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5bf0: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5c00: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5c10: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5c20: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5c30: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5c40: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5c50: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5c60: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5c70: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5c80: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5c90: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5ca0: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5cb0: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5cc0: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5cd0: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5ce0: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5cf0: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5d00: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5d10: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5d20: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5d30: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
5d40: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
5d50: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
5d60: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
5d70: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
5d80: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
5d90: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
5da0: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
5db0: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
5dc0: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
5dd0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 64  c const VdbeOp d
5de0: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
5df0: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
5e00: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
5e10: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
5e20: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
5e30: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
5e40: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
5e50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5e60: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
5e70: 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65  ( p->nOp==0 ) re
5e80: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
5e90: 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ummy;.#endif.   
5ea0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
5eb0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
5ec0: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
5ed0: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
5ee0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5ef0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
5f00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5f10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
5f20: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
5f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5f40: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
5f50: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
5f60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5f70: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
5f80: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
5f90: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
5fa0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
5fb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5fc0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
5fd0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
5fe0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
5ff0: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
6000: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
6010: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
6020: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
6030: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
6040: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
6050: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
6060: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
6070: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
6080: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
6090: 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  mp;.  assert( nT
60a0: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69  emp>=20 );.  swi
60b0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
60c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
60d0: 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a  KEYINFO_STATIC:.
60e0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
60f0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
6100: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
6110: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
6120: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
6130: 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
6140: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6150: 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f   zTemp, "keyinfo
6160: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
6170: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69  nField);.      i
6180: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6190: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  30(zTemp);.     
61a0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
61b0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
61c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
61d0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
61e0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
61f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
6200: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
6210: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
6220: 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a  trlen30(pColl->z
6230: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
6240: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
6250: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6260: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
6270: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
6280: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6290: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
62a0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
62b0: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20  = ',';.         
62c0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
62d0: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65  SortOrder && pKe
62e0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
62f0: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
6300: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
6310: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
6320: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
6330: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43  py(&zTemp[i], pC
6340: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b  oll->zName,n+1);
6350: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
6360: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
6370: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
6380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
6390: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
63a0: 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,nil",4);.      
63b0: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
63c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
63d0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
63e0: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
63f0: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
6400: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
6410: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6420: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6430: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
6440: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6450: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
6460: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
6470: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6480: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
6490: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
64a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
64b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
64c0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
64d0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
64e0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
64f0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
6500: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6510: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
6520: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
6530: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
6540: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6550: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6560: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
6570: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6580: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6590: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
65a0: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      brea
65b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
65c0: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
65d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
65e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
65f0: 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
6600: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
6610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6620: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
6630: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6640: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6650: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
6660: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
6670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6680: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
6690: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
66a0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
66b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
66c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
66d0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20  M_Null)==0 );.  
66e0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
66f0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
6700: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
6710: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
6720: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
6730: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
6740: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6750: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6760: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
6770: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
6780: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
6790: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
67a0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
67b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
67c0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
67d0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
67e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
67f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
6800: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
6810: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
6820: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
6830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6840: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
6850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6860: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
6870: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
6890: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
68a0: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
68b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
68c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
68d0: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
68e0: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
68f0: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
6900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6910: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
6920: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
6930: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6940: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6950: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
6960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6970: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
6980: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
6990: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
69a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
69b0: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
69c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
69e0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
69f0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
6a00: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
6a10: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
6a20: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
6a30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6a40: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6a50: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
6a60: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
6a70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
6a80: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
6a90: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
6aa0: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
6ab0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
6ac0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
6ad0: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
6ae0: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
6af0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
6b00: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
6b10: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
6b20: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 75 73 69  they will be usi
6b30: 6e 67 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  ng.  A mask of t
6b40: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
6b50: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
6b60: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  in p->btreeMask 
6b70: 61 6e 64 20 69 73 20 75 73 65 64 20 66 6f 72 20  and is used for 
6b80: 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6f 74 68 65  locking and othe
6b90: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
6ba0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
6bb0: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
6bc0: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
6bd0: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6be0: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69  >db->nDb && i<(i
6bf0: 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73  nt)sizeof(yDbMas
6c00: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
6c10: 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( i<(int)sizeof(
6c20: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
6c30: 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  );.  p->btreeMas
6c40: 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
6c50: 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31  )<<i;.  if( i!=1
6c60: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
6c70: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
6c80: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
6c90: 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c     p->lockMask |
6ca0: 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
6cb0: 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  i;.  }.}..#if !d
6cc0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6cd0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
6ce0: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
6cf0: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  DSAFE>0./*.** If
6d00: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
6d10: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
6d20: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
6d30: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
6d40: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
6d50: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
6d60: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
6d70: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
6d80: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6d90: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
6da0: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
6db0: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
6dc0: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
6dd0: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
6de0: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
6df0: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
6e00: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
6e10: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
6e20: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
6e30: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
6e40: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
6e50: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
6e60: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
6e70: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
6e80: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
6e90: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
6ea0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
6eb0: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
6ec0: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
6ed0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
6ee0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
6ef0: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
6f00: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
6f10: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
6f20: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
6f30: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
6f40: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
6f50: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
6f60: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
6f70: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
6f80: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
6f90: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6fa0: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
6fb0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6fc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
6fd0: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
6fe0: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
6ff0: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
7000: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
7010: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
7020: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
7030: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
7040: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
7050: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
7060: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
7070: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
7080: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
7090: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
70a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
70b0: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
70c0: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
70d0: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
70e0: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
70f0: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
7100: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
7110: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7120: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7130: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
7140: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
7150: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
7160: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
7170: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
7180: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
7190: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
71a0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
71b0: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
71c0: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
71d0: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
71e0: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
71f0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
7200: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
7210: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
7220: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7240: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
7250: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
7260: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
7270: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7280: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
7290: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
72a0: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
72b0: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
72c0: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
72d0: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
72e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
72f0: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69  eEnter()..*/.voi
7300: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
7310: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
7320: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7330: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7340: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7350: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7360: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
7370: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
7380: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
7390: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
73a0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
73b0: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
73c0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
73d0: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
73e0: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
73f0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
7400: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
7410: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
7420: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
7430: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7440: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
7450: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7460: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
7470: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
7480: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
7490: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
74a0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
74b0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
74c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
74d0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
74e0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
74f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
7500: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
7510: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
7520: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
7530: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
7540: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7550: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
7560: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
7570: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
7580: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
7590: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
75a0: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
75b0: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
75c0: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
75d0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
75e0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
75f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
7600: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
7610: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
7620: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
7630: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
7640: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7650: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
7660: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
7670: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
7680: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
7690: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
76a0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
76b0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
76c0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
76d0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
76e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
76f0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
7700: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
7710: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
7720: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
7730: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
7740: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
7750: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
7760: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
7770: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7780: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
7790: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
77a0: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
77b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
77c0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
77d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
77e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
77f0: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
7800: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
7810: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
7820: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
7830: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
7840: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
7850: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
7860: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
7870: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
7880: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
7890: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
78a0: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
78b0: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
78c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
78d0: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
78e0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
78f0: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
7900: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
7910: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
7920: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
7930: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
7940: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
7950: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
7960: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
7970: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
7980: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
7990: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
79a0: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
79b0: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
79c0: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
79d0: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
79e0: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
79f0: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
7a00: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
7a10: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
7a20: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
7a30: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
7a40: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
7a50: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
7a60: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
7a70: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
7a80: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
7a90: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
7aa0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
7ab0: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
7ac0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
7ad0: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
7ae0: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
7af0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
7b00: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
7b10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7b20: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
7b30: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
7b40: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
7b50: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
7b60: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7b70: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
7b80: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c  else if( p->zMal
7b90: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
7ba0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7bb0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
7bc0: 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63        p->zMalloc
7bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
7be0: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
7bf0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  MEM_Null;.    }.
7c00: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7c10: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
7c20: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
7c30: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
7c40: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
7c50: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
7c60: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
7c70: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
7c80: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
7c90: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
7ca0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7cb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7cc0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
7cd0: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
7ce0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
7cf0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
7d00: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
7d10: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
7d20: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
7d30: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
7d40: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7d50: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
7d60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
7d70: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
7d80: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
7d90: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
7da0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
7db0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
7dc0: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
7dd0: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
7de0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
7df0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
7e00: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
7e10: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
7e20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
7e30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
7e40: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
7e50: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
7e60: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
7e70: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
7e80: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
7e90: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
7ea0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
7eb0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
7ec0: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
7ed0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
7ee0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
7ef0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
7f00: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
7f10: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
7f20: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
7f30: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
7f40: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
7f50: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
7f60: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
7f70: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
7f80: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
7f90: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
7fa0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
7fb0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
7fc0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
7fd0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
7fe0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
7ff0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
8000: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
8010: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
8020: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
8030: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
8040: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
8050: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
8060: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8080: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
8090: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
80c0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
80d0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
80e0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8110: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
8120: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
8130: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
8140: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8150: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
8160: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
8170: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
81a0: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
81b0: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
81c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
81d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
81e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
81f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8200: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8230: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8270: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
8280: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
8290: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f   &p->aMem[1];  /
82a0: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
82b0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
82c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
82d0: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
82e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
82f0: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
8300: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
8310: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
8320: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
8330: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8340: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
8350: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
8360: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
8370: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
8380: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
8390: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
83a0: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
83b0: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
83c0: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
83d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
83e0: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
83f0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
8400: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
8410: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
8420: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
8430: 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  8);..  if( p->rc
8440: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
8450: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
8460: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
8470: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
8480: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
8490: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
84a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
84b0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
84c0: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
84d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
84e0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
84f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
8500: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
8510: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
8520: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
8530: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
8540: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
8550: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
8560: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
8570: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
8580: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
8590: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
85a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
85b0: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
85c0: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
85d0: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
85e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
85f0: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
8600: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
8610: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
8620: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
8630: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
8640: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
8650: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
8660: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
8670: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
8680: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
8690: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
86a0: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
86b0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
86c0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
86d0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
86e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
86f0: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
8700: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
8710: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
8720: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
8730: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
8740: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
8750: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
8760: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
8770: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
8780: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
8790: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
87a0: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
87b0: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
87c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
87d0: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
87e0: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
87f0: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
8800: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
8810: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
8820: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
8830: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
8840: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
8850: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
8860: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
8870: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
8880: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
8890: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
88a0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
88b0: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
88c0: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
88d0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
88e0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
88f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
8900: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
8910: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
8920: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
8930: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
8940: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
8950: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
8960: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
8970: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
8980: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
8990: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
89a0: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
89b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
89c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
89d0: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
89e0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
89f0: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
8a00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
8a10: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
8a20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8a30: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
8a40: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
8a50: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
8a60: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
8a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8a80: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
8a90: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
8aa0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
8ab0: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
8ac0: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
8ad0: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
8ae0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
8af0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
8b00: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
8b10: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
8b20: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
8b30: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
8b40: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
8b50: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
8b60: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
8b70: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
8b80: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
8b90: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
8ba0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
8bb0: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
8bc0: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
8bd0: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
8be0: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
8bf0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
8c00: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
8c10: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
8c20: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
8c30: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
8c40: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8c50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8c60: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
8c70: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8c80: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
8c90: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
8cd0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
8ce0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
8cf0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
8d00: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
8d10: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
8d20: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
8d30: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8d40: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20  (pOp->opcode);  
8d50: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
8d60: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
8d70: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
8d80: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
8d90: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
8da0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
8db0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8dc0: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
8dd0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
8de0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
8df0: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
8e00: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
8e10: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
8e20: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
8e30: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
8e40: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
8e50: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
8e60: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
8e70: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
8e80: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
8e90: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
8ea0: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
8eb0: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
8ec0: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
8ed0: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
8ee0: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
8ef0: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
8f00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
8f10: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
8f20: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
8f30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
8f40: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
8f50: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
8f60: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
8f70: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
8f80: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
8f90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8fa0: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
8fb0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
8fc0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
8fd0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
8fe0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
8ff0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
9000: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31  w(pSub, nByte, 1
9010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
9020: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
9030: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
9040: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
9050: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
9060: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
9070: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
9080: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
9090: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
90a0: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
90b0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
90c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
90d0: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
90e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
90f0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
9100: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
9130: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9140: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
9150: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
9160: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
9170: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
9180: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
91b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
91c0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
91d0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
91e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
91f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
9200: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
9230: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
9240: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
9250: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
9260: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9270: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
9280: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
9290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
92a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
92b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
92c0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
92d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
92e0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
92f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
9300: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9310: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
9320: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
9330: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
9340: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
9350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
9360: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
9370: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
9380: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
9390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
93a0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
93b0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
93c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
93d0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
93e0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
93f0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
9400: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9410: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
9420: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
9430: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
9440: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9450: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
9460: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
9470: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
9480: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9490: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
94a0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
94b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
94c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
94d0: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
94e0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
94f0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
9500: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9510: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
9520: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
9530: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
9540: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9550: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
9560: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
9570: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
9580: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
9590: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
95a0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
95b0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
95c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
95d0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
95e0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
95f0: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
9600: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
9610: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9620: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
9630: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
9640: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
9650: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
9660: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
9670: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
9680: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
9690: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
96a0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
96d0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
96e0: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
96f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9700: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
9710: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
9720: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
9730: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
9740: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9750: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
9760: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
9770: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
9780: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
9790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
97a0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
97b0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
97c0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
97d0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
97e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
97f0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
9800: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
9810: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
9820: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
9830: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9840: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9850: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9860: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9870: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9880: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9890: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
98a0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
98b0: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
98c0: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
98d0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
98e0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
98f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9900: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
9910: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9920: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
9930: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
9940: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
9950: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
9960: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9970: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
9980: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9990: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
99a0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
99b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
99c0: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
99d0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
99e0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
99f0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
9a00: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
9a10: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
9a20: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
9a30: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
9a40: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
9a50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9a60: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
9a70: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
9a80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
9a90: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9aa0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
9ab0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
9ac0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9ad0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9ae0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
9af0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
9b00: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
9b10: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
9b20: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9b30: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
9b40: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
9b50: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
9b60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
9b70: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
9b80: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9b90: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9ba0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
9bb0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9bc0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
9bd0: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
9be0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
9bf0: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
9c00: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
9c10: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
9c20: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9c30: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
9c40: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
9c50: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
9c60: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
9c70: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
9c80: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
9c90: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
9ca0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
9cb0: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
9cc0: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
9cd0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
9ce0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
9cf0: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
9d00: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
9d10: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
9d20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
9d30: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
9d40: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
9d50: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
9d60: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
9d70: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
9d80: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
9d90: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
9da0: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
9db0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
9dc0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9dd0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
9de0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
9df0: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f  ppFrom points to
9e00: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
9e10: 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73   and pEnd points
9e20: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9e30: 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  he.** available 
9e40: 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61  space.  When spa
9e50: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ce is allocated,
9e60: 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61   *ppFrom is adva
9e70: 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65  nced past.** the
9e80: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
9e90: 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a  cated space..**.
9ea0: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
9eb0: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
9ec0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9ed0: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
9ee0: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
9ef0: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
9f00: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
9f10: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
9f20: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
9f30: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
9f40: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
9f50: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
9f60: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
9f70: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
9f80: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
9f90: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
9fa0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
9fb0: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77  return pointer w
9fc0: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f  ill be stored */
9fd0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
9fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9ff0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c  r of bytes to al
a000: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a  locate */.  u8 *
a010: 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  *ppFrom,        
a020: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f   /* IN/OUT: Allo
a030: 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f  cate from *ppFro
a040: 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c  m */.  u8 *pEnd,
a050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a060: 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65  ointer to 1 byte
a070: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a080: 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20   *ppFrom buffer 
a090: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65  */.  int *pnByte
a0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
a0b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
a0c0: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
a0d0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
a0e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
a0f0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
a100: 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20  T(*ppFrom) );.  
a110: 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72  if( pBuf ) retur
a120: 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20  n pBuf;.  nByte 
a130: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
a140: 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d  .  if( &(*ppFrom
a150: 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64  )[nByte] <= pEnd
a160: 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28   ){.    pBuf = (
a170: 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  void*)*ppFrom;. 
a180: 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42     *ppFrom += nB
a190: 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  yte;.  }else{.  
a1a0: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
a1b0: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
a1c0: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
a1d0: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
a1e0: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
a1f0: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
a200: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
a210: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
a220: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
a230: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
a240: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
a250: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
a260: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
a270: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
a280: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
a290: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
a2a0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
a2b0: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
a2c0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
a2d0: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61  ly way to move a
a2e0: 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f   VDBE from VDBE_
a2f0: 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a  MAGIC_INIT to.**
a300: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e   VDBE_MAGIC_RUN.
a310: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
a320: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
a330: 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
a340: 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69  e on a single vi
a350: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
a360: 2a 20 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * The first call
a370: 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63   is made while c
a380: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c  ompiling the SQL
a390: 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73   statement. Subs
a3a0: 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20  equent.** calls 
a3b0: 61 72 65 20 6d 61 64 65 20 61 73 20 70 61 72 74  are made as part
a3c0: 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   of the process 
a3d0: 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61 20 73  of resetting a s
a3e0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a  tatement to be.*
a3f0: 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20 28 66  * re-executed (f
a400: 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  rom a call to sq
a410: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20  lite3_reset()). 
a420: 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20  The nVar, nMem, 
a430: 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20  nCursor .** and 
a440: 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65  isExplain parame
a450: 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61  ters are only pa
a460: 73 73 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c  ssed correct val
a470: 75 65 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ues the first ti
a480: 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69  me.** the functi
a490: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e  on is called. On
a4a0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
a4b0: 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  s, from sqlite3_
a4c0: 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a  reset(), nVar.**
a4d0: 20 69 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e   is passed -1 an
a4e0: 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20  d nMem, nCursor 
a4f0: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72  and isExplain ar
a500: 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72  e all passed zer
a510: 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
a520: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
a530: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
a560: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
a590: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
a5a0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
a5b0: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
a5e0: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
a5f0: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
a600: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
a610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a620: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
a630: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
a640: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a660: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
a670: 20 6f 66 20 61 72 67 73 20 69 6e 20 53 75 62 50   of args in SubP
a680: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
a690: 20 69 73 45 78 70 6c 61 69 6e 2c 20 20 20 20 20   isExplain,     
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a6b0: 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41  rue if the EXPLA
a6c0: 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70  IN keywords is p
a6d0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
a6e0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a700: 75 65 20 74 6f 20 73 65 74 20 56 64 62 65 2e 75  ue to set Vdbe.u
a710: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a  sesStmtJournal *
a720: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
a730: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
a740: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
a750: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
a760: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
a770: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
a780: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
a790: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
a7a0: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
a7b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
a7c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
a7d0: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
a7e0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
a7f0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
a800: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
a810: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
a820: 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  RUN;..  /* For e
a830: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
a840: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
a850: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
a860: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
a870: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
a880: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
a890: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
a8a0: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
a8b0: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
a8c0: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
a8d0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
a8e0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
a8f0: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
a900: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
a910: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
a920: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
a930: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
a940: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
a950: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
a960: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
a970: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
a980: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
a990: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
a9a0: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
a9b0: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
a9c0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
a9d0: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
a9e0: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
a9f0: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
aa00: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
aa10: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
aa20: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
aa30: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
aa40: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
aa50: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
aa60: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
aa70: 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f  ts in. This is o
aa80: 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a  nly done the.  *
aa90: 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  * first time thi
aaa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
aab0: 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e  lled for a given
aac0: 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20   VDBE, not when 
aad0: 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  it is.  ** being
aae0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c   called from sql
aaf0: 69 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20  ite3_reset() to 
ab00: 72 65 73 65 74 20 74 68 65 20 76 69 72 74 75 61  reset the virtua
ab10: 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a  l machine..  */.
ab20: 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26    if( nVar>=0 &&
ab30: 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c   ALWAYS(db->mall
ab40: 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a  ocFailed==0) ){.
ab50: 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28      u8 *zCsr = (
ab60: 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e  u8 *)&p->aOp[p->
ab70: 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d  nOp];       /* M
ab80: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
ab90: 66 6f 72 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f  for alloation */
aba0: 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20  .    u8 *zEnd = 
abb0: 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d  (u8 *)&p->aOp[p-
abc0: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
abd0: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
abe0: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f  available mem */
abf0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac20: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
ac30: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
ac40: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
ac50: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
ac60: 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a      p->usesStmtJ
ac70: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
ac80: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20  sStmtJournal;.  
ac90: 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20    if( isExplain 
aca0: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
acb0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
acc0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
acd0: 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43  zCsr, 0, zEnd-zC
ace0: 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d  sr);.    zCsr +=
acf0: 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29   (zCsr - (u8*)0)
ad00: 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  &7;.    assert( 
ad10: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
ad20: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20  MENT(zCsr) );.. 
ad30: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72     /* Memory for
ad40: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
ad50: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
ad60: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
ad70: 64 20 69 6e 20 74 77 6f 0a 20 20 20 20 2a 2a 20  d in two.    ** 
ad80: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
ad90: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
ada0: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
adb0: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
adc0: 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
add0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
ade0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
adf0: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
ae00: 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  l memory.    ** 
ae10: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
ae20: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
ae30: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
ae40: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
ae50: 20 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20     ** pass will 
ae60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
ae70: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
ae80: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 20  llocation.  .   
ae90: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
aea0: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
aeb0: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
aec0: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
aed0: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
aee0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
aef0: 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  r space at the e
af00: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
af10: 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69   array can signi
af20: 66 69 63 61 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  ficantly.    ** 
af30: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
af40: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
af50: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
af60: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
af70: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
af80: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  nByte = 0;.     
af90: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
afa0: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
afb0: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
afc0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
afd0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
afe0: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
aff0: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  e(p->aVar, nVar*
b000: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
b010: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b020: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  );.      p->apAr
b030: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
b040: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
b050: 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73  zeof(Mem*), &zCs
b060: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b070: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
b080: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b090: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
b0a0: 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73  eof(char*), &zCs
b0b0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b0c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
b0d0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b0e0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
b0f0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
b100: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b130: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
b140: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
b150: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
b160: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
b170: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
b180: 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20     }.      zCsr 
b190: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
b1a0: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
b1b0: 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Byte];.    }whil
b1c0: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
b1d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b1e0: 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ..    p->nCursor
b1f0: 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b   = (u16)nCursor;
b200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72  .    if( p->aVar
b210: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61   ){.      p->nVa
b220: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
b230: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
b240: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
b250: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b260: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
b270: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  l;.        p->aV
b280: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
b290: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b2a0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
b2b0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b        p->aMem--;
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
b2e0: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
b2f0: 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  m */.      p->nM
b300: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
b310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
b320: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
b330: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20  nMem-1 */.      
b340: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
b350: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
b360: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
b370: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
b380: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
b390: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
b3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
b3b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b3c0: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e   for(n=1; n<p->n
b3d0: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61  Mem; n++){.    a
b3e0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e  ssert( p->aMem[n
b3f0: 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a  ].db==db );.  }.
b400: 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20  #endif..  p->pc 
b410: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
b420: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
b430: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
b440: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70  _Abort;.  p->exp
b450: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
b460: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
b470: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
b480: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
b490: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
b4a0: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
b4b0: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
b4c0: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
b4d0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
b4e0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
b4f0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
b500: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74  FILE.  {.    int
b510: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
b520: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
b530: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
b540: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  .cnt = 0;.      
b550: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
b560: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
b570: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
b580: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
b590: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
b5a0: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
b5b0: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
b5c0: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
b5d0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
b5e0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
b5f0: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
b600: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
b610: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
b620: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b630: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
b640: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
b650: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
b660: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
b670: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
b680: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
b690: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
b6a0: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
b6b0: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
b6c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
b6d0: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
b6e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
b6f0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
b700: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
b710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b720: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
b730: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
b740: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b750: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
b760: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
b770: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
b780: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
b790: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
b7a0: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
b7b0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
b7c0: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f  hod = 1;.    pMo
b7d0: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
b7e0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  abCursor);.    p
b7f0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
b800: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
b810: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
b820: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
b830: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
b840: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
b850: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
b860: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
b870: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
b880: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
b890: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
b8a0: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
b8b0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
b8c0: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
b8d0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
b8e0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
b8f0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
b900: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
b910: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
b920: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
b930: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
b940: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
b950: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
b960: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
b970: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
b980: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
b990: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
b9a0: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
b9b0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
b9c0: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
b9d0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
b9e0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
b9f0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
ba00: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
ba10: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
ba20: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
ba30: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
ba40: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
ba50: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
ba60: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
ba70: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
ba80: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
ba90: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
baa0: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
bab0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
bac0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
bad0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
bae0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
baf0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
bb00: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
bb10: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
bb20: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
bb30: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
bb40: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
bb50: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
bb60: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
bb70: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
bb80: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
bb90: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
bba0: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
bbb0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
bbc0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
bbd0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
bbe0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
bbf0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
bc00: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
bc10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
bc20: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
bc30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
bc40: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
bc50: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
bc60: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
bc70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
bc80: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
bc90: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
bca0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
bcb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
bcc0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
bcd0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
bce0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
bcf0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
bd00: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
bd10: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
bd20: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
bd30: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
bd40: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
bd50: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
bd60: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
bd70: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
bd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
bd90: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
bda0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
bdb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
bdc0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
bdd0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
bde0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
bdf0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
be00: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
be10: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
be20: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
be30: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
be40: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
be50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
be60: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
be70: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
be80: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
be90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
bea0: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
beb0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
bec0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
bed0: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
bee0: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
bef0: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
bf00: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
bf10: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
bf20: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
bf30: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
bf40: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
bf50: 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e  >apCsr==0 || p->
bf60: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
bf70: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
bf80: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
bf90: 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c  t( p->aMem==0 ||
bfa0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
bfb0: 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23  s==MEM_Null );.#
bfc0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
bfd0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
bfe0: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
bff0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
c000: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
c010: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c020: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c030: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
c040: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
c050: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
c060: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
c070: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
c080: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
c090: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
c0a0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
c0b0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
c0c0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
c0d0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
c0e0: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
c0f0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
c100: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
c110: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
c120: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
c130: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
c140: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
c150: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
c160: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
c170: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c180: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
c190: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
c1a0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
c1b0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
c1c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c1d0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
c1e0: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
c1f0: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
c200: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
c210: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
c220: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
c230: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
c240: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c250: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
c260: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
c270: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
c280: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
c290: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
c2a0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
c2b0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
c2c0: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
c2d0: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
c2e0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
c2f0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
c300: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
c310: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
c320: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
c330: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
c340: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
c350: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
c360: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
c370: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
c380: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
c390: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
c3a0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c3b0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
c3c0: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
c3d0: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
c3e0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
c3f0: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
c400: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
c410: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
c420: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
c430: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
c440: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
c450: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
c460: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
c470: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
c480: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
c490: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
c4a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
c4b0: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
c4e0: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
c4f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c520: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
c530: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
c540: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c570: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
c580: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
c590: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
c5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
c5b0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
c5c0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
c5d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
c5e0: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
c5f0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
c600: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
c610: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
c620: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
c630: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
c640: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
c650: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
c660: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
c670: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
c680: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c690: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
c6a0: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
c6b0: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
c6c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c6d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c6e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
c6f0: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
c700: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
c710: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
c720: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
c730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
c740: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
c750: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
c760: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
c770: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
c780: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
c790: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
c7a0: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
c7b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
c7d0: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
c7e0: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
c7f0: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
c800: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
c810: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
c820: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
c830: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
c840: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
c850: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
c860: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
c870: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
c880: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
c890: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
c8a0: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
c8b0: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
c8c0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
c8d0: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
c8e0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
c8f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
c900: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
c910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
c920: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
c930: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
c940: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
c950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c960: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
c970: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
c980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c990: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
c9a0: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
c9b0: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
c9c0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
c9d0: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
c9e0: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
c9f0: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
ca00: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
ca10: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
ca20: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
ca30: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
ca40: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
ca50: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
ca60: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
ca70: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
ca80: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
ca90: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
caa0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
cab0: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
cac0: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
cad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cae0: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
caf0: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
cb00: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
cb10: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
cb20: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
cb30: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
cb40: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
cb50: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
cb60: 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  (db, &p->zErrMsg
cb70: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
cb80: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
cb90: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
cba0: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
cbb0: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
cbc0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
cbd0: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
cbe0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
cbf0: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
cc00: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
cc10: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
cc20: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
cc30: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
cc40: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
cc50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
cc60: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
cc70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
cc80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
cc90: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
cca0: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
ccb0: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
ccc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
ccd0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
cce0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ccf0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
cd00: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
cd10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
cd20: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
cd30: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
cd40: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
cd50: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
cd60: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63  rans++;.      rc
cd70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
cd80: 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
cd90: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
cda0: 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Bt));.    }.  }.
cdb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cdc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
cdd0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
cde0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
cdf0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
ce00: 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
ce10: 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
ce20: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
ce30: 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
ce40: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
ce50: 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
ce60: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
ce70: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
ce80: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ce90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cea0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ceb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
cec0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
ced0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
cee0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
cef0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
cf00: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
cf10: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
cf20: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
cf30: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
cf40: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
cf50: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
cf60: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
cf70: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
cf80: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
cf90: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
cfa0: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
cfb0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
cfc0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
cfd0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
cfe0: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
cff0: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
d000: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
d010: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
d020: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
d030: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
d040: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
d050: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
d060: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
d070: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
d080: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
d090: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
d0a0: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
d0b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
d0c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d0d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d0e0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
d0f0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d100: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
d110: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
d120: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d130: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
d140: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
d150: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
d160: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
d170: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
d180: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
d190: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
d1a0: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
d1b0: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
d1c0: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
d1d0: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
d1e0: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
d1f0: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
d200: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
d210: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
d220: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
d230: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
d240: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
d250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
d260: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d270: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d280: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
d290: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d2a0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d2b0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d2c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d2d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d2e0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d2f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d300: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d310: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
d320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d330: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d340: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
d350: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
d360: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
d370: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
d380: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
d390: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
d3a0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
d3b0: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
d3c0: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
d3d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d3e0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
d3f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
d400: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
d410: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
d420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d430: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
d440: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
d450: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
d460: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
d470: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
d480: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
d490: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
d4a0: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
d4b0: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
d4c0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
d4d0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
d4e0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
d4f0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
d500: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d510: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
d520: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d530: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20      int res;..  
d540: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
d550: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d560: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f  e name */.    do
d570: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
d580: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ndom;.      sqli
d590: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
d5a0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
d5b0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
d5c0: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
d5d0: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
d5e0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
d5f0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d600: 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61  "%s-mj%08X", zMa
d610: 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26  inFile, iRandom&
d620: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0x7fffffff);.   
d630: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
d640: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d650: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d670: 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
d680: 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
d690: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
d6a0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
d6b0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
d6c0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
d6d0: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
d6e0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
d6f0: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
d700: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d710: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d720: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
d730: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
d740: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d750: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
d760: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
d770: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
d780: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
d790: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
d7a0: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
d7b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
d7c0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
d7d0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
d7e0: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
d7f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
d800: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d810: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
d820: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
d830: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
d840: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
d850: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
d860: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
d870: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
d880: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
d890: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
d8a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d8b0: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
d8c0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
d8d0: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
d8e0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
d8f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d900: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
d910: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
d920: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
d930: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
d940: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
d950: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
d960: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
d970: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
d980: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
d990: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
d9a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d9b0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
d9c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
d9d0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
d9e0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
d9f0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
da00: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
da10: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
da20: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
da30: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
da40: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
da50: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
da60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
da70: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
da80: 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
da90: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
daa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
dab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
dac0: 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
dad0: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
dae0: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
daf0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
db00: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
db10: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
db20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
db40: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
db50: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
db60: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
db70: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
db80: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
db90: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
dba0: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
dbb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dbc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
dbd0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
dbe0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
dbf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
dc00: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
dc10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
dc20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
dc30: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
dc40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dc50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dc60: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
dc70: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
dc80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
dc90: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
dca0: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
dcb0: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
dcc0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
dcd0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
dce0: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
dcf0: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
dd00: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
dd10: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
dd20: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
dd30: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
dd40: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
dd50: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
dd60: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
dd70: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
dd80: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
dd90: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
dda0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
ddb0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
ddc0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
ddd0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
dde0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
ddf0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
de00: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
de10: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
de20: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
de30: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
de40: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
de50: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
de60: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
de70: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
de80: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
de90: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
dea0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
deb0: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
dec0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
ded0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
dee0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
def0: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
df00: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
df10: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
df20: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
df30: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
df40: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
df50: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
df60: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
df70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
df80: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
df90: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
dfa0: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
dfb0: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
dfc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
dfd0: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
dfe0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
dff0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
e000: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
e010: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
e020: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
e030: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e040: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e050: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
e060: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e070: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
e080: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e090: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
e0a0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
e0b0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
e0c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e0d0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
e0e0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
e0f0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e100: 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
e110: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e130: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e140: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
e150: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
e160: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
e170: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e180: 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
e190: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
e1a0: 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
e1b0: 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
e1c0: 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
e1d0: 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
e1e0: 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
e1f0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
e200: 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
e210: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
e220: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
e230: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
e240: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
e250: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e260: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
e270: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
e280: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
e290: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
e2a0: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
e2b0: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
e2c0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
e2d0: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
e2e0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
e2f0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
e300: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e310: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
e320: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
e330: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
e340: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
e350: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
e360: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
e370: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
e380: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
e390: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
e3a0: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
e3b0: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
e3c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
e3d0: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
e3e0: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
e3f0: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
e400: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
e410: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
e420: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
e430: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
e440: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
e450: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
e460: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
e470: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
e480: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
e490: 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
e4a0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
e4b0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
e4c0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e4d0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e4e0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e4f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
e500: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
e510: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
e520: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
e530: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
e540: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
e550: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
e560: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
e570: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
e580: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
e590: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
e5a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
e5b0: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
e5c0: 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62  qlite3.activeVdb
e5d0: 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61  eCnt count varia
e5e0: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
e5f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
e600: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
e610: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
e620: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
e630: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
e640: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
e650: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
e660: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
e670: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
e680: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
e690: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
e6a0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
e6b0: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
e6c0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
e6d0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
e6e0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
e6f0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
e700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
e710: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
e720: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
e730: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
e740: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
e750: 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rite = 0;.  p = 
e760: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
e770: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
e780: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
e790: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
e7a0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
e7b0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
e7c0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
e7d0: 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d   nWrite++;.    }
e7e0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
e7f0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
e800: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
e810: 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73  VdbeCnt );.  ass
e820: 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
e830: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
e840: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
e850: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
e860: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
e870: 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42  *.** For every B
e880: 74 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74  tree that in dat
e890: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e8a0: 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61   db which .** ha
e8b0: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c  s been modified,
e8c0: 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c   "trip" or inval
e8d0: 69 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f  idate each curso
e8e0: 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72  r in.** that Btr
e8f0: 65 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ee might have be
e900: 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74  en modified so t
e910: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hat the cursor.*
e920: 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75  * can never be u
e930: 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73  sed again.  This
e940: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20   happens when a 
e950: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63  rollback.*** occ
e960: 75 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  urs.  We have to
e970: 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74   trip all the ot
e980: 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65  her cursors, eve
e990: 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d  n.** cursor from
e9a0: 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69   other VMs in di
e9b0: 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65  fferent database
e9c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a   connections,.**
e9d0: 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66   so that none of
e9e0: 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65   them try to use
e9f0: 20 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69   the data at whi
ea00: 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20  ch they.** were 
ea10: 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69  pointing and whi
ea20: 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20  ch now may have 
ea30: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65  been changed due
ea40: 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  .** to the rollb
ea50: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d  ack..**.** Remem
ea60: 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62  ber that a rollb
ea70: 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74  ack can delete t
ea80: 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61  ables complete a
ea90: 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f  nd.** reorder ro
eaa0: 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20  otpages.  So it 
eab0: 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
eac0: 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a  t just to save.*
ead0: 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  * the state of t
eae0: 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68  he cursor.  We h
eaf0: 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  ave to invalidat
eb00: 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  e the cursor.** 
eb10: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65  so that it is ne
eb20: 76 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a  ver used again..
eb30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
eb40: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
eb50: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
eb60: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
eb70: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
eb80: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
eb90: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
eba0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
ebb0: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20  t;.    if( p && 
ebc0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
ebd0: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
ebe0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
ebf0: 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
ec00: 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20  SQLITE_ABORT);. 
ec10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ec20: 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61  * If the Vdbe pa
ec30: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
ec40: 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65  t argument opene
ec50: 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  d a statement-tr
ec60: 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c  ansaction,.** cl
ec70: 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75  ose it now. Argu
ec80: 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65  ment eOp must be
ec90: 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
eca0: 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a  T_ROLLBACK or.**
ecb0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
ecc0: 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  SE. If it is SAV
ecd0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
ece0: 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
ecf0: 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
ed00: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
ed10: 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56  k. If eOp is SAV
ed20: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
ed30: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61  then the .** sta
ed40: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ed50: 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a  on is commtted..
ed60: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
ed70: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
ed80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
ed90: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
eda0: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
edb0: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
edc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
edd0: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
ede0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
edf0: 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
ee00: 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
ee10: 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
ee20: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
ee30: 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
ee40: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
ee50: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
ee60: 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
ee70: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
ee80: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
ee90: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
eea0: 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
eeb0: 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
eec0: 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
eed0: 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
eee0: 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
eef0: 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
ef00: 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
ef10: 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
ef20: 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
ef30: 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
ef40: 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
ef50: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
ef60: 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
ef70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ef80: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
ef90: 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
efa0: 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
efb0: 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
efc0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
efd0: 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
efe0: 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
eff0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
f000: 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
f010: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
f020: 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
f030: 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
f040: 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
f050: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
f060: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
f070: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
f080: 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
f090: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
f0a0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
f0b0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
f0c0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f0d0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f0e0: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
f0f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
f100: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
f110: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
f120: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
f130: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f140: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
f150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f160: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
f170: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
f180: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f190: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
f1a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f1b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f1c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f1d0: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
f1e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f1f0: 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
f200: 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
f210: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
f220: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
f240: 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
f250: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
f260: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f270: 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
f280: 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
f290: 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
f2a0: 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
f2b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f2c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f2d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
f2e0: 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
f2f0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
f300: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f320: 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
f330: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f340: 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
f350: 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
f360: 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
f370: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
f380: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
f390: 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
f3a0: 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
f3b0: 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
f3c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f3d0: 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
f3e0: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
f3f0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f400: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
f410: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
f420: 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
f430: 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cons;.    }.  }.
f440: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f460: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
f470: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
f480: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
f490: 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
f4a0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
f4b0: 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
f4c0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
f4d0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
f4e0: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
f4f0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f500: 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
f510: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
f520: 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
f530: 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
f540: 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
f550: 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
f560: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
f570: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
f580: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
f590: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
f5a0: 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
f5b0: 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
f5c0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
f5d0: 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
f5e0: 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74  STRAINT and writ
f5f0: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65  e.** an error me
f600: 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
f610: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
f620: 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
f630: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
f640: 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
f650: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
f660: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
f670: 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
f680: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
f690: 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
f6a0: 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
f6b0: 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66  Cons>0) || (!def
f6c0: 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
f6d0: 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a  onstraint>0) ){.
f6e0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
f6f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
f700: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
f710: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
f720: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
f730: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
f740: 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  db, "foreign key
f750: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
f760: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
f770: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
f780: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
f790: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
f7a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f7b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
f7c0: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
f7d0: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
f7e0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
f7f0: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
f800: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
f810: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
f820: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
f830: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
f840: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
f850: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
f860: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
f870: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
f880: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
f890: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
f8a0: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
f8b0: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
f8c0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
f8d0: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
f8e0: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
f8f0: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
f900: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
f910: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
f920: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
f930: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
f940: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
f950: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
f960: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
f970: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
f980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f990: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
f9a0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
f9b0: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
f9c0: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
f9d0: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
f9e0: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
f9f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
fa00: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
fa10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
fa40: 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
fa50: 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
fa60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
fa70: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
fa80: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
fa90: 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
faa0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
fab0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
fac0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
fad0: 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
fae0: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
faf0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
fb00: 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
fb10: 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
fb20: 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
fb30: 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
fb40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
fb50: 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
fb60: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
fb70: 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
fb80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
fb90: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
fba0: 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
fbb0: 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
fbc0: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
fbd0: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
fbe0: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
fbf0: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
fc00: 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
fc10: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
fc20: 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
fc30: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
fc40: 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
fc50: 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
fc60: 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
fc70: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
fc80: 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
fc90: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
fca0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
fcb0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
fcc0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
fcd0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  NOMEM;.  }.  clo
fce0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
fcf0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
fd00: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
fd10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fd20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
fd30: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
fd40: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
fd50: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
fd60: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
fd70: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
fd80: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
fd90: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
fda0: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
fdb0: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
fdc0: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
fdd0: 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
fde0: 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
fdf0: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fe10: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
fe20: 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
fe30: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
fe40: 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
fe50: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
fe60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
fe70: 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
fe80: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
fe90: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
fea0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
feb0: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
fec0: 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ff;.    assert( 
fed0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  p->rc!=SQLITE_IO
fee0: 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20  ERR_BLOCKED );  
fef0: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f  /* This error no
ff00: 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a   longer exists *
ff10: 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  /.    isSpecialE
ff20: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
ff30: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
ff40: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
ff70: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
ff80: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
ff90: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
ffa0: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
ffb0: 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
ffc0: 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
ffd0: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
ffe0: 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
fff0: 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
10000 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
10010 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
10020 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
10030 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
10040 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10050 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
10060 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
10070 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
10080 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
10090 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
100a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
100b0 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
100c0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
100d0 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
100e0 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
100f0 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
10100 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
10110 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
10120 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
10130 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
10140 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  cured while writ
10150 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
10160 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
10170 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
10180 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
10190 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
101a0 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
101b0 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
101c0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
101d0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
101e0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
101f0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
10200 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
10210 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
10220 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
10230 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
10240 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
10250 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
10260 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
10270 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
10280 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
10290 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
102a0 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
102b0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
102c0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
102d0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
102e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
102f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10300 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
10310 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
10320 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
10330 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
10340 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
10350 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
10360 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
10370 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
10380 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
10390 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
103a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
103b0 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
103c0 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
103d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
103e0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
103f0 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
10400 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
10410 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
10420 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
10430 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10440 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10450 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
10460 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
10470 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
10480 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
10490 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
104a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
104b0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
104c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
104d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
104e0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
104f0 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
10500 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
10510 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
10520 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
10530 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
10540 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
10550 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
10560 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
10570 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
10580 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
10590 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
105a0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
105b0 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
105c0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
105d0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
105e0 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
105f0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
10600 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
10610 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72   .     && db->wr
10620 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e  iteVdbeCnt==(p->
10630 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
10640 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
10650 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10660 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
10670 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
10680 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
10690 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
106a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
106b0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
106c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
106d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
106e0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
106f0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
10700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10710 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
10720 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10730 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
10740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10760 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
10770 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20     }else{ .     
10780 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
10790 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
107a0 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70  true, the vdbe p
107b0 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
107c0 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20  ssful .         
107d0 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f   ** or hit an 'O
107e0 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
107f0 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  nt and there are
10800 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72   no deferred for
10810 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  eign.          *
10820 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  * key constraint
10830 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65  s to hold up the
10840 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
10850 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
10860 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
10870 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
10880 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
10890 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
108a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
108b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
108c0 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65  TE_BUSY && p->re
108d0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
108e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
108f0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
10900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10910 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
10920 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
10930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10940 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
10950 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10960 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10970 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10980 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
10990 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
109a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
109b0 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
109c0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
109d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
109e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
109f0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10a00 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
10a10 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
10a20 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
10a30 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
10a40 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
10a50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10a60 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
10a70 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
10a80 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
10a90 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
10aa0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
10ab0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
10ac0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
10ad0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
10ae0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
10af0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10b00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10b10 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
10b20 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
10b30 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
10b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10b50 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
10b70 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
10b80 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
10b90 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
10ba0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
10bb0 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
10bc0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
10bd0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
10be0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10bf0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
10c00 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
10c10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
10c20 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
10c30 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
10c40 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
10c50 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
10c60 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
10c70 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
10c80 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
10c90 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
10ca0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
10cb0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10cc0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
10cd0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
10ce0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
10cf0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
10d00 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
10d10 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
10d20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
10d30 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
10d40 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
10d50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10d60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
10d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
10d80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >rc==SQLITE_CONS
10d90 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
10da0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
10db0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10dc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
10dd0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
10de0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
10df0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
10e00 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
10e10 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
10e20 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
10e30 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
10e40 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
10e50 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
10e60 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
10e70 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
10e80 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
10e90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
10ea0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
10eb0 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
10ec0 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
10ed0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
10ee0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
10ef0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
10f00 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
10f10 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10f20 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
10f30 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
10f40 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
10f50 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
10f60 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
10f70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10f80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
10f90 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
10fa0 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
10fb0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
10fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10fd0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
10fe0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
10ff0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
11000 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
11010 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
11020 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
11030 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
11040 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20  occurred. */.   
11050 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
11060 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61  TE_OK && db->fla
11070 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
11080 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20  Changes ){.     
11090 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
110a0 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
110b0 2d 31 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66  -1);.      db->f
110c0 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  lags = (db->flag
110d0 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s | SQLITE_Inter
110e0 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d  nChanges);.    }
110f0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
11100 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
11110 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11120 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
11130 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
11140 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
11150 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
11160 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
11170 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
11180 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
11190 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b  activeVdbeCnt--;
111a0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
111b0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64  dOnly ){.      d
111c0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d  b->writeVdbeCnt-
111d0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  -;.    }.    ass
111e0 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
111f0 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74  dbeCnt>=db->writ
11200 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a  eVdbeCnt );.  }.
11210 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
11220 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
11230 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
11240 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
11250 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
11260 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
11270 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11280 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
11290 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
112a0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
112b0 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
112c0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
112d0 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
112e0 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
112f0 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
11300 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
11310 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
11320 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
11330 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
11340 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
11350 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
11360 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
11370 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
11380 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
11390 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
113a0 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
113b0 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  eCnt>0 || db->au
113c0 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
113d0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
113e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
113f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
11400 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
11410 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
11420 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
11430 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
11440 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
11450 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
11460 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
11470 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
11480 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
11490 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
114a0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
114b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
114c0 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
114d0 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
114e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
114f0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
11500 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
11510 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
11520 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
11530 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
11540 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
11550 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
11560 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
11570 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
11580 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
11590 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
115a0 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
115b0 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
115c0 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
115d0 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
115e0 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
115f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
11600 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
11610 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
11620 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
11630 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
11640 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
11650 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
11660 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
11670 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
11680 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
11690 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
116a0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
116b0 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
116c0 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
116d0 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
116e0 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
116f0 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
11700 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
11710 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
11720 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
11730 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
11740 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
11750 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
11760 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
11770 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
11780 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
11790 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
117a0 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
117b0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
117c0 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
117d0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
117e0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
117f0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
11800 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
11810 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
11820 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
11830 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
11840 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
11850 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
11860 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
11870 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
11880 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
11890 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
118a0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
118b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
118c0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
118d0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
118e0 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
118f0 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72  >pErr,-1,p->zErr
11900 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  Msg,SQLITE_UTF8,
11910 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11920 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11930 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
11940 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
11950 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
11960 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11970 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
11980 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  );.      p->zErr
11990 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
119a0 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
119b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
119c0 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
119d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
119e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
119f0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
11a00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11a10 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
11a20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
11a30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
11a40 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
11a50 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
11a60 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
11a70 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
11a80 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
11a90 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
11aa0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
11ab0 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
11ac0 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
11ad0 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
11ae0 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
11af0 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
11b00 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
11b10 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
11b20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11b30 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
11b40 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
11b50 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
11b60 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
11b70 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
11b80 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11b90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11ba0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
11bb0 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
11bc0 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
11bd0 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
11be0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
11bf0 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
11c00 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
11c10 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
11c20 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
11c30 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
11c40 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
11c50 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
11c60 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
11c70 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
11c80 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
11c90 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
11ca0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
11cb0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
11cc0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
11cd0 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
11ce0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
11cf0 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
11d00 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
11d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11d20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
11d30 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
11d40 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
11d50 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
11d60 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
11d70 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
11d80 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
11d90 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
11da0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
11db0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
11dc0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
11dd0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
11de0 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
11df0 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
11e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11e10 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
11e20 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
11e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
11e40 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
11e50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
11e60 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
11e70 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
11e80 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
11e90 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
11ea0 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
11eb0 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
11ec0 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
11ed0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
11ee0 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
11ef0 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
11f00 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
11f10 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
11f20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
11f30 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
11f40 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
11f50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11f60 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
11f70 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
11f80 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
11f90 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
11fa0 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
11fb0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
11fc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11fd0 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
11fe0 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
11ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
12000 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
12010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61   rc;.}../*.** Ca
12020 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ll the destructo
12030 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61  r for each auxda
12040 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62  ta entry in pVdb
12050 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a  eFunc for which.
12060 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ** the correspon
12070 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b  ding bit in mask
12080 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64   is clear.  Auxd
12090 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f  ata entries beyo
120a0 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77  nd 31.** are alw
120b0 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20  ays destroyed.  
120c0 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61  To destroy all a
120d0 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20  uxdata entries, 
120e0 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  call this.** rou
120f0 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d  tine with mask==
12100 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
12110 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
12120 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56  ata(VdbeFunc *pV
12130 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73  dbeFunc, int mas
12140 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  k){.  int i;.  f
12150 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46  or(i=0; i<pVdbeF
12160 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b  unc->nAux; i++){
12170 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44  .    struct AuxD
12180 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64  ata *pAux = &pVd
12190 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d  beFunc->apAux[i]
121a0 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20  ;.    if( (i>31 
121b0 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32  || !(mask&(((u32
121c0 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75  )1)<<i))) && pAu
121d0 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
121e0 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
121f0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
12200 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
12210 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
12220 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
12230 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
12240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
12250 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
12260 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
12270 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
12280 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12290 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
122a0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
122b0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
122c0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
122d0 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
122e0 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
122f0 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
12300 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
12310 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
12320 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
12330 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
12340 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12350 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74  VdbeDeleteObject
12360 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
12370 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
12380 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
12390 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  xt;.  assert( p-
123a0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
123b0 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
123c0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
123d0 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
123e0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
123f0 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
12400 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
12410 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
12420 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
12430 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
12440 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
12450 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
12460 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
12470 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
12480 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
12490 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
124a0 75 62 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46  ub);.  }.  vdbeF
124b0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
124c0 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
124d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
124e0 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
124f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12500 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
12510 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12520 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
12530 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12540 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20  db, p->pFree);. 
12550 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12560 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
12570 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
12580 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
12590 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
125a0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
125b0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
125c0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
125d0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
125e0 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  >db;.  if( p->pP
125f0 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
12600 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
12610 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12620 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12630 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20  pVdbe==p );.    
12640 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70  db->pVdbe = p->p
12650 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
12660 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
12670 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
12680 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
12690 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
126a0 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
126b0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c  p->db = 0;.  sql
126c0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62  ite3VdbeDeleteOb
126d0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ject(db, p);.}..
126e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
126f0 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
12700 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
12710 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
12720 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
12730 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
12740 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
12750 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
12760 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
12770 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
12780 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
12790 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
127a0 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
127b0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
127c0 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
127d0 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
127e0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
127f0 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
12800 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
12810 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
12820 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
12830 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
12840 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
12850 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
12860 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
12870 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
12880 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
12890 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
128a0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
128b0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
128c0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
128d0 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
128e0 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
128f0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
12900 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
12910 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
12920 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
12930 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
12940 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
12950 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
12960 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
12970 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
12980 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
12990 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
129a0 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
129b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
129c0 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
129d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
129e0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
129f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12a00 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
12a10 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
12a20 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
12a30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
12a40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12a50 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
12a60 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
12a70 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73  get;.    if( res
12a80 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
12a90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12aa0 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73  ;.    p->rowidIs
12ab0 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65  Valid = 1;.#ifde
12ac0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
12ad0 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
12ae0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
12af0 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
12b00 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
12b10 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
12b20 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
12b30 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
12b40 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
12b50 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64      int hasMoved
12b60 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
12b70 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
12b80 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75  rHasMoved(p->pCu
12b90 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29  rsor, &hasMoved)
12ba0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
12bb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
12bc0 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20  ( hasMoved ){.  
12bd0 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
12be0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
12bf0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52  ;.      p->nullR
12c00 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ow = 1;.    }.  
12c10 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12c20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
12c30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
12c40 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
12c50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
12c60 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
12c70 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
12c80 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
12c90 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
12ca0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12cb0 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
12cc0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
12cd0 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
12ce0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
12cf0 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
12d00 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
12d10 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
12d20 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
12d30 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
12d40 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
12d50 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
12d60 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
12d70 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
12d80 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
12d90 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
12da0 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
12db0 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
12dc0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
12dd0 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
12de0 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
12df0 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
12e00 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
12e10 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
12e20 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
12e30 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
12e40 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
12e50 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
12e60 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
12e70 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
12e80 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
12e90 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
12ea0 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
12eb0 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
12ec0 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
12ed0 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
12ee0 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
12ef0 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
12f00 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  seperately..**.*
12f10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
12f20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
12f30 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
12f40 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
12f50 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
12f60 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
12f70 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
12f80 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
12f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
12fa0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
12fb0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
12fc0 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
12ff0 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
13020 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13030 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
13040 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
13050 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13060 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13070 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
13080 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
13090 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
130a0 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
130d0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
130e0 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
130f0 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
13100 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13110 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
13140 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13150 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
13170 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
13180 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
131b0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
131c0 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
131f0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
13200 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
13230 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
13240 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
13250 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
13260 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
13270 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
13280 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
13290 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
132a0 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
132b0 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
132c0 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
132d0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
132e0 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
132f0 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
13300 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
13310 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
13320 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
13330 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
13340 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
13350 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
13360 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
13370 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13380 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
13390 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
133a0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
133b0 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e  ->flags;.  int n
133c0 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
133d0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
133e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
133f0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
13400 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
13410 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
13420 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
13430 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
13440 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
13450 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
13460 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
13470 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
13480 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
13490 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66  ;.    if( file_f
134a0 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31  ormat>=4 && (i&1
134b0 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65  )==i ){.      re
134c0 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20  turn 8+(u32)i;. 
134d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30     }.    if( i<0
134e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c   ){.      if( i<
134f0 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72  (-MAX_6BYTE) ) r
13500 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f  eturn 6;.      /
13510 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20  * Previous test 
13520 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d  prevents:  u = -
13530 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  (-92233720368547
13540 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20  75808) */.      
13550 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73  u = -i;.    }els
13560 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
13570 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
13580 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
13590 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
135a0 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
135b0 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
135c0 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
135d0 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
135e0 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
135f0 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
13600 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
13610 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
13620 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
13630 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
13640 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
13650 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
13660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
13670 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
13680 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
13690 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
136a0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
136b0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
136c0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
136d0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
136e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
136f0 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
13700 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
13710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13720 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
13730 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
13740 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
13750 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
13760 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  e..*/.u32 sqlite
13770 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
13780 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
13790 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
137a0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
137b0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
137c0 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
137d0 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
137e0 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
137f0 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
13800 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
13810 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
13820 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
13830 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
13840 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
13850 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
13860 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
13870 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
13880 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
13890 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
138a0 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
138b0 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
138c0 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
138d0 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
138e0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
138f0 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
13900 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
13910 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
13920 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
13930 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
13940 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
13950 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
13960 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
13970 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
13980 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
13990 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
139a0 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
139b0 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
139c0 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
139d0 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
139e0 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
139f0 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
13a00 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
13a10 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
13a20 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
13a30 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
13a40 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
13a50 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
13a60 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
13a70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
13a80 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
13a90 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
13aa0 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
13ab0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
13ac0 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
13ad0 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
13ae0 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
13af0 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
13b00 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
13b10 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
13b20 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
13b30 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
13b40 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
13b50 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
13b60 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
13b70 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
13b80 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
13b90 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
13ba0 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
13bb0 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
13bc0 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
13bd0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
13be0 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
13bf0 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
13c00 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
13c10 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
13c20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
13c30 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
13c40 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
13c50 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
13c60 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
13c70 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
13c80 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
13c90 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
13ca0 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
13cb0 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
13cc0 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
13cd0 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
13ce0 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
13cf0 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
13d00 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
13d10 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
13d20 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
13d30 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
13d40 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
13d50 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
13d60 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
13d70 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
13d80 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
13d90 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
13da0 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
13db0 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
13dc0 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
13dd0 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
13de0 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
13df0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
13e00 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
13e10 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
13e20 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
13e30 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
13e40 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
13e50 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
13e60 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
13e70 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
13e80 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
13e90 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
13ea0 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
13eb0 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
13ec0 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
13ed0 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
13ee0 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
13ef0 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
13f00 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
13f10 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
13f20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
13f30 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
13f40 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
13f50 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
13f60 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
13f70 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
13f80 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
13f90 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
13fa0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
13fb0 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
13fc0 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
13fd0 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
13fe0 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
13ff0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
14000 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
14010 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
14020 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
14030 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
14040 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
14050 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
14060 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
14070 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
14080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
14090 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
140a0 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
140b0 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
140c0 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
140d0 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
140e0 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
140f0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
14100 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
14110 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
14120 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
14130 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
14140 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
14150 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
14160 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
14170 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
14180 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
14190 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
141a0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
141b0 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
141c0 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
141d0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
141e0 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
141f0 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
14200 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
14210 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
14220 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
14230 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
14240 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
14250 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
14260 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
14270 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
14280 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
14290 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
142a0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
142b0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
142c0 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
142d0 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
142e0 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
142f0 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
14300 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
14310 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
14320 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
14330 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
14340 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
14350 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
14360 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
14370 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
14380 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
14390 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
143a0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
143b0 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
143c0 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
143d0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
143e0 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
143f0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
14400 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
14410 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
14420 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
14430 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
14440 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
14450 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
14460 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14470 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
14480 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
14490 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
144a0 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
144b0 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
144c0 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
144d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
144e0 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
144f0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
14500 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
14510 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
14520 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
14530 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29  sert( len<=(u32)
14540 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c  nBuf );.    whil
14550 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( i-- ){.      
14560 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26  buf[i] = (u8)(v&
14570 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
14580 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >= 8;.    }.    
14590 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
145a0 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
145b0 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
145c0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
145d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
145e0 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
145f0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
14600 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
14610 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
14620 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
14630 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
14640 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
14650 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
14660 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
14670 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
14680 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
14690 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
146a0 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
146b0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
146c0 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
146d0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  em->u.nZero;.   
146e0 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
146f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14700 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20  len > (u32)nBuf 
14710 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  ){.        len =
14720 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20   (u32)nBuf;.    
14730 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
14740 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20  (&buf[pMem->n], 
14750 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b  0, len-pMem->n);
14760 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14770 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
14780 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
14790 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
147a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
147b0 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
147c0 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
147d0 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
147e0 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
147f0 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
14800 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
14810 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
14820 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14830 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
14840 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
14850 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
14860 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14870 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
14880 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
14890 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
148a0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
148b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
148c0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
148d0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
148e0 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
148f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
14900 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
14910 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
14920 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
14930 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
14940 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
14950 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
14960 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
14970 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
14980 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
14990 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
149a0 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
149b0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
149c0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
149d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
149e0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
149f0 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
14a00 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
14a10 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
14a20 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
14a30 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
14a40 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
14a60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14a70 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
14a80 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14a90 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
14aa0 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
14ab0 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
14ac0 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
14ad0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14ae0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
14af0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
14b00 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
14b10 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
14b20 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
14b30 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
14b40 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
14b50 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
14b60 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
14b70 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14b80 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
14b90 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
14ba0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
14bb0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
14bc0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
14bd0 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
14be0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
14bf0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
14c00 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
14c10 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14c20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
14c30 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
14c40 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
14c50 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
14c60 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
14c70 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
14c80 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
14c90 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
14ca0 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
14cb0 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
14cc0 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
14cd0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
14ce0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
14cf0 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
14d00 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
14d10 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
14d20 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
14d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
14d40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14d50 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
14d60 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
14d70 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
14d80 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
14d90 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
14da0 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
14db0 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
14dc0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
14dd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14de0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
14df0 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
14e00 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
14e10 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
14e20 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
14e30 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
14e40 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
14e50 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
14e60 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
14e70 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
14e80 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
14e90 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
14ea0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
14eb0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
14ec0 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
14ed0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
14ee0 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
14ef0 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
14f00 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
14f10 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
14f20 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
14f30 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
14f40 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
14f50 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
14f60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14f70 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
14f80 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
14f90 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
14fa0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
14fb0 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
14fc0 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
14fd0 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
14fe0 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
14ff0 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
15000 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
15010 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
15020 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
15030 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
15040 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
15050 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
15060 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
15070 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
15080 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
15090 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
150a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
150b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
150c0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
150d0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
150e0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
150f0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
15100 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
15110 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
15120 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
15130 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
15140 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
15150 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
15160 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
15170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15180 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
15190 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
151a0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
151b0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
151c0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
151d0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
151e0 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
151f0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15200 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15210 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15220 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
15230 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d  .      u32 len =
15240 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
15250 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
15260 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
15270 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
15280 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
15290 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
152a0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
152b0 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
152c0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
152d0 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
152e0 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
152f0 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
15300 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
15310 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
15320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
15330 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
15340 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
15350 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
15360 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
15370 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
15380 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72  d in pKey[], par
15390 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  se the.** record
153a0 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64   into a Unpacked
153b0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
153c0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
153d0 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
153e0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
153f0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
15400 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69  tion might provi
15410 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73  de szSpace bytes
15420 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70   of memory.** sp
15430 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20  ace at pSpace.  
15440 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62  This space can b
15450 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  e used to hold t
15460 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56  he returned.** V
15470 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20  DbeParsedRecord 
15480 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20  structure if it 
15490 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e  is large enough.
154a0 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f    If it is.** no
154b0 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70  t big enough, sp
154c0 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ace is obtained 
154d0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
154e0 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  loc()..**.** The
154f0 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74   returned struct
15500 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ure should be cl
15510 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  osed by a call t
15520 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  o.** sqlite3Vdbe
15530 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
15540 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61  cord()..*/ .Unpa
15550 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
15560 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
15570 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
15580 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
15590 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
155a0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
155b0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
155c0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
155d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
155e0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
155f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
15600 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
15610 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
15620 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
15630 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ,          /* Un
15640 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
15650 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  ailable to hold 
15660 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
15670 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20  int szSpace     
15680 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15690 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
156a0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  tes */.){.  cons
156b0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
156c0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
156d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
156e0 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
156f0 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68  ecord *p;  /* Th
15700 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
15710 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72  d that we will r
15720 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
15730 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Byte;          /
15740 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e  * Memory space n
15750 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c  eeded to hold p,
15760 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
15770 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b  nt d;.  u32 idx;
15780 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
15790 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
157a0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
157b0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
157c0 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69    Mem *pMem;.  i
157d0 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
157e0 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70     /* Increase p
157f0 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75  Space by this mu
15800 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69  ch to 8-byte ali
15810 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a  gn it */.  .  /*
15820 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  ** We want to
15830 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
15840 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
15850 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
15860 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
15870 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
15880 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
15890 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
158a0 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
158b0 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
158c0 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
158d0 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
158e0 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
158f0 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
15900 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
15910 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
15920 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
15930 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20  ) & 7;.  pSpace 
15940 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61  += nOff;.  szSpa
15950 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42  ce -= nOff;.  nB
15960 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
15970 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
15980 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
15990 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
159a0 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
159b0 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a  Byte>szSpace ){.
159c0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
159d0 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
159e0 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
159f0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
15a00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d  return 0;.    p-
15a10 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  >flags = UNPACKE
15a20 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e  D_NEED_FREE | UN
15a30 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
15a40 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROY;.  }else{.  
15a50 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
15a60 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20  ecord*)pSpace;. 
15a70 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
15a80 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
15a90 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  ROY;.  }.  p->pK
15aa0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
15ab0 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
15ac0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
15ad0 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d  d + 1;.  p->aMem
15ae0 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29   = pMem = (Mem*)
15af0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
15b00 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
15b10 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
15b20 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
15b30 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
15b40 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
15b50 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
15b60 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
15b70 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
15b80 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
15b90 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26  && u<p->nField &
15ba0 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
15bb0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
15bc0 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
15bd0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
15be0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
15bf0 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
15c00 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
15c10 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
15c20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
15c30 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
15c40 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
15c50 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
15c60 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
15c70 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
15c80 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  em->zMalloc = 0;
15c90 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
15ca0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
15cb0 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
15cc0 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
15cd0 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b   pMem++;.    u++
15ce0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15cf0 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
15d00 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
15d10 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65  nField = u;.  re
15d20 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d  turn (void*)p;.}
15d30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15d40 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20  tine destroys a 
15d50 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f  UnpackedRecord o
15d60 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
15d70 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15d80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55  UnpackedRecord(U
15d90 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
15da0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
15db0 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 69 3b 0a  _DEBUG.  int i;.
15dc0 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20    Mem *pMem;..  
15dd0 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
15de0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
15df0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
15e00 45 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20 20  ED_DESTROY );.  
15e10 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d  for(i=0, pMem=p-
15e20 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65  >aMem; i<p->nFie
15e30 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29  ld; i++, pMem++)
15e40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 70  {.    /* The unp
15e50 61 63 6b 65 64 20 72 65 63 6f 72 64 20 69 73 20  acked record is 
15e60 61 6c 77 61 79 73 20 63 6f 6e 73 74 72 75 63 74  always construct
15e70 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
15e80 20 73 71 6c 69 74 65 33 56 64 62 65 55 6e 70 61   sqlite3VdbeUnpa
15e90 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
15ea0 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69 63 68  ion above, which
15eb0 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a   makes all.    *
15ec0 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c  * strings and bl
15ed0 6f 62 73 20 73 74 61 74 69 63 2e 20 20 41 6e 64  obs static.  And
15ee0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c 65   none of the ele
15ef0 6d 65 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  ments are.    **
15f00 20 65 76 65 72 20 74 72 61 6e 73 66 6f 72 6d 65   ever transforme
15f10 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  d, so there is n
15f20 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f  ever anything to
15f30 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a   delete..    */.
15f40 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4d      if( NEVER(pM
15f50 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73  em->zMalloc) ) s
15f60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
15f70 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a  ease(pMem);.  }.
15f80 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
15f90 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
15fa0 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20  _NEED_FREE ){.  
15fb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15fc0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  p->pKeyInfo->db,
15fd0 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
15fe0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15ff0 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
16000 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
16010 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
16020 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
16030 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
16040 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
16050 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
16060 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
16070 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
16080 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
16090 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
160a0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
160b0 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
160c0 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
160d0 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
160e0 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
160f0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
16100 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
16110 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
16120 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
16130 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
16140 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
16150 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
16160 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
16170 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
16180 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
16190 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
161a0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
161b0 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65   The key with fe
161c0 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73  wer fields is us
161d0 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c  ually compares l
161e0 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a  ess than the .**
161f0 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f   longer key.  Ho
16200 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50  wever if the UNP
16210 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c  ACKED_INCRKEY fl
16220 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73  ags in pPKey2 is
16230 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20   set.** and the 
16240 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20  common prefixes 
16250 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
16260 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
16270 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66  n key2..** Or if
16280 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41   the UNPACKED_MA
16290 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20  TCH_PREFIX flag 
162a0 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70  is set and the p
162b0 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65  refixes are.** e
162c0 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b  qual, then the k
162d0 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  eys are consider
162e0 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61  ed to be equal a
162f0 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20  nd.** the parts 
16300 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  beyond the commo
16310 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e  n prefix are ign
16320 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
16330 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f  he UNPACKED_IGNO
16340 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73  RE_ROWID flag is
16350 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c   set, then the l
16360 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74  ast byte of.** t
16370 68 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65  he header of pKe
16380 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  y1 is ignored.  
16390 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
163a0 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61  at pKey1 is.** a
163b0 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64  n index key, and
163c0 20 74 68 75 73 20 65 6e 64 73 20 77 69 74 68 20   thus ends with 
163d0 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20  a rowid value.  
163e0 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a  The last byte.**
163f0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 77   of the header w
16400 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
16410 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
16420 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a   of the rowid:.*
16430 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33  * one of 1, 2, 3
16440 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72  , 4, 5, 6, 8, or
16450 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72   9 - the integer
16460 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
16470 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  * The serial typ
16480 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72  e of the final r
16490 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73  owid will always
164a0 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74   be a single byt
164b0 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e  e..** By ignorin
164c0 67 20 74 68 69 73 20 6c 61 73 74 20 62 79 74 65  g this last byte
164d0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c 20   of the header, 
164e0 77 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d  we force the com
164f0 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67  parison.** to ig
16500 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 61  nore the rowid a
16510 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79  t the end of key
16520 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
16530 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
16540 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
16550 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
16560 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
16570 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
16580 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
16590 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
165a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20  */.){.  int d1; 
165b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
165c0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
165d0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
165e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
165f0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
16600 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
16610 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
16620 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
16630 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
16640 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16650 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
16660 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
16670 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
16680 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
16690 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
166a0 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
166b0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
166c0 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
166d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
166e0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
166f0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
16700 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31  pKeyInfo;.  mem1
16710 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
16720 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
16730 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
16740 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
16750 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
16760 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
16770 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16780 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
16790 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  ONLY( mem1.zMall
167a0 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
167b0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
167c0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
167d0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
167e0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
167f0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
16800 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
16810 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
16820 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
16830 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
16840 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
16850 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
16860 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
16870 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
16880 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
16890 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
168a0 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
168b0 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
168c0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
168d0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
168e0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
168f0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
16900 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
16910 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
16920 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
16930 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
16940 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
16950 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
16960 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
16970 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
16980 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
16990 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
169a0 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
169b0 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
169c0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
169d0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
169e0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
169f0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
16a00 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
16a10 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20  = szHdr1;.  if( 
16a20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
16a30 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
16a40 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48  ROWID ){.    szH
16a50 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69  dr1--;.  }.  nFi
16a60 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
16a70 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
16a80 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
16a90 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
16aa0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
16ab0 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
16ac0 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
16ad0 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
16ae0 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
16af0 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
16b00 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
16b10 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
16b20 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
16b30 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b  ;.    if( d1>=nK
16b40 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey1 && sqlite3Vd
16b50 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
16b60 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20  serial_type1)>0 
16b70 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
16b80 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
16b90 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
16ba0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
16bb0 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
16bc0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
16bd0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
16be0 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
16bf0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
16c00 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
16c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
16c20 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
16c30 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
16c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c50 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46              i<nF
16c60 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d  ield ? pKeyInfo-
16c70 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a  >aColl[i] : 0);.
16c80 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
16c90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
16ca0 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
16cb0 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
16cc0 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20  t below */..    
16cd0 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
16ce0 72 65 73 75 6c 74 20 69 66 20 77 65 20 61 72 65  result if we are
16cf0 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74   using DESC sort
16d00 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
16d10 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
16d20 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e  SortOrder && i<n
16d30 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66  Field && pKeyInf
16d40 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
16d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16d60 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -rc;.      }.  
16d70 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
16d80 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48  he PREFIX_SEARCH
16d90 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
16da0 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65   all fields exce
16db0 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20  pt the final.   
16dc0 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c     ** rowid fiel
16dd0 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68  d were equal, th
16de0 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45  en clear the PRE
16df0 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
16e00 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a  and set .      *
16e10 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20  * pPKey2->rowid 
16e20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
16e30 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20  the rowid field 
16e40 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31  in (pKey1, nKey1
16e50 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  )..      ** This
16e60 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
16e70 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f  OP_IsUnique opco
16e80 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
16e90 20 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e     if( (pPKey2->
16ea0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
16eb0 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20  _PREFIX_SEARCH) 
16ec0 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e  && i==(pPKey2->n
16ed0 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20  Field-1) ){.    
16ee0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31      assert( idx1
16ef0 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29  ==szHdr1 && rc )
16f00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16f10 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d  ( mem1.flags & M
16f20 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
16f30 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20    pPKey2->flags 
16f40 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45  &= ~UNPACKED_PRE
16f50 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20  FIX_SEARCH;.    
16f60 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69      pPKey2->rowi
16f70 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20  d = mem1.u.i;.  
16f80 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
16f90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16fa0 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  }.    i++;.  }..
16fb0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
16fc0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
16fd0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
16fe0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
16ff0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
17000 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
17010 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
17020 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
17030 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
17040 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
17050 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
17060 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
17070 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
17080 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c  ssert( mem1.zMal
17090 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
170a0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
170b0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
170c0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
170d0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
170e0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
170f0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
17100 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20   were equal. If 
17110 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  the UNPACKED_INC
17120 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69  RKEY.  ** flag i
17130 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61  s set, then brea
17140 6b 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65  k the tie by tre
17150 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61  ating key2 as la
17160 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rger..  ** If th
17170 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58  e UPACKED_PREFIX
17180 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73  _MATCH flag is s
17190 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69  et, then keys wi
171a0 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  th common prefix
171b0 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73  es.  ** are cons
171c0 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
171d0 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
171e0 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69  the longer key i
171f0 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67  s the .  ** larg
17200 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65  er.  As it happe
17210 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77  ns, the pPKey2 w
17220 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68  ill always be th
17230 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66  e longer.  ** if
17240 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66   there is a diff
17250 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61  erence..  */.  a
17260 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
17270 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
17280 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
17290 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63  NCRKEY ){.    rc
172a0 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69   = -1;.  }else i
172b0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
172c0 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
172d0 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  IX_MATCH ){.    
172e0 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a  /* Leave rc==0 *
172f0 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  /.  }else if( id
17300 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20  x1<szHdr1 ){.   
17310 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72   rc = 1;.  }.  r
17320 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f  eturn rc;.}. ../
17330 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
17340 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
17350 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
17360 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
17370 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
17380 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
17390 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
173a0 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
173b0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
173c0 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
173d0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
173e0 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
173f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
17400 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
17410 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
17420 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
17430 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
17440 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
17450 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
17460 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
17470 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
17480 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
17490 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
174a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
174b0 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
174c0 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
174d0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
174e0 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
174f0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
17500 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
17510 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
17520 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
17530 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
17540 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
17550 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
17560 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
17570 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
17580 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
17590 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55    Mem m, v;..  U
175a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
175b0 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
175c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
175d0 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
175e0 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
175f0 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
17600 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
17610 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
17620 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
17630 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17640 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
17650 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
17660 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
17670 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
17680 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
17690 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
176a0 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
176b0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
176c0 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
176d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
176e0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
176f0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
17700 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
17710 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
17720 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
17730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17740 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
17750 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
17760 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
17770 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
17780 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
17790 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
177a0 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
177b0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
177c0 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
177d0 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
177e0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73   entry */.  mems
177f0 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
17800 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
17810 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
17820 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69  tree(pCur, 0, (i
17830 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
17840 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
17850 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17860 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
17870 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
17880 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
17890 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
178a0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
178b0 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
178c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
178d0 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
178e0 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
178f0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17900 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
17910 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
17920 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
17930 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
17940 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
17950 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
17960 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
17970 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
17980 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
17990 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
179a0 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
179b0 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
179c0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
179d0 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
179e0 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
179f0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
17a00 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
17a10 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17a20 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
17a30 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17a40 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
17a50 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
17a60 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17a70 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
17a80 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17a90 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
17aa0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17ab0 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
17ac0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
17ad0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
17ae0 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
17af0 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
17b00 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
17b10 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
17b20 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
17b30 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
17b40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17b50 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
17b60 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
17b70 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
17b80 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
17b90 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
17ba0 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
17bb0 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
17bc0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
17bd0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17be0 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
17bf0 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
17c00 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
17c10 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
17c20 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
17c30 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
17c40 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
17c50 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
17c60 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
17c70 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
17c80 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
17c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
17ca0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
17cb0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17cc0 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
17cd0 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
17ce0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
17cf0 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
17d00 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
17d10 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
17d20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
17d30 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
17d40 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29  ( m.zMalloc!=0 )
17d50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
17d60 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
17d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17d80 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
17d90 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
17da0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
17db0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
17dc0 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
17dd0 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
17de0 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
17df0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
17e00 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
17e10 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
17e20 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
17e30 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
17e40 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
17e50 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
17e60 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
17e70 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
17e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
17e90 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
17ea0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
17eb0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
17ec0 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
17ed0 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
17ee0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
17ef0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
17f00 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
17f10 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
17f20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
17f30 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
17f40 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
17f50 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
17f60 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
17f70 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
17f80 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
17f90 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
17fa0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
17fb0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
17fc0 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
17fd0 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73  pare(.  VdbeCurs
17fe0 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
17ff0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
18000 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
18010 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
18020 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
18030 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ked,  /* Unpacke
18040 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
18050 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
18060 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  nst */.  int *re
18070 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
18080 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18090 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
180a0 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
180b0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
180c0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
180d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
180e0 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
180f0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
18100 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
18110 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
18120 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
18130 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
18140 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
18150 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
18160 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
18170 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
18180 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
18190 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
181a0 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
181b0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
181c0 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
181d0 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
181e0 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74  f the say.  ** t
181f0 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
18200 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
18210 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
18220 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
18230 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
18240 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
18250 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
18260 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
18270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18280 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18290 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30  }.  memset(&m, 0
182a0 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20  , sizeof(m));.  
182b0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
182c0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
182d0 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e  >pCursor, 0, (in
182e0 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
182f0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
18300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18310 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e   }.  assert( pUn
18320 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20  packed->flags & 
18330 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
18340 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20  ROWID );.  *res 
18350 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
18360 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20  ordCompare(m.n, 
18370 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b  m.z, pUnpacked);
18380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
18390 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
183a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
183b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
183c0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
183d0 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
183e0 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
183f0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
18400 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
18410 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
18420 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
18430 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18440 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
18450 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
18460 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
18470 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18480 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
18490 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
184a0 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
184b0 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
184c0 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
184d0 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
184e0 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
184f0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
18500 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
18510 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
18520 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
18530 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
18540 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
18550 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
18560 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
18570 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
18580 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18590 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
185a0 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
185b0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
185c0 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
185d0 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
185e0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
185f0 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
18600 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
18610 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
18620 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
18630 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
18640 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
18650 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
18660 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
18670 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
18680 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
18690 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
186a0 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
186b0 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
186c0 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
186d0 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
186e0 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
186f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
18700 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
18710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
18720 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
18730 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
18740 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
18750 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
18760 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
18770 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
18780 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
18790 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
187a0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
187b0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
187c0 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
187d0 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
187e0 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
187f0 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v->db;.}../*.** 
18800 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
18810 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
18820 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
18830 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
18840 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72  lue bound.** par
18850 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56  ameter iVar of V
18860 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20  M v. Except, if 
18870 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
18880 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  SQL NULL, return
18890 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20   .** 0 instead. 
188a0 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c  Unless it is NUL
188b0 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74  L, apply affinit
188c0 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68  y aff (one of th
188d0 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a  e SQLITE_AFF_*.*
188e0 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20  * constants) to 
188f0 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
18900 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a   returning it..*
18910 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
18920 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  d value must be 
18930 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
18940 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
18950 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f  3ValueFree()..*/
18960 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
18970 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61  sqlite3VdbeGetVa
18980 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
18990 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
189a0 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
189b0 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
189c0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
189d0 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
189e0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
189f0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
18a00 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
18a10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
18a20 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
18a30 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
18a40 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
18a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18a60 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
18a70 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
18a80 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
18a90 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
18aa0 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
18ab0 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20  _UTF8);.        
18ac0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
18ad0 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70  oreType((Mem *)p
18ae0 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ret);.      }.  
18af0 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
18b00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18b10 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
18b20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
18b30 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
18b40 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
18b50 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
18b60 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
18b70 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
18b80 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
18b90 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
18ba0 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
18bb0 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
18bc0 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
18bd0 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
18be0 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
18bf0 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
18c00 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
18c10 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
18c20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
18c30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
18c40 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
18c50 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
18c60 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
18c70 7d 0a                                            }.