/ Hex Artifact Content
Login

Artifact a709b258b800bcfddc69a9d262fe46f88fea63b1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61  also needs to ma
13a0: 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a  rk all btrees.**
13b0: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
13c0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
13d0: 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75  zWhere string mu
13e0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74  st have been obt
13f0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1400: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
1410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1420: 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70  l take ownership
1430: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
1440: 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69  d memory..*/.voi
1450: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  d sqlite3VdbeAdd
1460: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64  ParseSchemaOp(Vd
1470: 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20  be *p, int iDb, 
1480: 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20  char *zWhere){. 
1490: 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64   int j;.  int ad
14a0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14b0: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72  AddOp3(p, OP_Par
14c0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
14d0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
14e0: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
14f0: 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  ddr, zWhere, P4_
1500: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
1510: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
1520: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
1530: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
1540: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
1550: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1560: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1570: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
1580: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
1590: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
15a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
15c0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
15d0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
15e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15f0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1600: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1610: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1620: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1630: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1640: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1650: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1660: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1670: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1680: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
1690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16a0: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
16b0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
16c0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
16d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
16e0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
16f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1700: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1710: 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
1720: 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33  PTR(p4), P4_INT3
1730: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  2);.  return add
1740: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
1750: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
1760: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
1770: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1780: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
1790: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
17a0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
17b0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
17c0: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
17d0: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
17e0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
17f0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1800: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
1810: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
1820: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
1830: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
1840: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
1850: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
1860: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
1870: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
1880: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
1890: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
18a0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
18b0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
18c0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
18d0: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
18e0: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
18f0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1900: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
1910: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
1920: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
1930: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
1940: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
1950: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
1960: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1970: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
1980: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
1990: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
19a0: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
19b0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
19c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
19d0: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
19e0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  ){.  int i = p->
19f0: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
1a00: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1a10: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1a20: 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31  .  if( (i & (i-1
1a30: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ))==0 ){.    p->
1a40: 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  aLabel = sqlite3
1a50: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
1a60: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  p->db, p->aLabel
1a70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31            (i*2+1
1aa0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  )*sizeof(p->aLab
1ab0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  el[0]));.  }.  i
1ac0: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1ad0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
1ae0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
1af0: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
1b00: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
1b10: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
1b20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1b30: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
1b40: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
1b50: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
1b60: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
1b70: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1b80: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
1b90: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
1ba0: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
1bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1bc0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
1bd0: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
1be0: 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20  int j = -1-x;.  
1bf0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1c00: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1c10: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
1c20: 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62  >=0 && j<p->nLab
1c30: 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  el );.  if( p->a
1c40: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
1c50: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e  aLabel[j] = p->n
1c60: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
1c70: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
1c80: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
1c90: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
1ca0: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1cb0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
1cc0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
1cd0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
1ce0: 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   1;.}..#ifdef SQ
1cf0: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
1d00: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
1d10: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
1d20: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1d30: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
1d40: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
1d50: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1d60: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
1d70: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
1d80: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
1d90: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
1da0: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
1db0: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
1dc0: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
1dd0: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
1de0: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
1df0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1e00: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
1e10: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
1e20: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
1e30: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
1e40: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
1e50: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
1e80: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
1e90: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
1ea0: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
1eb0: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
1ec0: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
1ed0: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
1ee0: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
1ef0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
1f00: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
1f10: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
1f20: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
1f30: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
1f40: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
1f50: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1f60: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
1f70: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1f80: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
1f90: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
1fa0: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
1fb0: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
1fc0: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
1fd0: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
1fe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ff0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2000: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
2010: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
2020: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2030: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
2040: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
2050: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2070: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
2080: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
2090: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
20a0: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
20b0: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
20c0: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
20d0: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
20e0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
20f0: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
2100: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
2110: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
2120: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
2130: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
2140: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
2150: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
2160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
2170: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
2180: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
2190: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
21a0: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
21b0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
21c0: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
21d0: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
21e0: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
21f0: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
2200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
2210: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
2220: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
2230: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
2240: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
2250: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
2260: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
2270: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
2280: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
2290: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
22a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
22b0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22c0: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
22d0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
22e0: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
22f0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
2300: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2310: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
2320: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
2330: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
2340: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
2350: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
2360: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
2370: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
2380: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
2390: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
23a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
23b0: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
23c0: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
23d0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
23e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23f0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2410: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
2420: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
2430: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2440: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
2450: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
2460: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
2470: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
2480: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
2490: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
24a0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
24b0: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
24c0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
24d0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
24e0: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
24f0: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
2500: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2510: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
2520: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
2530: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2540: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2550: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
2560: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
2570: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2580: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2590: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
25a0: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
25b0: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
25c0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
25d0: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
25e0: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
25f0: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
2600: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a   constraint).**.
2610: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
2620: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
2630: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
2640: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
2650: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
2660: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
2670: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
2680: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
2690: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
26a0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
26b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
26c0: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
26d0: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
26e0: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
26f0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
2700: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
2710: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
2720: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
2730: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
2740: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
2750: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
2760: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2770: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2780: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
2790: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
27a0: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f  asAbort = 0;.  O
27b0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
27c0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
27d0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
27e0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
27f0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
2800: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2810: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2820: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
2830: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
2840: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
2850: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
2860: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
2870: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
2880: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
2890: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28a0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
28b0: 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d       || (opcode=
28c0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
28d0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
28e0: 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64  Op->p2==1) .#end
28f0: 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  if.     || ((opc
2900: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
2910: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
2920: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
2930: 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54   (pOp->p1==SQLIT
2940: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2950: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
2960: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
2970: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
2980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2990: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
29a0: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
29b0: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
29c0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
29d0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
29e0: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
29f0: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
2a00: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
2a10: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
2a20: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
2a30: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
2a40: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
2a50: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
2a60: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
2a70: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
2a80: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
2a90: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
2aa0: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
2ab0: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
2ac0: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
2ad0: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
2ae0: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
2af0: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
2b00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2b10: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2b20: 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rt );.}.#endif /
2b30: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
2b40: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
2b50: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
2b60: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
2b70: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2b80: 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67   program looking
2b90: 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74   for P2 values t
2ba0: 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  hat are negative
2bb0: 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74  .** on jump inst
2bc0: 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  ructions.  Each 
2bd0: 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20  such value is a 
2be0: 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20  label.  Resolve 
2bf0: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20  the.** label by 
2c00: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76  setting the P2 v
2c10: 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72  alue to its corr
2c20: 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ect non-zero val
2c30: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ue..**.** This r
2c40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2c50: 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20   once after all 
2c60: 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65  opcodes have bee
2c70: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
2c80: 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78  * Variable *pMax
2c90: 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20  FuncArgs is set 
2ca0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  to the maximum v
2cb0: 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61  alue of any P2 a
2cc0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61  rgument .** to a
2cd0: 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f  n OP_Function, O
2ce0: 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f  P_AggStep or OP_
2cf0: 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20  VFilter opcode. 
2d00: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
2d10: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d  .** sqlite3VdbeM
2d20: 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69  akeReady() to si
2d30: 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  ze the Vdbe.apAr
2d40: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  g[] array..**.**
2d50: 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20   The Op.opflags 
2d60: 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20  field is set on 
2d70: 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  all opcodes..*/.
2d80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
2d90: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
2da0: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
2db0: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  ncArgs){.  int i
2dc0: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  ;.  int nMaxArgs
2dd0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
2de0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
2df0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
2e00: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
2e10: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72  dOnly = 1;.  for
2e20: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2e30: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2e40: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2e50: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2e60: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f  >opcode;..    pO
2e70: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
2e80: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
2e90: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
2ea0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
2eb0: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
2ec0: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b  e==OP_AggStep ){
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
2ee0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
2ef0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
2f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f10: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e  (opcode==OP_Tran
2f20: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2f30: 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 65  p2!=0) || opcode
2f40: 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a 20  ==OP_Vacuum ){. 
2f50: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
2f60: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2f70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2f80: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
2f90: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2fa0: 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  VUpdate ){.     
2fb0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
2fc0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2fd0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2fe0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2ff0: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
3000: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
3010: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
3020: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
3030: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
3040: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
3050: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
3060: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
3070: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
3080: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3090: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
30a0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
30b0: 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 6f 70 63  ==OP_Next || opc
30c0: 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e 65  ode==OP_SorterNe
30d0: 78 74 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  xt ){.      pOp-
30e0: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
30f0: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b  qlite3BtreeNext;
3100: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3110: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3120: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3130: 70 63 6f 64 65 3d 3d 4f 50 5f 50 72 65 76 20 29  pcode==OP_Prev )
3140: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e  {.      pOp->p4.
3150: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3160: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
3170: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3180: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3190: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31a0: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
31b0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
31c0: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
31d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
31e0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
31f0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
3200: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
3210: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
3220: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3230: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
3240: 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65  bel);.  p->aLabe
3250: 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46  l = 0;..  *pMaxF
3260: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
3270: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
3280: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
3290: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
32a0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
32b0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
32c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
32d0: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
32e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
32f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3300: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
3310: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
3320: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
3330: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
3340: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
3350: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
3360: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
3370: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
3380: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3390: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
33a0: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
33b0: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
33c0: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
33d0: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
33e0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
33f0: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
3400: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
3410: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
3420: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
3430: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
3440: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
3450: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
3460: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
3470: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
3480: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
3490: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
34a0: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
34b0: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
34c0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
34d0: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
34e0: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
34f0: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
3500: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
3510: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
3520: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
3530: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
3540: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
3550: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
3560: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
3570: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
3580: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
3590: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
35a0: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
35b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
35c0: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
35d0: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
35e0: 61 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65  assert( p->btree
35f0: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  Mask==0 );..  re
3600: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3610: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3620: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
3630: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
3640: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
3650: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
3660: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
3670: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
3680: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3690: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
36a0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
36b0: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
36c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
36d0: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
36e0: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
36f0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3700: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3710: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3720: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3730: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3740: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
3750: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
3760: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
3770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3780: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3790: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
37a0: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
37b0: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
37c0: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
37d0: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
37e0: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
37f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3800: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3810: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3820: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
3830: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
3840: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
3850: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
3860: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
3870: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
3880: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3890: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
38a0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
38b0: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
38c0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
38d0: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
38e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38f0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3910: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3920: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
3930: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3940: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
3950: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
3960: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
3970: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3980: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3990: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
39a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
39b0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
39c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
39d0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
39e0: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
39f0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3a00: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3a10: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
3a30: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
3a40: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3a50: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
3a60: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3a70: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3a80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3a90: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3aa0: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3ab0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3ac0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ae0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3af0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3b00: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3b10: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3b20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b30: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
3b40: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
3b50: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3b60: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3b70: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
3b80: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3b90: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
3ba0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3bb0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3bc0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
3bd0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3be0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3bf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3c00: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
3c10: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
3c20: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
3c30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3c40: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
3c50: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
3c60: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3c70: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
3c80: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
3c90: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3ca0: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
3cb0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3cc0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3cd0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
3ce0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3cf0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
3d00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3d10: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
3d20: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
3d30: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
3d40: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
3d50: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
3d60: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
3d70: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
3d80: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3d90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
3da0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
3db0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
3dc0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
3dd0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3de0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
3df0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
3e00: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3e10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
3e20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3e30: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
3e40: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
3e50: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
3e60: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3e70: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
3e80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
3e90: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
3ea0: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
3eb0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
3ec0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3ed0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
3ee0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
3ef0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
3f00: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
3f10: 72 74 28 20 61 64 64 72 3e 3d 30 20 7c 7c 20 70  rt( addr>=0 || p
3f20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3f30: 65 64 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  ed );.  if( addr
3f40: 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  >=0 ) sqlite3Vdb
3f50: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3f60: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
3f70: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
3f80: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
3f90: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
3fa0: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
3fb0: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
3fc0: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
3fd0: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
3fe0: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
3ff0: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
4000: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
4010: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
4020: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
4030: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
4040: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
4050: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
4060: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4070: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
4080: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4090: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
40a0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
40b0: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
40c0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
40d0: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
40e0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
40f0: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
4100: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
4110: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
4120: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
4130: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
4140: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
4150: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
4160: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
4170: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
4180: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
4190: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
41a0: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
41b0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
41c0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
41d0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
41e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
41f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4200: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4220: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
4230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4240: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4250: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
4260: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4270: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4280: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
4290: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
42a0: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
42b0: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
42c0: 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p4;.        free
42d0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
42e0: 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d  n(db, pVdbeFunc-
42f0: 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  >pFunc);.       
4300: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4310: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4320: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
4330: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
4340: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
4360: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
4370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4380: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
4390: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
43a0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
43b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
43c0: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
43d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
43e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
43f0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  EM: {.        if
4400: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4410: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
4420: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
4430: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
4440: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
4450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4460: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
4470: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  )p4;.          s
4480: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4490: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
44a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
44b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
44c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
44d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
44e0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
44f0: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
4500: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4510: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
4520: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
4530: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
4540: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4550: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4560: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
4570: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
4580: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
4590: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
45a0: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
45b0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
45c0: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
45d0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
45e0: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
45f0: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
4600: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
4610: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
4620: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
4630: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
4640: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
4650: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
4660: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
4670: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
4680: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
4690: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
46a0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
46b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
46c0: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
46d0: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
46e0: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
46f0: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
4700: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4710: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
4720: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
4730: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
4740: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
4750: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
4760: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
4770: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
4780: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
4790: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
47a0: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
47b0: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
47c0: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
47d0: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
47e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
47f0: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
4800: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
4810: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
4820: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
4830: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
4840: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
4850: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
4860: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
4870: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
4880: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73  P_Noop.*/.void s
4890: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
48a0: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
48b0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
48c0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
48d0: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
48e0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
48f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4900: 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28  >db;.    freeP4(
4910: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4920: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
4930: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
4940: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
4950: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
4960: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a   = OP_Noop;.  }.
4970: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4980: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4990: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
49a0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
49b0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
49c0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
49d0: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
49e0: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
49f0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4a00: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4a10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4a20: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
4a30: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
4a40: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
4a50: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
4a60: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
4a70: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4a80: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4a90: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4aa0: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4ab0: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4ac0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4ad0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4ae0: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4af0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4b00: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4b10: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4b20: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4b30: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
4b40: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
4b50: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
4b60: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
4b70: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
4b80: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
4b90: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4ba0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4bb0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4bc0: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4bd0: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4be0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4bf0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4c00: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4c10: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4c20: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4c30: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4c40: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4c50: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4c60: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4c70: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4c80: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4ca0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4cb0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4cc0: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4cd0: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4ce0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4cf0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4d00: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4d10: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4d20: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4d30: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4d40: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4d50: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4d60: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4d70: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4d80: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4d90: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4da0: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4db0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4dc0: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4dd0: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4de0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4df0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4e00: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4e10: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4e20: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4e30: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4e40: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4e50: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4e60: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4e70: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4e80: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4e90: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4ea0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4eb0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4ec0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4ed0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4ee0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4ef0: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4f00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4f10: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4f20: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4f30: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4f40: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4f50: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4f60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4f70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4f80: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4f90: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4fa0: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
4fb0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
4fc0: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
4fd0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4fe0: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
4ff0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5000: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
5010: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
5020: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
5030: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
5040: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
5050: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
5060: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
5070: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
5080: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
5090: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
50a0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
50b0: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
50c0: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
50d0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
50e0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
50f0: 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20  else if( zP4==0 
5100: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5110: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
5120: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5130: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
5140: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
5150: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
5160: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
5170: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
5180: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
5190: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
51a0: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
51b0: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
51c0: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
51d0: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
51e0: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
51f0: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
5200: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
5210: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74 65  llocRaw(0, nByte
5220: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
5230: 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
5240: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
5250: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38  Info ){.      u8
5260: 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20   *aSortOrder;.  
5270: 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72      memcpy((char
5280: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c  *)pKeyInfo, zP4,
5290: 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64 29   nByte - nField)
52a0: 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64  ;.      aSortOrd
52b0: 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  er = pKeyInfo->a
52c0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
52d0: 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 4f 72   assert( aSortOr
52e0: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
52f0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5300: 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  rder = (unsigned
5310: 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f   char*)&pKeyInfo
5320: 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b  ->aColl[nField];
5330: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  .      memcpy(pK
5340: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
5350: 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20  er, aSortOrder, 
5360: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 70  nField);.      p
5370: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5380: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
5390: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
53a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
53b0: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
53c0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
53d0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
53e0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
53f0: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
5400: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5410: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5420: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
5430: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
5440: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
5450: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5460: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5470: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5480: 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c  P4_VTAB;.    sql
5490: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
54a0: 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20  able *)zP4);.   
54b0: 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c   assert( ((VTabl
54c0: 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d  e *)zP4)->db==p-
54d0: 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  >db );.  }else i
54e0: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
54f0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5500: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5510: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
5520: 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b  char)n;.  }else{
5530: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
5540: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5550: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
5560: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
5570: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
5580: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
5590: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
55a0: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
55b0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
55c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
55d0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
55e0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
55f0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
5600: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
5610: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
5620: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
5630: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
5640: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
5650: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
5660: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
5670: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
5680: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
5690: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
56a0: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
56b0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
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 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
56f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5700: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
5710: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5720: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5730: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5740: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5750: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5760: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
5770: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5780: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
5790: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
57a0: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
57b0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
57c0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
57d0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
57e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
57f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5800: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
5810: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
5820: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5830: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5840: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5850: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
5860: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5870: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
5880: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
5890: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
58a0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
58b0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
58c0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
58d0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
58e0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
58f0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5900: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
5910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5920: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5930: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5940: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
5950: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
5960: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5970: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
5980: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
5990: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
59a0: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
59b0: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
59c0: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
59d0: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
59e0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
59f0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5a00: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
5a10: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
5a20: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
5a30: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
5a40: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
5a50: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
5a60: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
5a70: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
5a80: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
5a90: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
5aa0: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
5ab0: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
5ac0: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
5ad0: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
5ae0: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
5af0: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
5b00: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
5b10: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
5b20: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
5b30: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
5b40: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
5b50: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
5b60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5b70: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
5b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5b90: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
5ba0: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
5bb0: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
5bc0: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
5bd0: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
5be0: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
5bf0: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
5c00: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
5c10: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
5c20: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
5c30: 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23  *.** About the #
5c40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5c50: 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c  T_TRACE:  Normal
5c60: 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ly, this routine
5c70: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
5c80: 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f  .** unless p->nO
5c90: 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65  p>0.  This is be
5ca0: 63 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73  cause in the abs
5cb0: 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  ense of SQLITE_O
5cc0: 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e  MIT_TRACE,.** an
5cd0: 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75   OP_Trace instru
5ce0: 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ction is always 
5cf0: 69 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69  inserted by sqli
5d00: 74 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20  te3VdbeGet() as 
5d10: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77  soon as.** a new
5d20: 20 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64   VDBE is created
5d30: 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65  .  So we are fre
5d40: 65 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f  e to set addr to
5d50: 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75   p->nOp-1 withou
5d60: 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64  t.** having to d
5d70: 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d  ouble-check to m
5d80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5d90: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d  e result is non-
5da0: 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a  negative. But.**
5db0: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
5dc0: 54 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64  TRACE is defined
5dd0: 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69  , the OP_Trace i
5de0: 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65  s omitted and we
5df0: 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63   do need to.** c
5e00: 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f  heck the value o
5e10: 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72  f p->nOp-1 befor
5e20: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f  e continuing..*/
5e30: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
5e40: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
5e50: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
5e60: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
5e70: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
5e80: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
5e90: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
5ea0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
5eb0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
5ec0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
5ed0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
5ee0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
5ef0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
5f00: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
5f10: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
5f20: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
5f30: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
5f40: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5f50: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5f60: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
5f70: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
5f80: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
5f90: 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72  f( p->nOp==0 ) r
5fa0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
5fb0: 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20  dummy;.#endif.  
5fc0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
5fd0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
5fe0: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
5ff0: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
6000: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6010: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
6020: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6030: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
6040: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
6050: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6060: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
6070: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
6080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6090: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
60a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
60b0: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
60c0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
60d0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
60e0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
60f0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
6100: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
6110: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
6120: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
6130: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
6140: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
6150: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
6160: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
6170: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
6180: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
6190: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
61a0: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
61b0: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
61c0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
61d0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
61e0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
61f0: 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a  _KEYINFO_STATIC:
6200: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
6210: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
6220: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
6230: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
6240: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
6250: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
6260: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
6270: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
6280: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6290: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
62a0: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
62b0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
62c0: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
62d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
62e0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
62f0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
6300: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
6310: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6320: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
6330: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
6340: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
6350: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
6360: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6370: 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  0(pColl->zName);
6380: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
6390: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
63a0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
63b0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
63c0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
63d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
63e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
63f0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
6400: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6410: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6420: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6430: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6440: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6450: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
6460: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
6470: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
6480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6490: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
64a0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
64b0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
64c0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
64d0: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
64e0: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6500: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6510: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
6520: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
6530: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
6540: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
6550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6560: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
6570: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6580: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
6590: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
65a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
65b0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
65c0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
65d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
65e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
65f0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
6600: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
6610: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
6620: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
6630: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6640: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6650: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
6660: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
6670: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6680: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6690: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
66a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
66b0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
66c0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
66d0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
66e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
66f0: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
6700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6720: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
6730: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
6740: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6750: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
6760: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6770: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6780: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
6790: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
67a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
67b0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
67c0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
67d0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
67e0: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
67f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
6800: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
6810: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
6820: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6830: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
6840: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
6850: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6860: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
6870: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
6880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6890: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
68a0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
68b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
68c0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
68d0: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
68e0: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
68f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6900: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
6910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6920: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6930: 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  Temp, "NULL");. 
6940: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6950: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
6960: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
6970: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
6980: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
6990: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
69a0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
69b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
69c0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
69d0: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
69e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
69f0: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
6a00: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
6a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6a20: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6a30: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
6a40: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
6a50: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
6a60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a70: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
6a80: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
6a90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6aa0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6ab0: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
6ac0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ad0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
6ae0: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
6af0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6b00: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6b10: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
6b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6b30: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
6b40: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
6b50: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b70: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6b80: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
6b90: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
6ba0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
6bb0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
6bc0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6bd0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6be0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
6bf0: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
6c00: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
6c10: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
6c20: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
6c30: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
6c40: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
6c50: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
6c60: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
6c70: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
6c80: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
6c90: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
6ca0: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
6cb0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
6cc0: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
6cd0: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
6ce0: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
6cf0: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
6d00: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
6d10: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
6d20: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
6d30: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
6d40: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
6d50: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
6d60: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
6d70: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
6d80: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
6d90: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
6da0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
6db0: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
6dc0: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
6dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
6de0: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
6df0: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70  eeMask)*8 );.  p
6e00: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28  ->btreeMask |= (
6e10: 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (yDbMask)1)<<i;.
6e20: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
6e30: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
6e40: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
6e50: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  .pBt) ){.    p->
6e60: 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44  lockMask |= ((yD
6e70: 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d  bMask)1)<<i;.  }
6e80: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
6e90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
6ea0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
6eb0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
6ec0: 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  0./*.** If SQLit
6ed0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
6ee0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
6ef0: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
6f00: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
6f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
6f20: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
6f30: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
6f40: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
6f50: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
6f60: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
6f70: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
6f80: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
6f90: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
6fa0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
6fb0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
6fc0: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
6fd0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
6fe0: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
6ff0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
7000: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
7010: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
7020: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
7030: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
7040: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
7050: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
7060: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
7070: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
7080: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
7090: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
70a0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
70b0: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
70c0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
70d0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
70e0: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
70f0: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
7100: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
7110: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
7120: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
7130: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
7140: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
7150: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
7160: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
7170: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
7180: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
7190: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
71a0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
71b0: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
71c0: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
71d0: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
71e0: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
71f0: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
7200: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
7210: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7220: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
7230: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
7240: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
7250: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
7260: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
7270: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
7280: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
7290: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
72a0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
72b0: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
72c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72d0: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
72e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
72f0: 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20  yDbMask mask;.  
7300: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
7310: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
7320: 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b  b;.  if( p->lock
7330: 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e  Mask==0 ) return
7340: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
7350: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
7360: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
7370: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
7380: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
7390: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44  =0, mask=1; i<nD
73a0: 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20  b; i++, mask += 
73b0: 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69  mask){.    if( i
73c0: 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70  !=1 && (mask & p
73d0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26  ->lockMask)!=0 &
73e0: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
73f0: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
7400: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
7410: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
7420: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
7430: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
7440: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
7450: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
7460: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
7470: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
7480: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
7490: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
74a0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
74b0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
74c0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
74d0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
74e0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
74f0: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
7500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7510: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
7520: 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f  nDb;.  if( p->lo
7530: 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75  ckMask==0 ) retu
7540: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
7550: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
7560: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
7570: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
7580: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
7590: 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c  (i=0, mask=1; i<
75a0: 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b  nDb; i++, mask +
75b0: 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28  = mask){.    if(
75c0: 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26   i!=1 && (mask &
75d0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30   p->lockMask)!=0
75e0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
75f0: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
7600: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
7610: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
7620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
7630: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
7640: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
7650: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
7660: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
7670: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
7680: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
7690: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
76a0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
76b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
76c0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
76d0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
76e0: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
76f0: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
7700: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
7710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
7720: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
7730: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
7740: 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  4s %.2X %s\n";. 
7750: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
7760: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
7770: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
7780: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
7790: 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69  f(zPtr));.  fpri
77a0: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
77b0: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
77c0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
77d0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
77e0: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
77f0: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
7800: 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53  Op->p5,.#ifdef S
7810: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
7820: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
7830: 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ? pOp->zComment 
7840: 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  : "".#else.     
7850: 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   "".#endif.  );.
7860: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
7870: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7880: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
7890: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
78a0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
78b0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
78c0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
78d0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
78e0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b  {.    Mem *pEnd;
78f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
7900: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38   = p->db;.    u8
7910: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d   malloc_failed =
7920: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7930: 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  d;.    if( db->p
7940: 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20  nBytesFreed ){. 
7950: 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70       for(pEnd=&p
7960: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
7970: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7980: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7990: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
79a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  }.      return;.
79b0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45      }.    for(pE
79c0: 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64  nd=&p[N]; p<pEnd
79d0: 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; p++){.      as
79e0: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
79f0: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
7a00: 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20  p[1].db );..    
7a10: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
7a20: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
7a30: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
7a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
7a50: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
7a60: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
7a70: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
7a80: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
7a90: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
7aa0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
7ab0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
7ac0: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
7ad0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
7ae0: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
7af0: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
7b00: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
7b10: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
7b20: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
7b30: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
7b40: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
7b50: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
7b60: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
7b70: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
7b80: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
7b90: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
7ba0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
7bb0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
7bc0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
7bd0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
7be0: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
7bf0: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
7c00: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
7c10: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
7c20: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
7c30: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
7c40: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
7c50: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
7c60: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
7c70: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
7c80: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
7c90: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
7ca0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
7cb0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
7cc0: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
7cd0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
7ce0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
7cf0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
7d00: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
7d10: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
7d20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d30: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
7d40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7d50: 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  f( p->zMalloc ){
7d60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d70: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
7d80: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
7d90: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  p->zMalloc = 0;.
7da0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
7db0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
7dc0: 76 61 6c 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20  valid;.    }.   
7dd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7de0: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7df0: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
7e00: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
7e10: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
7e20: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
7e30: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
7e40: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
7e50: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7e60: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7e70: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7e80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7e90: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
7ea0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
7eb0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
7ec0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
7ed0: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
7ee0: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7ef0: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
7f00: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
7f10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7f20: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
7f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
7f40: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
7f50: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7f60: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7f70: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7f80: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
7f90: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
7fa0: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
7fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7fc0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
7fd0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
7fe0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
7ff0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
8000: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8010: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
8020: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
8030: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
8040: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
8050: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
8060: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
8070: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
8080: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
8090: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
80a0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
80b0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
80c0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
80d0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
80e0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
80f0: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
8100: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
8110: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
8120: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
8130: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
8140: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
8150: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
8160: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
8170: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
8180: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
8190: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
81a0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
81b0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
81c0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
81d0: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
81e0: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
81f0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8200: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
8210: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
8220: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
8230: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
8240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8250: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
8260: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
8290: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
82a0: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
82b0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
82e0: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
82f0: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
8300: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
8310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8320: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
8330: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
8340: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8360: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
8370: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
8380: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
8390: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
83c0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
83d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8400: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
8410: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8430: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
8440: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
8450: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
8460: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8470: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
8480: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
8490: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
84a0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
84b0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
84c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
84d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
84e0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
84f0: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
8500: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
8510: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
8520: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
8530: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
8540: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
8550: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
8560: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
8570: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
8580: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
8590: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
85a0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
85b0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
85c0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
85d0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
85e0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
85f0: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
8600: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
8610: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
8620: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8630: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
8640: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
8650: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
8660: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
8670: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
8680: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
8690: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
86a0: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
86b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
86c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
86d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
86e0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
86f0: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
8700: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
8710: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
8720: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
8730: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
8740: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
8750: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
8760: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
8770: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
8780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
8790: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
87a0: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
87b0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
87c0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
87d0: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
87e0: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
87f0: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
8800: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
8810: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
8820: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
8830: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
8840: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
8850: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
8860: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
8870: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
8880: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
8890: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
88a0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
88b0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
88c0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
88d0: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
88e0: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
88f0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
8900: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
8910: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
8920: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
8930: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
8940: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
8950: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
8960: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
8970: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
8980: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
8990: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
89a0: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
89b0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
89c0: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
89d0: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
89e0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
89f0: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
8a00: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8a10: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
8a20: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
8a30: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
8a40: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8a50: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
8a60: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
8a70: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
8a80: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
8a90: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
8aa0: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
8ab0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
8ac0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
8ad0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
8ae0: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
8af0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
8b00: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
8b10: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
8b20: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
8b30: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
8b40: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
8b50: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
8b60: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
8b70: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
8b80: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
8b90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
8bb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
8bc0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
8bd0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
8be0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
8bf0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
8c00: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
8c10: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8c20: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
8c30: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
8c40: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
8c60: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  *z;.    Op *pOp;
8c70: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
8c80: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
8c90: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
8ca0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
8cb0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
8cc0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
8cd0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
8ce0: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
8cf0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
8d00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d10: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
8d20: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
8d30: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
8d40: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8d50: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
8d60: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
8d70: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
8d80: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8d90: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
8da0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
8db0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
8dc0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8dd0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
8de0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
8df0: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
8e00: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
8e10: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8e20: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
8e30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8e40: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
8e50: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8e60: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
8e70: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ea0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
8eb0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
8ec0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
8ed0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
8ee0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
8ef0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
8f00: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
8f10: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8f20: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
8f30: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
8f40: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8f50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8f60: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8f70: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8f80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8f90: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
8fa0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8fb0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8fc0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
8fd0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
8fe0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
8ff0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
9000: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
9010: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
9020: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
9030: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
9040: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
9050: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
9060: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
9070: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
9080: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
9090: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
90a0: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
90b0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
90c0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
90d0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
90e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
90f0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
9100: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
9110: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
9120: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
9130: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
9140: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
9150: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
9160: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
9170: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
9180: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
9190: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
91a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91b0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
91c0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
91d0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
91e0: 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62  Sub, nByte, nSub
91f0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
9200: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
9210: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
9220: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  ;.          apSu
9230: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
9240: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
9250: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
9260: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
9270: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
9280: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
9290: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
92a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
92b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
92c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
92d0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
92e0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
9310: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9320: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
9330: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9340: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9350: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
9360: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
9390: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
93a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
93b0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
93c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
93d0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
93e0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
93f0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9410: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P3 */.    pMem->
9420: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
9430: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
9440: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +;..    if( sqli
9450: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
9460: 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20  Mem, 32, 0) ){  
9470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
9480: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9490: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
94a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
94b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
94c0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
94d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
94e0: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
94f0: 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73  erm;.    z = dis
9500: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
9510: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
9520: 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  ( z!=pMem->z ){.
9530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9540: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
9550: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
9560: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
9570: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
9580: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
9590: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
95a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
95b0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
95c0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
95d0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
95e0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
95f0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9600: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
9610: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
9620: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9630: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9640: 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20  pMem, 4, 0) ){. 
9650: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9660: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9670: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
9680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
9690: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
96a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
96b0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
96c0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
96d0: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
96e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
96f0: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
9700: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
9710: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
9720: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9730: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9740: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9750: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9760: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
9770: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9780: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a        if( pOp->z
9790: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
97a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
97b0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
97c0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
97d0: 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  >z = pOp->zComme
97e0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  nt;.        pMem
97f0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
9800: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
9810: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
9820: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9830: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
9840: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9850: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  T;.      }else.#
9860: 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
9870: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
9880: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
98b0: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /.        pMem->
98c0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55  type = SQLITE_NU
98d0: 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
98e0: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
98f0: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
9900: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
9910: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
9920: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
9930: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
9940: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
9950: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
9960: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
9970: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9980: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
9990: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
99a0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
99b0: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
99c0: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
99d0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
99e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
99f0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
9a00: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
9a10: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
9a20: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
9a30: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
9a40: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
9a50: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
9a60: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
9a70: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
9a80: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
9a90: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  r *z = pOp->p4.z
9aa0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
9ab0: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
9ac0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74  ) z++;.    print
9ad0: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
9ae0: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9af0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9b00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
9b10: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
9b20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
9b30: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
9b40: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
9b50: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
9b60: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
9b70: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
9b80: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
9b90: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
9ba0: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
9bb0: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
9bc0: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
9bd0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
9be0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9bf0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9c00: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9c10: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9c20: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9c30: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
9c40: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
9c50: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9c60: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
9c70: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
9c80: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
9c90: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
9ca0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
9cb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
9cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9cd0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
9ce0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
9cf0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
9d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
9d10: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
9d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
9d30: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
9d40: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
9d50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
9d60: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
9d70: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
9d80: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
9d90: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9da0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
9db0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
9dc0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  RACE */../*.** A
9dd0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72  llocate space fr
9de0: 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20  om a fixed size 
9df0: 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72  buffer and retur
9e00: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
9e10: 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49  * that space.  I
9e20: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  f insufficient s
9e30: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
9e40: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
9e50: 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70  **.** The pBuf p
9e60: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
9e70: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
9e80: 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68   a pointer which
9e90: 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65   will.** receive
9ea0: 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   the new memory.
9eb0: 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c    pBuf is normal
9ec0: 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75  ly NULL.  If pBu
9ed0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
9ee0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
9ef0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73  memory space has
9f00: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
9f10: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74  located and that
9f20: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
9f30: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f   should not allo
9f40: 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d  cate any new mem
9f50: 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20  ory.  When pBuf 
9f60: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73  is not.** NULL s
9f70: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75  imply return pBu
9f80: 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74  f.  Only allocat
9f90: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61  e new memory spa
9fa0: 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20  ce when pBuf.** 
9fb0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e  is NULL..**.** n
9fc0: 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Byte is the numb
9fd0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
9fe0: 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  pace needed..**.
9ff0: 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74  ** *ppFrom point
a000: 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  s to available s
a010: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
a020: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
a030: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
a040: 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e  ble space.  When
a050: 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   space is alloca
a060: 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20  ted, *ppFrom is 
a070: 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a  advanced past.**
a080: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a090: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
a0a0: 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69  .**.** *pnByte i
a0b0: 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  s a counter of t
a0c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a0d0: 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74  es of space that
a0e0: 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20   have failed.** 
a0f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66  to allocate.  If
a100: 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66   there is insuff
a110: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20  icient space in 
a120: 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73  *ppFrom to satis
a130: 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  fy the.** reques
a140: 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  t, then incremen
a150: 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65  t *pnByte by the
a160: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72   amount of the r
a170: 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  equest..*/.stati
a180: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
a190: 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  ce(.  void *pBuf
a1a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
a1b0: 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  ere return point
a1c0: 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  er will be store
a1d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
a1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
a1f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
a200: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
a210: 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20  u8 **ppFrom,    
a220: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
a230: 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70  Allocate from *p
a240: 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70  pFrom */.  u8 *p
a250: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
a260: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
a270: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
a280: 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66  d of *ppFrom buf
a290: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
a2a0: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Byte          /*
a2b0: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
a2c0: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
a2d0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
a2e0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
a2f0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
a300: 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29  NMENT(*ppFrom) )
a310: 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72  ;.  if( pBuf ) r
a320: 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42  eturn pBuf;.  nB
a330: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
a340: 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70  te);.  if( &(*pp
a350: 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20  From)[nByte] <= 
a360: 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66  pEnd ){.    pBuf
a370: 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f   = (void*)*ppFro
a380: 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b  m;.    *ppFrom +
a390: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65  = nByte;.  }else
a3a0: 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d  {.    *pnByte +=
a3b0: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
a3c0: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
a3d0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
a3e0: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
a3f0: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
a400: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
a410: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
a420: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
a430: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
a440: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
a450: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
a460: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
a470: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
a480: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
a490: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
a4a0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
a4b0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
a4c0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
a4d0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a4e0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
a4f0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
a500: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
a510: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
a520: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
a530: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
a540: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
a550: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
a560: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
a570: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31  _DEBUG.  for(i=1
a580: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
a590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a5a0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
a5b0: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
a5c0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
a5d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
a5e0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
a5f0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
a600: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
a610: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
a620: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
a630: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
a640: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
a650: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
a660: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
a670: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
a680: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
a690: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
a6a0: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
a6b0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
a6c0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
a6d0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
a6e0: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
a6f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
a700: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
a710: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
a720: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
a730: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
a740: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
a750: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
a760: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
a770: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
a780: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
a790: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
a7a0: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
a7b0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
a7c0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
a7d0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
a7e0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
a7f0: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
a800: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
a810: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
a820: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
a830: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
a840: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
a850: 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20   once on a each 
a860: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
a870: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
a880: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a890: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
a8a0: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
a8b0: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
a8c0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
a8d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a8e0: 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20  d, futher calls 
a8f0: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
a900: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
a910: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
a920: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
a930: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
a940: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
a950: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
a960: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
a970: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
a980: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
a990: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
a9a0: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
a9b0: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
a9c0: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
a9d0: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
a9e0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
a9f0: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
aa00: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
aa10: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
aa20: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
aa30: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
aa40: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
aa50: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
aa60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
aa70: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
aaa0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
aab0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
aac0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
aad0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
aae0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab00: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
ab10: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
ab20: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab40: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
ab50: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
ab60: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
ab70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ab80: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
ab90: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
aba0: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
abc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
abd0: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
abe0: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
ac10: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
ac20: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
ac30: 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  Once;           
ac40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ac50: 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69  ber of OP_Once i
ac60: 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
ac70: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
aca0: 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20  */.  u8 *zCsr;  
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
acd0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
ace0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a  cation */.  u8 *
acf0: 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  zEnd;           
ad00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ad10: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c  rst byte past al
ad20: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a  located memory *
ad30: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65     /* How much e
ad60: 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e  xtra memory is n
ad70: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  eeded */..  asse
ad80: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
ad90: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
ada0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
adb0: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
adc0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
add0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
ade0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
adf0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
ae00: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
ae10: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
ae20: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
ae30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
ae40: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
ae50: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
ae60: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
ae70: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
ae80: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
ae90: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
aea0: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
aeb0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
aec0: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
aed0: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
aee0: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
aef0: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
af00: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
af10: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
af20: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
af30: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
af40: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
af50: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
af60: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
af70: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
af80: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
af90: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
afa0: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
afb0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
afc0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
afd0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
afe0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
aff0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
b000: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
b010: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
b020: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
b030: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
b040: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
b050: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
b060: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
b070: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
b080: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
b090: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
b0a0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
b0b0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
b0c0: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
b0d0: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
b0e0: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
b0f0: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
b100: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
b110: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
b120: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
b130: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
b140: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
b150: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
b160: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
b170: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e  ocation */.  zEn
b180: 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70  d = (u8*)&p->aOp
b190: 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20  [p->nOpAlloc];  
b1a0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
b1b0: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d  st end of zCsr[]
b1c0: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   */..  resolveP2
b1d0: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
b1e0: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
b1f0: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
b200: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
b210: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
b220: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
b230: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
b240: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
b250: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
b260: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
b270: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
b280: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
b290: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73  (u8*)0)&7;.  ass
b2a0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
b2b0: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
b2c0: 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  );.  p->expired 
b2d0: 3d 20 30 3b 0a 0a 20 20 70 2d 3e 65 78 70 69 72  = 0;..  p->expir
b2e0: 65 64 20 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20  ed = 0;.  .  /* 
b2f0: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73  Memory for regis
b300: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73  ters, parameters
b310: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69  , cursor, etc, i
b320: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  s allocated in t
b330: 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
b340: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
b350: 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
b360: 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65  use unused space
b370: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
b380: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
b390: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
b3a0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
b3b0: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
b3c0: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
b3d0: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
b3e0: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
b3f0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
b400: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
b410: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
b420: 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68  st using a fresh
b430: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
b440: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
b450: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
b460: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
b470: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
b480: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
b490: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70   the leftover sp
b4a0: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
b4b0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
b4c0: 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  ay can significa
b4d0: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65  ntly.  ** reduce
b4e0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
b4f0: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
b500: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
b510: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a  nt..  */.  do {.
b520: 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20      nByte = 0;. 
b530: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
b540: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c  ocSpace(p->aMem,
b550: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
b560: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b570: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b580: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
b590: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  e(p->aVar, nVar*
b5a0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
b5b0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b5c0: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20  );.    p->apArg 
b5d0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b5e0: 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
b5f0: 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c  of(Mem*), &zCsr,
b600: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b610: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61      p->azVar = a
b620: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56  llocSpace(p->azV
b630: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
b640: 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  char*), &zCsr, z
b650: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b660: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c    p->apCsr = all
b670: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72  ocSpace(p->apCsr
b680: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
b690: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20  (VdbeCursor*),. 
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20           &zCsr, 
b6c0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b6d0: 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20     p->aOnceFlag 
b6e0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b6f0: 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65  aOnceFlag, nOnce
b700: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
b710: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
b720: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70  nByte ){.      p
b730: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
b740: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
b750: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
b760: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
b770: 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ree;.    zEnd = 
b780: 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20  &zCsr[nByte];.  
b790: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
b7a0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
b7b0: 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72  ed );..  p->nCur
b7c0: 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73  sor = (u16)nCurs
b7d0: 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c  or;.  p->nOnceFl
b7e0: 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66  ag = nOnce;.  if
b7f0: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
b800: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
b810: 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28  r)nVar;.    for(
b820: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
b830: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  ){.      p->aVar
b840: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
b850: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Null;.      p->a
b860: 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Var[n].db = db;.
b870: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b880: 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20  p->azVar ){.    
b890: 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73  p->nzVar = pPars
b8a0: 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65  e->nzVar;.    me
b8b0: 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70  mcpy(p->azVar, p
b8c0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d  Parse->azVar, p-
b8d0: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d  >nzVar*sizeof(p-
b8e0: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20  >azVar[0]));.   
b8f0: 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e   memset(pParse->
b900: 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65  azVar, 0, pParse
b910: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
b920: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29  Parse->azVar[0])
b930: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
b940: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61  aMem ){.    p->a
b950: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
b960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
b970: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
b980: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70  1..nMem */.    p
b990: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9b0: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
b9c0: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
b9d0: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
b9e0: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
b9f0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
ba00: 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a   = MEM_Invalid;.
ba10: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
ba20: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
ba30: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
ba40: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
ba50: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
ba60: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
ba70: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
ba80: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
ba90: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
baa0: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
bab0: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
bac0: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
bad0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
bae0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
baf0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
bb00: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
bb10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
bb20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  .  sqlite3VdbeSo
bb30: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
bb40: 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78   pCx);.  if( pCx
bb50: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
bb60: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
bb70: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
bb80: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
bb90: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
bba0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
bbb0: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
bbc0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
bbd0: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
bbe0: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
bbf0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
bc00: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
bc10: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
bc20: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
bc30: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
bc40: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
bc50: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
bc60: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
bc70: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
bc80: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
bc90: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
bca0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
bcb0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
bcc0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
bcd0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
bce0: 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d   1;.    pModule-
bcf0: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
bd00: 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  sor);.    p->inV
bd10: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
bd20: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
bd30: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
bd40: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
bd50: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
bd60: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
bd70: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
bd80: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
bd90: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
bda0: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
bdb0: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
bdc0: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
bdd0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
bde0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
bdf0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
be00: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
be10: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
be20: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61  Frame->v;.  v->a
be30: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
be40: 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->aOnceFlag;.  
be50: 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->nOnceFlag = p
be60: 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67  Frame->nOnceFlag
be70: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
be80: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
be90: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
bea0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
beb0: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
bec0: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
bed0: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
bee0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
bef0: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
bf00: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
bf10: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
bf20: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
bf30: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
bf40: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
bf50: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75  >nChange;.  retu
bf60: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
bf70: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
bf80: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
bf90: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
bfa0: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
bfb0: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
bfc0: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
bfd0: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
bfe0: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
bff0: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
c000: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
c010: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
c020: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
c030: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
c040: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
c050: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
c060: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
c070: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
c080: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
c090: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
c0a0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
c0b0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
c0c0: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
c0d0: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
c0e0: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
c0f0: 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
c100: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
c110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
c120: 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
c130: 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72  e);.  }.  p->pFr
c140: 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ame = 0;.  p->nF
c150: 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  rame = 0;..  if(
c160: 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
c170: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
c180: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
c190: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
c1a0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
c1b0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
c1c0: 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
c1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1e0: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
c1f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
c200: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
c210: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
c220: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
c230: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
c240: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20  ay(&p->aMem[1], 
c250: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
c260: 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
c270: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
c280: 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
c290: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
c2a0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
c2b0: 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
c2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
c2d0: 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
c2e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
c2f0: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
c300: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
c310: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c320: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
c330: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
c340: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
c350: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
c360: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
c370: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
c380: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
c390: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
c3a0: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
c3b0: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
c3c0: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
c3d0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
c3e0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
c3f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
c400: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
c410: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c420: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
c430: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
c440: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
c450: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
c460: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
c470: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
c480: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
c490: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
c4a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
c4b0: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
c4c0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
c4d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
c4e0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
c4f0: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29  i<=p->nMem; i++)
c500: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
c510: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49  [i].flags==MEM_I
c520: 6e 76 61 6c 69 64 20 29 3b 0a 20 20 7d 0a 23 65  nvalid );.  }.#e
c530: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44  ndif..  sqlite3D
c540: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
c550: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
c560: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
c570: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
c580: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
c590: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
c5a0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
c5b0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
c5c0: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
c5d0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
c5e0: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
c5f0: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
c600: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
c610: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
c620: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
c630: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
c640: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
c650: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
c660: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
c670: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
c680: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
c690: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
c6a0: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
c6b0: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
c6c0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
c6d0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
c6e0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
c6f0: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
c700: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
c710: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
c720: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
c730: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c740: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
c750: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
c760: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
c770: 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
c780: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
c790: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
c7a0: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
c7b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c7c0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
c7d0: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
c7e0: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
c7f0: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
c800: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
c810: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
c820: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
c830: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
c840: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
c850: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
c860: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
c870: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
c880: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
c890: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
c8a0: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
c8b0: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
c8c0: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
c8d0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
c8e0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
c8f0: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
c900: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
c910: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
c920: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
c930: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
c940: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
c950: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
c960: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
c970: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
c980: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
c990: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
c9a0: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
c9b0: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
c9c0: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
c9d0: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
c9e0: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
c9f0: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
ca00: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
ca10: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
ca20: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
ca50: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
ca60: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
ca90: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
caa0: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
cab0: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
cae0: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
caf0: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
cb00: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
cb10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
cb20: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
cb30: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
cb40: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
cb50: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
cb60: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
cb70: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
cb80: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
cb90: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
cba0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
cbb0: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
cbc0: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
cbd0: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
cbe0: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
cbf0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cc00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
cc10: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
cc20: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
cc30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
cc40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
cc50: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
cc60: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
cc70: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
cc80: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
cc90: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
cca0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
ccb0: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
ccc0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
ccd0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
cce0: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
ccf0: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
cd00: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
cd10: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
cd20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cd30: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
cd40: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
cd50: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
cd60: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
cd70: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
cd80: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
cd90: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
cda0: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
cdb0: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
cdc0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
cdd0: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
cde0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
cdf0: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
ce00: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
ce10: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
ce20: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
ce30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ce40: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
ce50: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
ce60: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
ce70: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
ce80: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
ce90: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
cea0: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
ceb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
cec0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ced0: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
cee0: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
cef0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
cf00: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
cf10: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
cf20: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
cf30: 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
cf40: 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
cf50: 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
cf60: 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
cf70: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
cf80: 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
cf90: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
cfa0: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
cfb0: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
cfc0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
cfd0: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
cfe0: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
cff0: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
d000: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
d010: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
d020: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
d030: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
d040: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d050: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
d060: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
d070: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
d080: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
d090: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
d0a0: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
d0b0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
d0c0: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
d0d0: 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29  db, &p->zErrMsg)
d0e0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
d0f0: 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
d100: 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
d110: 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
d120: 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
d130: 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
d140: 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
d150: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
d160: 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
d170: 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
d180: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
d190: 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
d1a0: 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
d1b0: 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
d1c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
d1d0: 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
d1e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
d1f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
d200: 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
d210: 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
d220: 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
d230: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d240: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d250: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
d260: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
d270: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
d280: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
d290: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
d2a0: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58  ) ){.      needX
d2b0: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
d2c0: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72    if( i!=1 ) nTr
d2d0: 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  ans++;.      rc 
d2e0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
d2f0: 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
d300: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
d310: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
d320: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d330: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
d340: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
d350: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
d360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
d370: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
d380: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
d390: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
d3a0: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
d3b0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
d3c0: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
d3d0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
d3e0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
d3f0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d400: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d410: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
d420: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
d430: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
d440: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
d450: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
d460: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
d470: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
d480: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
d490: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
d4a0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
d4b0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
d4c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
d4d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
d4e0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
d4f0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
d500: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
d510: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
d520: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
d530: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
d540: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
d550: 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
d560: 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
d570: 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
d580: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
d590: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
d5a0: 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
d5b0: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
d5c0: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
d5d0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
d5e0: 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
d5f0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
d600: 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
d610: 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
d620: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
d630: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d640: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
d650: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
d660: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
d670: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
d680: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
d690: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
d6a0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
d6b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d6c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
d6d0: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
d6e0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
d6f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
d700: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
d710: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
d720: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
d730: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
d740: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
d750: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
d760: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
d770: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
d780: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
d790: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
d7a0: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
d7b0: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
d7c0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
d7d0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
d7e0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
d7f0: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
d800: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
d810: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
d820: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
d830: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
d840: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
d850: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
d860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d870: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
d880: 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
d890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d8a0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d8b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
d8c0: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
d8d0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
d8e0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
d8f0: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
d900: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
d910: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
d920: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
d930: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
d940: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d950: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
d960: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
d970: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
d980: 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  micly..  */.#ifn
d990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d9a0: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
d9b0: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
d9c0: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
d9d0: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
d9e0: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
d9f0: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
da00: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
da10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
da20: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
da30: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
da40: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
da50: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
da60: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
da70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
da80: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
da90: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
daa0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
dab0: 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d  int retryCount =
dac0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69   0;.    int nMai
dad0: 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  nFile;..    /* S
dae0: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
daf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
db00: 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c   */.    nMainFil
db10: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
db20: 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  n30(zMainFile);.
db30: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
db40: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
db50: 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58   "%s-mjXXXXXX9XX
db60: 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  z", zMainFile);.
db70: 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d      if( zMaster=
db80: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
db90: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f  TE_NOMEM;.    do
dba0: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
dbb0: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
dbc0: 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
dbd0: 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
dbe0: 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
dbf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
dc00: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
dc10: 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
dc20: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
dc30: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
dc40: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
dc50: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
dc60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
dc70: 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
dc80: 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
dc90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
dca0: 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
dcb0: 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
dcc0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
dcd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
dce0: 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
dcf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
dd00: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
dd10: 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
dd20: 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
dd30: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
dd40: 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
dd50: 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
dd60: 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
dd90: 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
dda0: 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
ddb0: 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
ddc0: 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
ddd0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
dde0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
ddf0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
de00: 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
de10: 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
de20: 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
de30: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
de40: 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
de50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
de60: 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
de70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
de80: 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
de90: 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
dea0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
deb0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
dec0: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
ded0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
dee0: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
def0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
df00: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
df10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
df20: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
df30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
df40: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
df50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
df60: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
df70: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
df80: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
df90: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
dfa0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
dfb0: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
dfc0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
dfd0: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
dfe0: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
dff0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
e000: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
e010: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e030: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e040: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e050: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
e060: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
e070: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
e080: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
e090: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
e0a0: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
e0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
e0c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e0d0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
e0e0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
e0f0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
e100: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
e110: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
e120: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
e130: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
e140: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
e150: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e160: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
e170: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
e180: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
e190: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
e1a0: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
e1b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e1c0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
e1d0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
e1e0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e1f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
e200: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
e210: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
e220: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
e230: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
e240: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
e250: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
e260: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
e270: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
e280: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
e290: 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
e2a0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
e2b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
e2c0: 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
e2d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
e2e0: 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21  ( !needSync && !
e2f0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
e300: 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b  Disabled(pBt) ){
e310: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
e320: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
e330: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
e340: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
e350: 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
e360: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
e370: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
e380: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
e390: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
e3a0: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
e3b0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e3c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e3d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
e3e0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
e3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e400: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
e410: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
e420: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e430: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e440: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
e450: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
e460: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e470: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
e480: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e490: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
e4a0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
e4b0: 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
e4c0: 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
e4d0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
e4e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
e4f0: 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
e500: 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
e510: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
e520: 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
e530: 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
e540: 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
e550: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
e560: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
e570: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
e580: 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
e590: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
e5a0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
e5b0: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
e5c0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
e5d0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
e5e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e5f0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
e600: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e610: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
e620: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
e630: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
e640: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e650: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
e660: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
e670: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
e680: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
e690: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
e6a0: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
e6b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
e6c0: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
e6d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e6e0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
e6f0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
e700: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
e710: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
e720: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
e730: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
e740: 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
e750: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
e760: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
e770: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e780: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
e790: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
e7a0: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
e7b0: 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
e7c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e7d0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
e7e0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
e7f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
e800: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
e810: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
e820: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
e830: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
e840: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
e850: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
e860: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
e870: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
e880: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
e890: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e8a0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
e8b0: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
e8c0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e8d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
e8e0: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
e8f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e900: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
e910: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e920: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e930: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e940: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e950: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e960: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
e970: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
e980: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
e990: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
e9a0: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
e9b0: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
e9c0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
e9d0: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
e9e0: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
e9f0: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
ea00: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
ea10: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
ea20: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
ea30: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
ea40: 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
ea50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ea60: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
ea70: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
ea80: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ea90: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
eaa0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
eab0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
eac0: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
ead0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
eae0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
eaf0: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
eb00: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
eb10: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
eb20: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
eb30: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
eb40: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
eb50: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
eb60: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
eb70: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
eb80: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
eb90: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
eba0: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
ebb0: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
ebc0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
ebd0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
ebe0: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
ebf0: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
ec00: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
ec10: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
ec20: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
ec30: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
ec40: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
ec50: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
ec60: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
ec70: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
ec80: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
ec90: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
eca0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
ecb0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
ecc0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ecd0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ece0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ecf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ed00: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
ed10: 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20  eTwo(pBt, 1);.  
ed20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ed30: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
ed40: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
ed50: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
ed60: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
ed70: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
ed80: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
ed90: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
eda0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
edb0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
edc0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
edd0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
ede0: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
edf0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
ee00: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
ee10: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
ee20: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
ee30: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
ee40: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
ee50: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
ee60: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
ee70: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
ee80: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
ee90: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
eea0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
eeb0: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
eec0: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
eed0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
eee0: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
eef0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
ef00: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
ef10: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
ef20: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
ef30: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
ef40: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
ef50: 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
ef60: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
ef70: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
ef80: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
ef90: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
efa0: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
efb0: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
efc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
efd0: 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
efe0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
eff0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
f000: 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
f010: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
f020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
f030: 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56  rite==db->writeV
f040: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
f050: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
f060: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
f070: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
f080: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
f090: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
f0a0: 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
f0b0: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
f0c0: 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
f0d0: 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
f0e0: 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
f0f0: 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
f100: 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
f110: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
f120: 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
f130: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
f140: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
f150: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
f160: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
f170: 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
f180: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
f190: 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
f1a0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
f1b0: 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a  s commtted..**.*
f1c0: 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
f1d0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
f1e0: 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
f1f0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
f200: 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
f210: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
f220: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f230: 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
f240: 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
f250: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
f260: 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
f270: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f280: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
f290: 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
f2a0: 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
f2b0: 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
f2c0: 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
f2d0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f2e0: 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
f2f0: 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
f300: 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
f310: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
f320: 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
f330: 79 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c 20  y have occured, 
f340: 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67  causing an emerg
f350: 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ency rollback.. 
f360: 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
f370: 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74   (db->nStatement
f380: 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20  ==0), and there 
f390: 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  is nothing to do
f3a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
f3b0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
f3c0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
f3d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
f3e0: 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
f3f0: 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
f400: 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
f410: 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
f420: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
f430: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
f440: 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
f450: 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
f460: 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
f470: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
f480: 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
f490: 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
f4a0: 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
f4b0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f4c0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
f4d0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
f4e0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
f4f0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
f500: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
f510: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
f520: 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
f530: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
f540: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
f550: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
f560: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
f570: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
f580: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
f590: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
f5a0: 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
f5b0: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
f5c0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
f5d0: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
f5e0: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
f5f0: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
f600: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
f610: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f620: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
f630: 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
f640: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f650: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
f660: 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
f670: 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ement = 0;..    
f680: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f690: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  K ){.      if( e
f6a0: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
f6b0: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
f6c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f6d0: 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
f6e0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f6f0: 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
f700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f710: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f720: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f730: 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
f740: 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
f750: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
f760: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f770: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f780: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
f790: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f7a0: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
f7b0: 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
f7c0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
f7d0: 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
f7e0: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
f7f0: 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
f800: 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
f810: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  n .    ** the st
f820: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f830: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
f840: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   */.    if( eOp=
f850: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
f860: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ACK ){.      db-
f870: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
f880: 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
f890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f8a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f8b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f8c0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
f8d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
f8e0: 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
f8f0: 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
f900: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
f910: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
f920: 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
f930: 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
f940: 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
f950: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
f960: 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
f970: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
f980: 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
f990: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f9a0: 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
f9b0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
f9c0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
f9d0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
f9e0: 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
f9f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
fa00: 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
fa10: 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
fa20: 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
fa30: 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
fa40: 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a  INT and write.**
fa50: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
fa60: 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
fa70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
fa80: 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
fa90: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
faa0: 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
fab0: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
fac0: 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
fad0: 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
fae0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
faf0: 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 64  ( (deferred && d
fb00: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
fb10: 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72 65  >0) || (!deferre
fb20: 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
fb30: 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20 20  raint>0) ){.    
fb40: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
fb50: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 70  ONSTRAINT;.    p
fb60: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
fb70: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
fb80: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
fb90: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
fba0: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e  "foreign key con
fbb0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
fbc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fbd0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
fbe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fbf0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
fc00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fc10: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
fc20: 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
fc30: 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
fc40: 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
fc50: 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
fc60: 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
fc70: 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
fc80: 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
fc90: 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
fca0: 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
fcb0: 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
fcc0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
fcd0: 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
fce0: 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
fcf0: 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
fd00: 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
fd10: 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
fd20: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
fd30: 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
fd40: 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
fd50: 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
fd60: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
fd70: 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
fd80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
fd90: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
fda0: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
fdb0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
fdc0: 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
fdd0: 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
fde0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
fdf0: 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
fe00: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
fe10: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
fe20: 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
fe30: 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
fe40: 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
fe50: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
fe60: 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
fe70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe90: 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
fea0: 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
feb0: 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
fec0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
fed0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
fee0: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
fef0: 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
ff00: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
ff10: 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
ff20: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
ff30: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
ff40: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
ff50: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
ff60: 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
ff70: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
ff80: 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
ff90: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
ffa0: 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
ffb0: 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
ffc0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
ffd0: 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
ffe0: 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
fff0: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
10000 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
10010 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
10020 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
10030 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
10040 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
10050 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
10060 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
10070 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
10080 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
10090 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
100a0 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
100b0 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
100c0 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
100d0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
100e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
100f0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
10100 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
10110 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
10120 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10130 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  M;.  }.  if( p->
10140 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73  aOnceFlag ) mems
10150 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  et(p->aOnceFlag,
10160 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67   0, p->nOnceFlag
10170 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  );.  closeAllCur
10180 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
10190 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
101a0 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
101b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
101c0 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
101d0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
101e0 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
101f0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
10200 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
10210 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a   never started *
10220 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
10230 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
10240 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
10250 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
10260 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
10270 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
10280 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
10290 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
102a0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
102b0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
102c0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
102d0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
102e0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
102f0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
10300 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
10310 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
10320 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
10330 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
10340 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
10350 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
10360 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
10370 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
10380 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  KED );  /* This 
10390 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20  error no longer 
103a0 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73  exists */.    is
103b0 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
103c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
103d0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
103e0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
103f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
10400 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
10410 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
10420 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
10430 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
10440 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
10450 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
10460 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
10470 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
10480 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
10490 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
104a0 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
104b0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
104c0 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
104d0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
104e0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
104f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
10500 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
10510 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
10520 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
10530 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
10540 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
10550 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
10560 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
10570 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
10580 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
10590 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
105a0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
105b0 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
105c0 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
105d0 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68     ** occured wh
105e0 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
105f0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
10600 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
10610 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
10620 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
10630 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
10640 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
10650 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
10660 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
10670 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
10680 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
10690 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
106a0 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
106b0 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
106c0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
106d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
106e0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
106f0 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
10700 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
10710 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
10720 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
10730 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
10740 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
10750 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
10760 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
10770 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10780 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
10790 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
107a0 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
107b0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
107c0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
107d0 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
107e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
107f0 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
10800 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
10810 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
10820 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
10830 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
10840 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10850 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
10860 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
10870 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
10880 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
10890 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
108a0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
108b0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
108c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
108d0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
108e0 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
108f0 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
10900 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
10910 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10920 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10930 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
10940 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
10950 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
10960 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
10970 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
10980 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
10990 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
109a0 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
109b0 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
109c0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
109d0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
109e0 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
109f0 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
10a00 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
10a10 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
10a20 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
10a30 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
10a40 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
10a50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10a60 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
10a70 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
10a80 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
10a90 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74       && db->writ
10aa0 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65  eVdbeCnt==(p->re
10ab0 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
10ac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
10ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
10ae0 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
10af0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
10b00 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
10b10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10b20 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
10b30 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
10b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10b50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
10b60 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
10b70 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
10b80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b90 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
10ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10bb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
10bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10bd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
10be0 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
10bf0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
10c00 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
10c10 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
10c20 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
10c30 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
10c40 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
10c50 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
10c60 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
10c70 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
10c80 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
10c90 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
10ca0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
10cb0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
10cc0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
10cd0 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
10ce0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
10cf0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
10d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
10d10 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
10d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10d40 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
10d50 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
10d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
10d70 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
10d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
10d90 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
10da0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
10db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10dc0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
10dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10de0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
10df0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
10e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10e10 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
10e20 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
10e30 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
10e40 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
10e50 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
10e60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10e80 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
10e90 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d  ITE_OK);.      }
10ea0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
10eb0 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
10ec0 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
10ed0 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
10ee0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
10ef0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
10f00 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10f10 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
10f20 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
10f30 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
10f40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
10f50 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10f60 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
10f70 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
10f80 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
10f90 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
10fa0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
10fb0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
10fc0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
10fd0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
10fe0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10ff0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
11000 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
11010 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
11020 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
11030 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
11040 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
11050 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
11060 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
11070 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
11080 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
11090 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
110a0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
110b0 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
110c0 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
110d0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
110e0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
110f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
11100 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
11110 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
11120 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
11130 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
11140 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20  en promote the. 
11150 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74     ** current st
11160 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f  atement error co
11170 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
11180 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  f( eStatementOp 
11190 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
111a0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
111b0 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74  atement(p, eStat
111c0 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20  ementOp);.      
111d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
111e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
111f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
11200 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
11210 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
11220 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
11230 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11240 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
11250 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
11260 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
11270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11280 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11290 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
112a0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
112b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
112c0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
112d0 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
112e0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
112f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11300 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
11310 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
11320 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
11330 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
11340 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
11350 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
11360 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
11370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
11380 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
11390 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
113a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
113b0 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
113c0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
113d0 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
113e0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
113f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
11400 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
11410 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
11420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
11430 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
11440 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
11450 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
11460 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
11470 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
11480 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
11490 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
114a0 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
114b0 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
114c0 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
114d0 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
114e0 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
114f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
11500 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63  =0 ){.    db->ac
11510 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  tiveVdbeCnt--;. 
11520 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
11530 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  nly ){.      db-
11540 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b  >writeVdbeCnt--;
11550 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
11560 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
11570 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56  eCnt>=db->writeV
11580 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20  dbeCnt );.  }.  
11590 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
115a0 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
115b0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
115c0 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
115d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
115e0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
115f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11600 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
11610 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
11620 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
11630 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
11640 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
11650 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
11660 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
11670 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
11680 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
11690 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
116a0 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
116b0 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
116c0 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
116d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
116e0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
116f0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
11700 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
11710 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
11720 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
11730 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  nt>0 || db->auto
11740 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
11750 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
11760 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
11770 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
11780 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
11790 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
117a0 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
117b0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
117c0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
117d0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
117e0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
117f0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
11800 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
11810 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
11820 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
11830 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
11840 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
11850 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
11860 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11870 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
11880 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
11890 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
118a0 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
118b0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
118c0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
118d0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
118e0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
118f0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
11900 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
11910 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
11920 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
11930 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
11940 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11950 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
11960 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
11970 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
11980 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
11990 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
119a0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
119b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
119c0 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
119d0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
119e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
119f0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
11a00 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
11a10 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
11a20 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
11a30 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
11a40 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11a50 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
11a60 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
11a70 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
11a80 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
11a90 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
11aa0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
11ab0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11ac0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d  alloc();.    db-
11ad0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
11ae0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
11af0 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
11b00 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rc;.  }else{.   
11b10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
11b20 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  , rc, 0);.  }.  
11b30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11b40 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
11b50 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
11b60 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
11b70 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
11b80 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
11b90 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
11ba0 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
11bb0 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
11bc0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
11bd0 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
11be0 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
11bf0 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
11c00 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
11c10 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
11c20 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
11c30 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
11c40 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
11c50 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
11c60 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
11c70 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
11c80 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
11c90 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
11ca0 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
11cb0 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
11cc0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
11cd0 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
11ce0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11cf0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
11d00 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
11d10 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
11d20 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
11d30 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
11d40 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
11d50 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
11d60 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
11d70 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
11d80 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
11d90 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
11da0 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
11db0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
11dc0 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
11dd0 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
11de0 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
11df0 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
11e00 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
11e10 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
11e20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
11e30 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
11e40 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
11e50 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
11e60 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
11e70 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
11e80 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
11e90 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
11ea0 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
11eb0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
11ec0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
11ed0 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
11ee0 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
11ef0 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
11f00 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20  sferError(p);.  
11f10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11f20 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
11f30 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
11f40 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
11f50 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
11f60 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
11f70 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
11f80 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
11f90 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
11fa0 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
11fb0 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
11fc0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
11fd0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
11fe0 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
11ff0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
12000 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
12010 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
12020 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
12030 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
12040 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
12050 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
12060 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
12070 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
12080 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12090 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
120a0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
120b0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
120c0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
120d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
120e0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
120f0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
12100 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
12110 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
12120 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
12130 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
12140 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
12150 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
12160 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
12170 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
12180 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
12190 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
121a0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
121b0 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
121c0 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
121d0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
121e0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
121f0 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
12200 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12210 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
12220 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
12230 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
12240 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
12250 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
12260 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
12270 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12280 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
12290 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
122a0 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
122b0 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
122c0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
122d0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
122e0 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
122f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
12300 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
12310 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
12320 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
12330 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
12340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
12350 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
12360 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
12370 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
12380 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
12390 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
123a0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
123b0 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
123c0 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
123d0 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
123e0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
123f0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
12400 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
12410 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
12420 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
12430 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
12440 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
12450 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
12460 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
12470 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
12480 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
12490 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
124a0 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
124b0 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
124c0 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
124d0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
124e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
124f0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
12500 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
12510 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
12520 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
12530 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
12540 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74  .}../*.** Call t
12560 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
12570 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65  r each auxdata e
12580 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e  ntry in pVdbeFun
12590 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  c for which.** t
125a0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
125b0 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20   bit in mask is 
125c0 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20  clear.  Auxdata 
125d0 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33  entries beyond 3
125e0 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20  1.** are always 
125f0 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64  destroyed.  To d
12600 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61  estroy all auxda
12610 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c  ta entries, call
12620 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
12630 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a   with mask==0..*
12640 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
12650 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
12660 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
12670 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  unc, int mask){.
12680 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
12690 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d  =0; i<pVdbeFunc-
126a0 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAux; i++){.   
126b0 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20   struct AuxData 
126c0 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75  *pAux = &pVdbeFu
126d0 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20  nc->apAux[i];.  
126e0 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21    if( (i>31 || !
126f0 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 3c  (mask&(((u32)1)<
12700 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70  <i))) && pAux->p
12710 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Aux ){.      if(
12720 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
12730 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
12740 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
12750 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
12760 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20     pAux->pAux = 
12770 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
12780 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
12790 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
127a0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
127b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
127c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
127d0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
127e0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
127f0 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
12800 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
12810 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
12820 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
12830 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
12840 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
12850 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12860 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
12870 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
12880 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
12890 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 6c  DeleteObject(sql
128a0 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
128b0 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
128c0 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
128d0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
128e0 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
128f0 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
12900 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
12910 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
12920 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
12930 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
12940 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
12950 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
12960 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
12970 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
12980 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
12990 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
129a0 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
129b0 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
129c0 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
129d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
129e0 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
129f0 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31  for(i=p->nzVar-1
12a00 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c  ; i>=0; i--) sql
12a10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12a20 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76  ->azVar[i]);.  v
12a30 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
12a40 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
12a50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
12a60 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65  ree(db, p->aLabe
12a70 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
12a80 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
12a90 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
12aa0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
12ab0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
12ac0 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
12ad0 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
12ae0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
12af0 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c  E_EXPLAIN).  sql
12b00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12b10 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73  ->zExplain);.  s
12b20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12b30 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23   p->pExplain);.#
12b40 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
12b50 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
12b60 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
12b70 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
12b80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
12b90 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
12ba0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
12bb0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
12bc0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
12bd0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
12be0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12bf0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
12c00 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ex) );.  if( p->
12c10 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
12c20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
12c30 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
12c40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
12c50 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
12c60 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
12c70 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
12c80 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
12c90 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
12ca0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
12cb0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
12cc0 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
12cd0 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
12ce0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12cf0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d  Object(db, p);.}
12d00 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
12d10 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
12d20 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
12d30 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
12d40 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
12d50 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
12d60 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
12d70 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
12d80 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
12d90 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
12da0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
12db0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
12dc0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
12dd0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
12de0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
12df0 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
12e00 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
12e10 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
12e20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
12e30 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
12e40 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
12e50 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
12e60 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
12e70 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
12e80 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
12e90 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
12ea0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
12eb0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
12ec0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
12ed0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
12ee0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
12ef0 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
12f00 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
12f10 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
12f20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
12f30 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
12f40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12f50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
12f60 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
12f70 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
12f80 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
12f90 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
12fa0 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
12fb0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
12fc0 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
12fd0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
12fe0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
12ff0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
13000 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
13010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13020 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
13030 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
13040 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
13050 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
13060 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13070 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
13080 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
13090 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72  arget;.    if( r
130a0 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
130b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
130c0 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  PT;.    p->rowid
130d0 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66  IsValid = 1;.#if
130e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
130f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
13100 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
13110 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
13120 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
13130 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
13140 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
13150 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
13160 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  YS(p->pCursor) )
13170 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
13180 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
13190 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
131a0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
131b0 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
131c0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
131d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
131e0 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
131f0 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
13200 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
13210 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
13220 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
13230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13240 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13250 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
13260 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
13270 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13280 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
13290 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
132a0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
132b0 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
132c0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
132d0 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
132e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
132f0 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
13300 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
13310 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
13320 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
13330 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
13340 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
13350 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
13360 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
13370 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
13380 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
13390 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
133a0 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
133b0 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
133c0 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
133d0 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
133e0 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
133f0 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
13400 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
13410 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
13420 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
13430 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
13440 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
13450 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
13460 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
13470 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
13480 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
13490 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
134a0 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
134b0 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
134c0 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
134d0 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
134e0 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
134f0 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
13500 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
13510 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
13520 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
13530 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13540 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
13550 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
13560 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
13570 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
13580 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
13590 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
135a0 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
135c0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
135d0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
135e0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13610 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13630 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13640 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13650 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
13670 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13680 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13690 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
136a0 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
136b0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
136c0 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
136f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13700 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
13710 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
13720 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13730 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13740 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13750 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
13760 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13770 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
137a0 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
137b0 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
137c0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
137d0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
137e0 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13810 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
13820 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13850 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
13860 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
13870 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
13880 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
13890 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
138a0 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
138b0 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
138c0 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
138d0 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
138e0 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
138f0 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
13900 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
13910 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
13920 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
13930 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
13940 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
13950 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
13960 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
13970 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
13980 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
13990 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
139a0 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
139b0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
139c0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
139d0 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
139e0 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
139f0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
13a00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
13a10 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
13a20 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
13a30 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
13a40 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
13a50 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
13a60 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
13a70 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
13a80 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
13a90 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
13aa0 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
13ab0 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
13ac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28  ){.      if( i<(
13ad0 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65  -MAX_6BYTE) ) re
13ae0 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a  turn 6;.      /*
13af0 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70   Previous test p
13b00 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28  revents:  u = -(
13b10 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
13b20 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75  5808) */.      u
13b30 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = -i;.    }else
13b40 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
13b50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
13b60 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74  127 ){.      ret
13b70 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26  urn ((i&1)==i &&
13b80 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29   file_format>=4)
13b90 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b   ? 8+(u32)u : 1;
13ba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
13bb0 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
13bc0 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
13bd0 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
13be0 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
13bf0 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
13c00 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
13c10 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
13c20 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
13c30 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
13c40 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
13c50 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
13c60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
13c70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13c80 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
13c90 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
13ca0 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
13cb0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
13cc0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
13cd0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
13ce0 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
13cf0 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
13d00 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
13d10 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
13d20 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
13d30 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
13d40 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
13d50 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
13d60 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
13d70 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
13d80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13d90 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
13da0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
13db0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
13dc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
13dd0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
13de0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
13df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
13e00 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
13e10 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
13e20 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
13e30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
13e40 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
13e50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
13e60 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
13e70 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
13e80 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
13e90 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
13ea0 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
13eb0 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
13ec0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
13ed0 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
13ee0 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
13ef0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
13f00 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
13f10 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
13f20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
13f30 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
13f40 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
13f50 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
13f60 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
13f70 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
13f80 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
13f90 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
13fa0 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
13fb0 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
13fc0 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
13fd0 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
13fe0 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
13ff0 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
14000 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
14010 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
14020 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
14030 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
14040 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
14050 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
14060 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
14070 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
14080 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
14090 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
140a0 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
140b0 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
140c0 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
140d0 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
140e0 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
140f0 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
14100 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
14110 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
14120 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
14130 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
14140 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
14150 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
14160 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
14170 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
14180 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
14190 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
141a0 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
141b0 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
141c0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
141d0 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
141e0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
141f0 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
14200 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
14210 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
14220 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
14230 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
14240 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
14250 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
14260 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
14270 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
14280 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
14290 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
142a0 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
142b0 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
142c0 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
142d0 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
142e0 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
142f0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
14300 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
14310 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
14320 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
14330 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
14340 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
14350 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
14360 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
14370 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
14380 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
14390 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
143a0 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
143b0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
143c0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
143d0 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
143e0 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
143f0 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
14400 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
14410 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
14420 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
14430 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
14440 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
14450 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
14460 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
14470 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
14480 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
14490 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
144a0 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
144b0 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
144c0 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
144d0 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
144e0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
144f0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
14500 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
14510 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
14520 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
14530 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
14540 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
14550 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
14560 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
14570 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
14580 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
14590 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
145a0 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
145b0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
145c0 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
145d0 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
145e0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
145f0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
14600 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
14610 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
14620 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
14630 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
14640 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
14650 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
14660 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
14670 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
14680 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
14690 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
146a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
146b0 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
146c0 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
146d0 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
146e0 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
146f0 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
14700 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
14710 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
14720 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
14730 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
14740 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
14750 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
14760 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
14770 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
14780 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
14790 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
147a0 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
147b0 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
147c0 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
147d0 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
147e0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
147f0 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
14800 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
14810 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
14820 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
14830 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
14840 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
14850 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
14860 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
14870 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
14880 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
14890 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
148a0 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
148b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
148c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
148d0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
148e0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
148f0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
14900 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
14910 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
14920 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
14930 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
14940 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
14950 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
14960 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
14970 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
14980 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
14990 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
149a0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
149b0 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
149c0 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
149d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
149e0 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
149f0 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
14a00 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
14a10 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
14a20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
14a30 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
14a40 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
14a50 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
14a60 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
14a70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14a80 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
14a90 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
14aa0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
14ab0 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
14ac0 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
14ad0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
14ae0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
14af0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
14b00 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
14b10 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
14b20 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14b30 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
14b40 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
14b50 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
14b60 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
14b70 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
14b80 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
14b90 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
14ba0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
14bb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
14bc0 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
14bd0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
14be0 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
14bf0 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
14c00 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
14c10 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
14c20 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
14c30 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
14c40 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14c50 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
14c60 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
14c70 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
14c80 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
14c90 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
14ca0 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
14cb0 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
14cc0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
14cd0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
14ce0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
14cf0 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
14d00 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
14d10 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
14d20 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
14d30 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
14d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d50 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
14d60 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
14d70 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
14d80 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
14d90 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
14da0 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
14db0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
14dc0 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
14dd0 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
14de0 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
14df0 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
14e00 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
14e10 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
14e20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
14e30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14e40 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
14e50 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
14e60 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
14e70 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
14e80 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
14e90 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
14ea0 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
14eb0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
14ec0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
14ed0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
14ee0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
14ef0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
14f20 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
14f30 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
14f40 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
14f50 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
14f60 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
14f70 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
14f80 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
14f90 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
14fa0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
14fb0 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
14fc0 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
14fd0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14fe0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
14ff0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15000 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
15010 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
15020 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15030 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
15040 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
15050 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15060 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
15070 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
15080 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
15090 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
150a0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
150b0 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
150c0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
150d0 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
150e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
150f0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15100 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
15110 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
15120 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
15130 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15140 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
15150 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
15160 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
15170 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
15180 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15190 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
151a0 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
151b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
151c0 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
151d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
151e0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
151f0 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
15200 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
15210 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
15220 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
15230 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15240 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
15250 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15260 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
15270 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
15280 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
15290 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
152a0 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
152b0 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
152c0 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
152d0 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
152e0 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
152f0 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
15300 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
15310 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
15320 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
15330 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15340 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
15350 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
15360 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
15370 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15380 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
15390 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
153a0 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
153b0 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
153c0 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
153d0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
153e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
153f0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
15400 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
15410 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
15420 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
15430 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
15440 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
15450 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
15460 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
15470 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
15480 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
15490 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
154a0 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
154b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
154c0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
154d0 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
154e0 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
154f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
15500 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
15510 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
15520 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
15530 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
15540 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
15550 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
15560 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
15570 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
15580 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
15590 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
155a0 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
155b0 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
155c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
155d0 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
155e0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
155f0 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
15600 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
15610 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
15620 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
15630 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
15640 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
15650 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
15660 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
15670 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
15680 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
15690 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
156a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
156b0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
156c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
156d0 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
156e0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
156f0 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
15700 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
15710 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
15720 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
15730 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
15740 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
15750 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
15760 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
15770 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
15780 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
15790 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
157a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
157b0 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
157c0 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
157d0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
157e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
157f0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
15800 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
15810 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15820 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
15830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
15840 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
15850 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
15860 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
15870 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
15880 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
15890 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
158a0 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
158b0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
158c0 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
158d0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
158e0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
158f0 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
15900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15910 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15920 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
15930 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
15940 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
15950 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15960 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
15970 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
15980 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
15990 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
159a0 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
159b0 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
159c0 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
159d0 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
159e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
159f0 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
15a00 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
15a10 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
15a20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
15a30 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
15a40 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
15a50 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
15a60 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
15a70 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
15a80 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
15a90 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
15aa0 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
15ab0 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
15ac0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
15ad0 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
15ae0 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
15af0 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
15b00 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
15b10 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
15b20 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
15b30 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
15b40 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
15b50 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
15b60 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
15b70 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
15b80 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
15b90 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
15ba0 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
15bb0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
15bc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
15bd0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
15be0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
15bf0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
15c00 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
15c10 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
15c20 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
15c30 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
15c40 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
15c50 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
15c60 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
15c70 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
15c80 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
15c90 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
15ca0 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
15cb0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
15cc0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
15cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15ce0 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
15cf0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
15d00 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
15d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15d20 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
15d30 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
15d40 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
15d50 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
15d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
15d70 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
15d80 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15d90 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15db0 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
15dc0 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
15dd0 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
15de0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
15df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15e00 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
15e10 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
15e20 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
15e30 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
15e40 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
15e50 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
15e60 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
15e70 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
15e80 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
15e90 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
15ea0 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
15eb0 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
15ec0 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
15ed0 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
15ee0 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
15ef0 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
15f00 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
15f10 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
15f20 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
15f30 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
15f40 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
15f50 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
15f60 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
15f70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
15f80 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
15f90 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
15fa0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
15fb0 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
15fc0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
15fd0 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
15fe0 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
15ff0 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
16000 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
16010 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16020 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
16030 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
16040 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
16050 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
16060 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
16070 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
16080 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
16090 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
160a0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
160b0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
160c0 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
160d0 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
160e0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
160f0 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
16100 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
16110 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
16120 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
16130 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
16140 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
16150 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
16160 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
16170 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
16180 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
16190 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
161a0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
161b0 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
161c0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
161d0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
161e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
161f0 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
16200 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
16210 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
16220 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
16230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16240 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
16250 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
16260 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
16270 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
16280 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
16290 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
162a0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
162b0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
162c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
162d0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
162e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
162f0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
16300 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
16310 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
16320 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16340 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
16350 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
16360 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
16390 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
163a0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
163b0 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
163c0 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20  em;..  p->flags 
163d0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
163e0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
163f0 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
16400 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
16410 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
16420 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
16430 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
16440 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
16450 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
16460 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
16470 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
16480 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
16490 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
164a0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
164b0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
164c0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
164d0 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
164e0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
164f0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
16500 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
16510 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
16520 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
16530 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  /.    pMem->zMal
16540 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
16550 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
16560 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
16570 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
16580 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
16590 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
165a0 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
165b0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
165c0 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
165d0 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   u;.}../*.** Thi
165e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
165f0 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
16600 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
16610 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
16620 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
16630 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
16640 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
16650 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
16660 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
16670 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
16680 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
16690 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
166a0 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
166b0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
166c0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
166d0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
166e0 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
166f0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
16700 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
16710 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
16720 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
16730 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
16740 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
16750 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
16760 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
16770 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
16780 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
16790 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
167a0 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
167b0 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
167c0 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
167d0 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
167e0 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
167f0 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
16800 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
16810 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
16820 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
16830 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
16840 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
16850 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
16860 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
16870 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
16880 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
16890 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
168a0 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
168b0 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
168c0 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
168d0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
168e0 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
168f0 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
16900 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
16910 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
16920 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16930 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
16940 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
16950 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
16960 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
16970 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
16980 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
16990 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
169a0 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20  .){.  int d1;   
169b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
169c0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
169d0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
169e0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
169f0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
16a00 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
16a10 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
16a20 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
16a30 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
16a40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16a50 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
16a60 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
16a70 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e  int nField;.  in
16a80 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
16a90 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
16aa0 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
16ab0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
16ac0 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
16ad0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
16ae0 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
16af0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
16b00 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65  eyInfo;.  mem1.e
16b10 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
16b20 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
16b30 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
16b40 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
16b50 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
16b60 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
16b70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
16b80 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
16b90 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  LY( mem1.zMalloc
16ba0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
16bb0 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
16bc0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
16bd0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
16be0 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
16bf0 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
16c00 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
16c10 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
16c20 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
16c30 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
16c40 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
16c50 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
16c60 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
16c70 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
16c80 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
16c90 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
16ca0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
16cb0 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
16cc0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
16cd0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
16ce0 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
16cf0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
16d00 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
16d10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16d20 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
16d30 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
16d40 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
16d50 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
16d60 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
16d70 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
16d80 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
16d90 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
16da0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
16db0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
16dc0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
16dd0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
16de0 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
16df0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
16e00 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
16e10 73 7a 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c 64  szHdr1;.  nField
16e20 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
16e30 65 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  eld;.  assert( p
16e40 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
16e50 64 65 72 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c  der!=0 );.  whil
16e60 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
16e70 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
16e80 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
16e90 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
16ea0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
16eb0 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
16ec0 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
16ed0 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
16ee0 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
16ef0 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
16f00 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
16f10 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d   );.    if( d1>=
16f20 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33  nKey1 && sqlite3
16f30 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16f40 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
16f50 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
16f60 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
16f70 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
16f80 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
16f90 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
16fa0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
16fb0 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
16fc0 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
16fd0 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
16fe0 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
16ff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
17000 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
17010 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
17020 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3c                i<
17040 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
17050 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
17060 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
17070 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
17080 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
17090 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
170a0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
170b0 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68      /* Invert th
170c0 65 20 72 65 73 75 6c 74 20 69 66 20 77 65 20 61  e result if we a
170d0 72 65 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f  re using DESC so
170e0 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
170f0 20 20 20 69 66 28 20 69 3c 6e 46 69 65 6c 64 20     if( i<nField 
17100 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
17110 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
17120 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
17130 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
17140 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45     /* If the PRE
17150 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
17160 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66  is set and all f
17170 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65  ields except the
17180 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20   final.      ** 
17190 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65  rowid field were
171a0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65   equal, then cle
171b0 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  ar the PREFIX_SE
171c0 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65  ARCH flag and se
171d0 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65  t .      ** pPKe
171e0 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
171f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
17200 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
17210 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20  ey1, nKey1)..   
17220 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73     ** This is us
17230 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
17240 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20  nique opcode..  
17250 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
17260 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20   (pPKey2->flags 
17270 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
17280 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d  X_SEARCH) && i==
17290 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d  (pPKey2->nField-
172a0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  1) ){.        as
172b0 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
172c0 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
172d0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
172e0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  .flags & MEM_Int
172f0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65   );.        pPKe
17300 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e  y2->flags &= ~UN
17310 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
17320 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50  ARCH;.        pP
17330 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65  Key2->rowid = me
17340 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  m1.u.i;.      }.
17350 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72      .      retur
17360 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17370 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
17380 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
17390 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
173a0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
173b0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
173c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
173d0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
173e0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
173f0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
17400 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
17410 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
17420 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
17430 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
17440 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17450 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
17460 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
17470 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
17480 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
17490 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
174a0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
174b0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
174c0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
174d0 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e  equal. If the UN
174e0 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20  PACKED_INCRKEY. 
174f0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
17500 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
17510 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
17520 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
17530 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
17540 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
17550 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
17560 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
17570 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a  mon prefixes.  *
17580 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
17590 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
175a0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
175b0 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
175c0 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41  .  ** larger.  A
175d0 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
175e0 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
175f0 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
17600 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  er.  ** if there
17610 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65   is a difference
17620 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17630 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20   rc==0 );.  if( 
17640 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
17650 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
17660 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b   ){.    rc = -1;
17670 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
17680 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
17690 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
176a0 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61  CH ){.    /* Lea
176b0 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65  ve rc==0 */.  }e
176c0 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48  lse if( idx1<szH
176d0 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dr1 ){.    rc = 
176e0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
176f0 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70  rc;.}. ../*.** p
17700 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
17710 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
17720 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
17730 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
17740 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
17750 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
17760 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
17770 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
17780 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
17790 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
177a0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
177b0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
177c0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
177d0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
177e0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
177f0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
17800 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
17810 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
17820 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
17830 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
17840 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
17850 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
17860 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
17870 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
17880 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
17890 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
178a0 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
178b0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
178c0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
178d0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
178e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
178f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
17900 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
17910 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
17920 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
17930 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
17940 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17950 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
17960 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
17970 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
17980 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
17990 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
179a0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
179b0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
179c0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
179d0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
179e0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
179f0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
17a00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
17a10 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
17a20 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
17a30 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
17a40 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
17a50 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
17a60 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
17a70 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
17a80 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
17a90 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
17aa0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17ab0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
17ac0 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
17ad0 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
17ae0 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
17af0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
17b00 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
17b10 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
17b20 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
17b30 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
17b40 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
17b50 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
17b60 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
17b70 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
17b80 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
17b90 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
17ba0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
17bb0 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
17bc0 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
17bd0 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
17be0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
17bf0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
17c00 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
17c10 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
17c20 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
17c30 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
17c40 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
17c50 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
17c60 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
17c70 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
17c80 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
17c90 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
17ca0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
17cb0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
17cc0 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
17cd0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
17ce0 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
17cf0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17d00 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17d10 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
17d20 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
17d30 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
17d40 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
17d50 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
17d60 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
17d70 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
17d80 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
17d90 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
17da0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
17db0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
17dc0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
17dd0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
17de0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17df0 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
17e00 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17e10 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
17e20 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17e30 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
17e40 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
17e50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17e60 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
17e70 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17e80 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
17e90 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17ea0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
17eb0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
17ec0 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
17ed0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
17ee0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
17ef0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17f00 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
17f10 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
17f20 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
17f30 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
17f40 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
17f50 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
17f60 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
17f70 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
17f80 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
17f90 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
17fa0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
17fb0 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
17fc0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
17fd0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
17fe0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
17ff0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18000 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
18010 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
18020 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
18030 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
18040 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
18050 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
18060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
18070 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
18080 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
18090 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
180a0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
180b0 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
180c0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
180d0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
180e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
180f0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
18100 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
18110 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
18120 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
18130 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18140 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18150 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
18170 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
18180 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
18190 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
181a0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
181b0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
181c0 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
181d0 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
181e0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
181f0 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
18200 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
18210 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
18220 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
18230 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
18240 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
18250 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
18260 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
18270 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
18280 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
18290 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
182a0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
182b0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
182c0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
182d0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
182e0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
182f0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
18300 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
18310 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
18320 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
18330 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
18340 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
18350 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
18360 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
18370 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
18380 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
18390 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
183a0 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
183b0 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
183c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
183d0 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
183e0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
183f0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
18400 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70  npacked,  /* Unp
18410 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
18420 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
18430 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
18440 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
18450 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18460 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
18470 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
18480 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
18490 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
184a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
184b0 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
184c0 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
184d0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
184e0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
184f0 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
18500 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
18510 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
18520 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
18530 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
18540 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20  ITE_OK );    /* 
18550 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
18560 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
18570 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
18580 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
18590 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
185a0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
185b0 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
185c0 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68 61  the say.  ** tha
185d0 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
185e0 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
185f0 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
18600 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
18610 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
18620 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
18630 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
18640 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
18650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18660 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
18670 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
18680 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
18690 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
186a0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
186b0 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29  Cursor, 0, (int)
186c0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
186d0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
186e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
186f0 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70 61  .  assert( pUnpa
18700 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e  cked->flags & UN
18710 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
18720 54 43 48 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20  TCH );.  *res = 
18730 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
18740 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
18750 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
18760 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
18770 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
18780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18790 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
187a0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
187b0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
187c0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
187d0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
187e0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
187f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18800 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
18810 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18820 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
18830 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
18840 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
18850 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18860 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
18870 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
18880 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
18890 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
188a0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
188b0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
188c0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
188d0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
188e0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
188f0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
18900 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
18910 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
18920 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
18930 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
18940 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
18950 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
18960 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
18970 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18980 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
18990 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
189a0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
189b0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
189c0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
189d0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
189e0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
189f0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
18a00 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
18a10 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
18a20 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
18a30 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
18a40 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
18a50 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
18a60 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
18a70 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
18a80 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
18a90 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
18aa0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
18ab0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
18ac0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
18ad0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18ae0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
18af0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
18b00 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
18b10 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
18b20 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
18b30 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
18b40 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
18b50 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
18b60 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
18b70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
18b80 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
18b90 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
18ba0 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
18bb0 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
18bc0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
18bd0 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
18be0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18bf0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
18c00 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
18c10 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
18c20 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
18c30 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
18c40 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
18c50 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
18c60 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
18c70 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
18c80 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
18c90 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
18ca0 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
18cb0 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
18cc0 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
18cd0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
18ce0 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
18cf0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
18d00 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
18d10 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
18d20 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
18d30 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
18d40 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
18d50 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
18d60 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
18d70 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20  Var, u8 aff){.  
18d80 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
18d90 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
18da0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d   Mem *pMem = &v-
18db0 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20  >aVar[iVar-1];. 
18dc0 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
18dd0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
18de0 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
18df0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
18e00 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
18e10 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
18e20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
18e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
18e40 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
18e50 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
18e60 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
18e70 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
18e80 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
18e90 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TF8);.        sq
18ea0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
18eb0 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52 65  eType((Mem *)pRe
18ec0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
18ed0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
18ee0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18ef0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
18f00 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
18f10 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
18f20 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
18f30 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
18f40 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
18f50 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
18f60 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
18f70 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
18f80 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
18f90 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
18fa0 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
18fb0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
18fc0 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
18fd0 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
18fe0 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
18ff0 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
19000 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
19010 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
19020 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
19030 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
19040 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.