/ Hex Artifact Content
Login

Artifact 5c738e03c2aab3cf98d3a753603320c36975d9e9:


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 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20   if( aSortOrder 
52e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  ){.        pKeyI
52f0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
5300: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5310: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
5320: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
5330: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
5340: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
5350: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
5360: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
5370: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5380: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
5390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
53a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
53b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ed = 1;.      pO
53c0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
53d0: 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  OTUSED;.    }.  
53e0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
53f0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5400: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5410: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5420: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5430: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
5440: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
5450: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
5460: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5470: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5480: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
5490: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
54a0: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
54b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
54c0: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
54d0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
54e0: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
54f0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5500: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5510: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
5520: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
5530: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
5540: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
5550: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
5560: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
5570: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
5580: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
5590: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
55a0: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
55b0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
55c0: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
55d0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
55e0: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
55f0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
5600: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
5610: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
5620: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
5630: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
5640: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
5650: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
5660: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
5670: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
5680: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
5690: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
56a0: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
56b0: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
56c0: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
56d0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
56e0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
56f0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
5700: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
5710: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
5720: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
5730: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
5740: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
5750: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
5760: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5770: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5780: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
5790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
57a0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
57b0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57c0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
57d0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57e0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
57f0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5800: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
5810: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5820: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
5830: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5840: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5850: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5860: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
5870: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
5880: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
5890: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
58a0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
58b0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
58c0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
58d0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
58e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
58f0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5900: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
5910: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5920: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
5930: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
5940: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
5950: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
5960: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
5970: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5980: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
5990: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
59a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
59b0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
59c0: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
59d0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
59e0: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
59f0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
5a00: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
5a10: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
5a20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5a30: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5a40: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
5a50: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
5a60: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
5a70: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
5a80: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
5a90: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5aa0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5ab0: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5ac0: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
5ad0: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
5ae0: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
5af0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
5b00: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
5b10: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
5b20: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5b30: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5b40: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5b50: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5b60: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5b70: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5b80: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5b90: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5ba0: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5bb0: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5bc0: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5bd0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5be0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5bf0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5c00: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5c10: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5c20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5c30: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5c40: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5c50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5c60: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5c70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5c80: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5c90: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5ca0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5cb0: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5cc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5cd0: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5ce0: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5cf0: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5d00: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5d10: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5d20: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5d30: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5d40: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5d50: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5d60: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5d70: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5d80: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5d90: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5da0: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5db0: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5dc0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5dd0: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5de0: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5df0: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5e00: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5e10: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5e20: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5e30: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5e40: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5e50: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5e60: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
5e70: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
5e80: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
5e90: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
5ea0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
5eb0: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
5ec0: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
5ed0: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
5ee0: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
5ef0: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
5f00: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20  c VdbeOp dummy; 
5f10: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d   /* Ignore the M
5f20: 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75  SVC warning abou
5f30: 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72  t no initializer
5f40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
5f50: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5f60: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5f70: 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65   addr<0 ){.#ifde
5f80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5f90: 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ACE.    if( p->n
5fa0: 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  Op==0 ) return (
5fb0: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
5fc0: 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20  #endif.    addr 
5fd0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5fe0: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
5ff0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6000: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
6010: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6020: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
6030: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6040: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
6050: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
6060: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
6070: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
6080: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6090: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
60a0: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
60b0: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
60c0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
60d0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
60e0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
60f0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6100: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
6110: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
6120: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
6130: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
6140: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
6150: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
6160: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
6170: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
6180: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
6190: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
61a0: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
61b0: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
61c0: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
61d0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
61e0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
61f0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6200: 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61  O_STATIC:.    ca
6210: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6220: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
6230: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
6240: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
6250: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
6260: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6270: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6280: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
6290: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
62a0: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
62b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
62c0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
62d0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
62e0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
62f0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6300: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
6310: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
6320: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
6330: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
6340: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6350: 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  0(pColl->zName);
6360: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
6370: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
6380: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6390: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
63a0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
63b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
63c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
63d0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
63e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
63f0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6400: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
6410: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
6420: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
6430: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
6440: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6450: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
6460: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
6470: 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20  Name,n+1);.     
6480: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
6490: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
64a0: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
64b0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
64c0: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c  zTemp[i],",nil",
64d0: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  4);.          i 
64e0: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
6500: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
6510: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
6520: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
6530: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
6540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6550: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
6560: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
6570: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
6580: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
6590: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
65a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
65b0: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
65c0: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
65d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
65e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
65f0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
6600: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
6610: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
6620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6630: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6640: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
6650: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
6660: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
6670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6680: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
6690: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
66a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
66b0: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
66c0: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
66d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
66f0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
6700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6710: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
6720: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
6730: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6740: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
6750: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
6760: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6770: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
6780: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
6790: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
67a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
67b0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
67c0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
67d0: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
67e0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
67f0: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
6800: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
6810: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
6820: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6830: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6850: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6860: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  emp, "%lld", pMe
6870: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
6880: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6890: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
68a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
68b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
68c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
68d0: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  ", pMem->r);.   
68e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
68f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
6900: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
6910: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6920: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
6930: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ULL");.      }el
6940: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
6950: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
6960: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
6970: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
6980: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
6990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
69b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
69c0: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
69d0: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
69e0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
69f0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
6a00: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
6a10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6a20: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
6a30: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
6a40: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
6a50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6a60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6a70: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
6a80: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
6a90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6aa0: 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72  p, zTemp, "intar
6ab0: 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ray");.      bre
6ac0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ad0: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
6ae0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6af0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6b00: 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61  , zTemp, "progra
6b10: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
6b20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6b30: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
6b40: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6b50: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
6b60: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6b70: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
6b80: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
6b90: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
6ba0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
6bb0: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
6bc0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
6be0: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
6bf0: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
6c00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
6c10: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
6c20: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
6c30: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
6c40: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
6c50: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
6c60: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
6c70: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
6c80: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
6c90: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
6ca0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
6cb0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
6cc0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
6cd0: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
6ce0: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
6cf0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
6d00: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
6d10: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
6d20: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
6d30: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
6d40: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
6d50: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
6d60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6d70: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
6d80: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
6d90: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
6da0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
6db0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
6dc0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
6dd0: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
6de0: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
6df0: 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d  8 );.  p->btreeM
6e00: 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
6e10: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21  )1)<<i;.  if( i!
6e20: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
6e30: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
6e40: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6e50: 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  .    p->lockMask
6e60: 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29   |= ((yDbMask)1)
6e70: 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  <<i;.  }.}..#if 
6e80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6e90: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
6ea0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
6eb0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
6ec0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
6ed0: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
6ee0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6ef0: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
6f00: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
6f10: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
6f20: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
6f30: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
6f40: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6f50: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
6f60: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
6f70: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
6f80: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
6f90: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
6fa0: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
6fb0: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
6fc0: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
6fd0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6fe0: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
6ff0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
7000: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
7010: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
7020: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
7030: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
7040: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
7050: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
7060: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
7070: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
7080: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
7090: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
70a0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
70b0: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
70c0: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
70d0: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
70e0: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
70f0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7100: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
7110: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
7120: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
7130: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
7140: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
7150: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
7160: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
7170: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7180: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
7190: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
71a0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
71b0: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
71c0: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
71d0: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
71e0: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
71f0: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
7200: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
7210: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
7220: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
7230: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
7240: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
7250: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
7260: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7270: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
7280: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
7290: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
72a0: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
72b0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
72c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
72d0: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
72e0: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
72f0: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7300: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7310: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7320: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
7330: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
7340: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
7350: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
7360: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
7370: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
7380: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7390: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
73a0: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
73b0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
73c0: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
73d0: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
73e0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
73f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7400: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
7410: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7420: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
7430: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7440: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
7450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
7460: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
7470: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
7480: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
7490: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
74a0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
74b0: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76  dbeEnter()..*/.v
74c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
74d0: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
74e0: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
74f0: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7500: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
7510: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
7520: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
7530: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
7540: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7550: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
7560: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
7570: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
7580: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
7590: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
75a0: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
75b0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
75c0: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
75d0: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
75e0: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
75f0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7600: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
7610: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7620: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
7630: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
7640: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
7650: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7660: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
7670: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
7680: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7690: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
76a0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
76b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
76c0: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
76d0: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
76e0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
76f0: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
7700: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7710: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
7720: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
7730: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
7740: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
7750: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
7760: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
7770: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
7780: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
7790: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
77a0: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
77b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
77c0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
77d0: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
77e0: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
77f0: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
7800: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7810: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
7820: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
7830: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
7840: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
7850: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
7860: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
7870: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7880: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
7890: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
78a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
78b0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
78c0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
78d0: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
78e0: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
78f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7900: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
7910: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
7920: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
7930: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7940: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
7950: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
7960: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
7970: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7980: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
79a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
79b0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
79c0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
79d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
79e0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
79f0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7a00: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7a10: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7a20: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7a30: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
7a40: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
7a50: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
7a60: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
7a70: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
7a80: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
7a90: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
7aa0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
7ab0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
7ac0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
7ad0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7ae0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7af0: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7b00: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7b10: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7b20: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7b30: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7b40: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7b50: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7b60: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7b70: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
7b80: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
7b90: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
7ba0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
7bb0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
7bc0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
7bd0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7be0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7bf0: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7c00: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7c10: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7c20: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7c30: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7c40: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7c50: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7c60: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7c70: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7c80: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
7c90: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
7ca0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
7cb0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
7cc0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
7cd0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7ce0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7cf0: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7d00: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7d10: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7d20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7d30: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7d40: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7d50: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7d60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7d70: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7d80: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7d90: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7da0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7db0: 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20  = MEM_Invalid;. 
7dc0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
7dd0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
7de0: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
7df0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
7e00: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7e10: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
7e20: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
7e30: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
7e40: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
7e50: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
7e60: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
7e70: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
7e80: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
7e90: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
7ea0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
7eb0: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
7ec0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
7ed0: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7ee0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7ef0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7f00: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7f10: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
7f20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
7f30: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7f40: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
7f50: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7f60: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
7f70: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
7f80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
7f90: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
7fa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7fb0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
7fc0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
7fd0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
7fe0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7ff0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
8000: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
8010: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
8020: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
8030: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
8040: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
8050: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
8060: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
8070: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
8080: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
8090: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
80a0: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
80b0: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
80c0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
80d0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
80e0: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
80f0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
8100: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
8110: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
8120: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
8130: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
8140: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
8150: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
8160: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
8170: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
8180: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8190: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
81a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
81b0: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
81c0: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
81d0: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
81e0: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
81f0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
8200: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
8210: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
8220: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
8250: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8280: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
8290: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
82a0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
82b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
82c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
82d0: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
82e0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
82f0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
8300: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
8310: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
8320: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
8330: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
8360: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
8370: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
8380: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8390: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
83a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
83b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
83c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
83f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
8400: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8410: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
8420: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8430: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
8440: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
8450: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
8460: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
8470: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
8480: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
8490: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
84a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
84b0: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
84c0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
84d0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
84e0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
84f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8500: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
8510: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
8520: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
8530: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
8540: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
8550: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
8560: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
8570: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
8580: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
8590: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
85a0: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
85b0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
85c0: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
85d0: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
85e0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
85f0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
8600: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
8610: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8620: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
8630: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
8640: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
8650: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
8660: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
8670: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8680: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
8690: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
86a0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
86b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
86c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
86d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
86e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
86f0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
8700: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
8710: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
8720: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
8730: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
8740: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
8750: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
8760: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
8770: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
8780: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
8790: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
87a0: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
87b0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
87c0: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
87d0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
87e0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
87f0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
8800: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
8810: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
8820: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8830: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
8840: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
8850: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
8860: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
8870: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
8880: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
8890: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
88a0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
88b0: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
88c0: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
88d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
88e0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
88f0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
8900: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
8910: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
8920: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
8930: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
8940: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8950: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
8960: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
8970: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
8980: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
8990: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
89a0: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
89b0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
89c0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
89d0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
89e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
89f0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8a00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
8a10: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
8a20: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
8a30: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
8a40: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
8a50: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
8a60: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
8a70: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
8a80: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
8a90: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
8aa0: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
8ab0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
8ac0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
8ad0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
8ae0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
8af0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
8b00: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
8b10: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
8b20: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
8b30: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
8b40: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
8b50: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
8b60: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
8b70: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
8b80: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8b90: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
8ba0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
8bb0: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
8bc0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
8bd0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8be0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
8bf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8c00: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
8c10: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
8c20: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
8c30: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
8c40: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
8c50: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8c60: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
8c70: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
8c80: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
8c90: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
8ca0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
8cb0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
8cc0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
8cd0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
8ce0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
8cf0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
8d00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
8d10: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
8d20: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
8d30: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
8d40: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
8d50: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
8d60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
8d70: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
8d80: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
8d90: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
8da0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
8db0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
8dc0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
8dd0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
8de0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
8df0: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
8e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8e10: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8e20: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8e30: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8e40: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8e50: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8e60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
8e70: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
8ea0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
8eb0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
8ec0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8ed0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
8ee0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8ef0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
8f00: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
8f10: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8f20: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
8f30: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8f40: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8f50: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8f60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8f70: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
8f80: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
8f90: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
8fa0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8fb0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
8fc0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
8fd0: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
8fe0: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
8ff0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
9000: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
9010: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
9020: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
9030: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
9040: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
9050: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
9060: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
9070: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
9080: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
9090: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
90a0: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
90b0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
90c0: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
90d0: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
90e0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
90f0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
9100: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
9110: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
9120: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
9130: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
9140: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
9150: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
9160: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9170: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
9180: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
9190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
91a0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
91b0: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
91c0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
91d0: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
91e0: 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a  te, nSub!=0) ){.
91f0: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
9200: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
9210: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
9220: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
9230: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
9240: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
9250: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
9260: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
9270: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
9280: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
9290: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
92a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
92b0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
92c0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
92d0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
92e0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9300: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
9310: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
9320: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
9330: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
9340: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
9350: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
9360: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
9390: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
93a0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
93b0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
93c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
93d0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
93e0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
9410: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9420: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
9430: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9440: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
9450: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
9460: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
9470: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
9480: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9490: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
94a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
94b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
94c0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
94d0: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
94e0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
94f0: 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70   z = displayP4(p
9500: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
9510: 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65  ;.    if( z!=pMe
9520: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  m->z ){.      sq
9530: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
9540: 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20  tr(pMem, z, -1, 
9550: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
9560: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9570: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
9580: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
9590: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
95a0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
95b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
95c0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
95d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
95e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
95f0: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  EXT;.    pMem++;
9600: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
9610: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
9620: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9630: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c  MemGrow(pMem, 4,
9640: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   0) ){.        a
9650: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
9660: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9680: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
9690: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
96a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
96b0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
96c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
96d0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
96e0: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
96f0: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
9700: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
9710: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
9720: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
9730: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
9740: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
9750: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
9760: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
9770: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
9780: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
9790: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
97a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
97b0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
97c0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
97d0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
97e0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
97f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
9800: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
9810: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
9820: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
9830: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9840: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
9850: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
9860: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
9870: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9880: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
9890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
98a0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
98b0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
98c0: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
98d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
98e0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
98f0: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
9900: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
9910: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
9920: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
9930: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
9950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9960: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
9970: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9980: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
9990: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
99a0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
99b0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
99c0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
99d0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
99e0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
99f0: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
9a00: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9a10: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9a20: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
9a30: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
9a40: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
9a50: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
9a60: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
9a70: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63  p4.z!=0 ){.    c
9a80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
9a90: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68  Op->p4.z;.    wh
9aa0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
9ab0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
9ac0: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
9ad0: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
9ae0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
9af0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9b00: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
9b10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9b20: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
9b30: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
9b40: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
9b50: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
9b60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9b70: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
9b80: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
9b90: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
9ba0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
9bb0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
9bc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9bd0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
9be0: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
9bf0: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
9c00: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
9c10: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
9c20: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
9c30: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
9c40: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
9c50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
9c60: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
9c70: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
9c80: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
9c90: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
9ca0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
9cb0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
9cc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9cd0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
9ce0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
9cf0: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
9d00: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
9d10: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
9d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9d30: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
9d40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9d50: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
9d60: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
9d70: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
9d80: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9d90: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
9da0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
9db0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
9dc0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9dd0: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78  space from a fix
9de0: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61  ed size buffer a
9df0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
9e00: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
9e10: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66  pace.  If insuff
9e20: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20  icient space is 
9e30: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
9e40: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
9e50: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72  e pBuf parameter
9e60: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
9e70: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74  value of a point
9e80: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  er which will.**
9e90: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77   receive the new
9ea0: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69   memory.  pBuf i
9eb0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e  s normally NULL.
9ec0: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74    If pBuf is not
9ed0: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  .** NULL, it mea
9ee0: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ns that memory s
9ef0: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
9f00: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
9f10: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  and that.** this
9f20: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
9f30: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79  not allocate any
9f40: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68   new memory.  Wh
9f50: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  en pBuf is not.*
9f60: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  * NULL simply re
9f70: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79  turn pBuf.  Only
9f80: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   allocate new me
9f90: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20  mory space when 
9fa0: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  pBuf.** is NULL.
9fb0: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
9fc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9fd0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
9fe0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
9ff0: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61  om points to ava
a000: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
a010: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
a020: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
a030: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
a040: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69  e.  When space i
a050: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70  s allocated, *pp
a060: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64  From is advanced
a070: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64   past.** the end
a080: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
a090: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  d space..**.** *
a0a0: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
a0b0: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
a0c0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
a0d0: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
a0e0: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
a0f0: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
a100: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
a110: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
a120: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
a130: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
a140: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
a150: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
a160: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
a170: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
a180: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f  allocSpace(.  vo
a190: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
a1a0: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75     /* Where retu
a1b0: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20  rn pointer will 
a1c0: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  be stored */.  i
a1d0: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
a1e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a1f0: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   bytes to alloca
a200: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46  te */.  u8 **ppF
a210: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rom,         /* 
a220: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  IN/OUT: Allocate
a230: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f   from *ppFrom */
a240: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20  .  u8 *pEnd,    
a250: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
a260: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  er to 1 byte pas
a270: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70  t the end of *pp
a280: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  From buffer */. 
a290: 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20   int *pnByte    
a2a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f        /* If allo
a2b0: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  cation cannot be
a2c0: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74   made, increment
a2d0: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20   *pnByte */.){. 
a2e0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a2f0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70  YTE_ALIGNMENT(*p
a300: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20  pFrom) );.  if( 
a310: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42  pBuf ) return pB
a320: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  uf;.  nByte = RO
a330: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69  UND8(nByte);.  i
a340: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
a350: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
a360: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
a370: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a  *)*ppFrom;.    *
a380: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
a390: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
a3a0: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
a3b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75    }.  return pBu
a3c0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69  f;.}../*.** Rewi
a3d0: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b  nd the VDBE back
a3e0: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
a3f0: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  g in preparation
a400: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20   for.** running 
a410: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
a420: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64  te3VdbeRewind(Vd
a430: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
a440: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
a450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
a460: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
a470: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   i;.#endif.  ass
a480: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
a490: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
a4a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
a4b0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
a4c0: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
a4d0: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
a4e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
a4f0: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
a500: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
a510: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
a520: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
a530: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
a540: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
a550: 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65  AGIC_RUN;..#ifde
a560: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a570: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
a580: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Mem; i++){.    a
a590: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
a5a0: 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ].db==p->db );. 
a5b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
a5c0: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
a5d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
a5e0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
a5f0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d  OE_Abort;.  p->m
a600: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
a610: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
a620: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
a630: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
a640: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
a650: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
a660: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
a670: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
a680: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
a690: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
a6a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
a6b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
a6c0: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
a6d0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
a6e0: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
a6f0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
a700: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
a710: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
a720: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
a730: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
a740: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
a750: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
a760: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
a770: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
a780: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
a790: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
a7a0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
a7b0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
a7c0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
a7d0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
a7e0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
a7f0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
a800: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
a810: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
a820: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
a830: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
a840: 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e  ed exact once on
a850: 20 61 20 65 61 63 68 20 76 69 72 74 75 61 6c 20   a each virtual 
a860: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
a870: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
a880: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
a890: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
a8a0: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
a8b0: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
a8c0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
a8d0: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65  is called, futhe
a8e0: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
a8f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a900: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
a910: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
a920: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
a930: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
a940: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
a950: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
a960: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
a970: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
a980: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
a990: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
a9a0: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
a9b0: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
a9c0: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
a9d0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
a9e0: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
a9f0: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
aa00: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
aa10: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
aa20: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
aa30: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
aa40: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
aa50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
aa60: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
aa70: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
aa90: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
aaa0: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
aac0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
aad0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
aae0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
aaf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
ab00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ab10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ab40: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
ab50: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
ab80: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
ab90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
aba0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
abb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
abc0: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
abd0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
abe0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
abf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ac00: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
ac10: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
ac20: 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20  .  int nOnce;   
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
ac50: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
ac60: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ons */.  int n; 
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ac90: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
aca0: 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *zCsr;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
acc0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
acd0: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
ace0: 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20  /.  u8 *zEnd;   
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ad10: 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20   past allocated 
ad20: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
ad30: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
ad40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
ad50: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
ad60: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ory is needed */
ad70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
ad80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ad90: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
ada0: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
adb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
adc0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
add0: 49 4e 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70  INIT );.  db = p
ade0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
adf0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ae00: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
ae10: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
ae20: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
ae30: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
ae40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
ae50: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
ae60: 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65  nMaxArg;.  nOnce
ae70: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65   = pParse->nOnce
ae80: 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30  ;.  if( nOnce==0
ae90: 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a   ) nOnce = 1; /*
aea0: 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74   Ensure at least
aeb0: 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e   one byte in p->
aec0: 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20  aOnceFlag[] */. 
aed0: 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20   .  /* For each 
aee0: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
aef0: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
af00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
af10: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
af20: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
af30: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
af40: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
af50: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
af60: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
af70: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
af80: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
af90: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
afa0: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
afb0: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
afc0: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
afd0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
afe0: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
aff0: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
b000: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
b010: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
b020: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
b030: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
b040: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
b050: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
b060: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
b070: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
b080: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
b090: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
b0a0: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
b0b0: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
b0c0: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
b0d0: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
b0e0: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
b0f0: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
b100: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
b110: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
b120: 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d  n..  */.  zCsr =
b130: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
b140: 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20  >nOp];       /* 
b150: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
b160: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
b170: 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a  */.  zEnd = (u8*
b180: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41  )&p->aOp[p->nOpA
b190: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
b1a0: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
b1b0: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
b1c0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
b1d0: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
b1e0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
b1f0: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
b200: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
b210: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
b220: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
b230: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
b240: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
b250: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
b260: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
b270: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
b280: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
b290: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
b2a0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
b2b0: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
b2c0: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
b2d0: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
b2e0: 20 20 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66    .  /* Memory f
b2f0: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
b300: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
b310: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
b320: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
b330: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
b340: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
b350: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
b360: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
b370: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
b380: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
b390: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
b3a0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
b3b0: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
b3c0: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
b3d0: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
b3e0: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
b3f0: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
b400: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
b410: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
b420: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
b430: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
b440: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
b450: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
b460: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
b470: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
b480: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
b490: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
b4a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
b4b0: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
b4c0: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
b4d0: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
b4e0: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
b4f0: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
b500: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
b510: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
b520: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
b530: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
b540: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
b550: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
b560: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b570: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
b580: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61  llocSpace(p->aVa
b590: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
b5a0: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
b5b0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b5c0: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
b5d0: 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e  pace(p->apArg, n
b5e0: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
b5f0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
b600: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
b610: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
b620: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
b630: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
b640: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b650: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
b660: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
b670: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
b680: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
b690: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b6c0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
b6d0: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
b6e0: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
b6f0: 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c  g, nOnce, &zCsr,
b700: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b710: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
b720: 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20  .      p->pFree 
b730: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b740: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
b750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72  ;.    }.    zCsr
b760: 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20   = p->pFree;.   
b770: 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42   zEnd = &zCsr[nB
b780: 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20  yte];.  }while( 
b790: 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61  nByte && !db->ma
b7a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
b7b0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
b7c0: 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d  16)nCursor;.  p-
b7d0: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
b7e0: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
b7f0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
b800: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
b810: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
b820: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
b830: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
b840: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
b850: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
b860: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
b870: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
b880: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
b890: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
b8a0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
b8b0: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
b8c0: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
b8d0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
b8e0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
b8f0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
b900: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
b910: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
b920: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
b930: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
b940: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
b970: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
b980: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
b990: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
b9a0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
b9b0: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
b9c0: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
b9d0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
b9e0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
b9f0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  n].flags = MEM_I
ba00: 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 2d  nvalid;.      p-
ba10: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
ba20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
ba30: 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73  >explain = pPars
ba40: 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71  e->explain;.  sq
ba50: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
ba60: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
ba70: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
ba80: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
ba90: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
baa0: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
bab0: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
bac0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
bad0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
bae0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
baf0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
bb00: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
bb10: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
bb20: 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73  e3VdbeSorterClos
bb30: 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20  e(p->db, pCx);. 
bb40: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
bb50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
bb60: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
bb70: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78  ;.    /* The pCx
bb80: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
bb90: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
bba0: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
bbb0: 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74  sts, by.    ** t
bbc0: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
bbd0: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  /.  }else if( pC
bbe0: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
bbf0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
bc00: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
bc10: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
bc20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bc30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
bc40: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
bc50: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
bc60: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
bc70: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
bc80: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
bc90: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
bca0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
bcb0: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
bcc0: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
bcd0: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
bce0: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
bcf0: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
bd00: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
bd10: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
bd20: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  f.}../*.** Copy 
bd30: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
bd40: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
bd50: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
bd60: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
bd70: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
bd80: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
bd90: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
bda0: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
bdb0: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
bdc0: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
bdd0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
bde0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
bdf0: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
be00: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
be10: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
be20: 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67  ;.  v->aOnceFlag
be30: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65   = pFrame->aOnce
be40: 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65  Flag;.  v->nOnce
be50: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  Flag = pFrame->n
be60: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61  OnceFlag;.  v->a
be70: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
be80: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
be90: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
bea0: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
beb0: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
bec0: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
bed0: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
bee0: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
bef0: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
bf00: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
bf10: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
bf20: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
bf30: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
bf40: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
bf50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
bf60: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
bf70: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
bf80: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
bf90: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
bfa0: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
bfb0: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
bfc0: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
bfd0: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
bfe0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
bff0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
c000: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
c010: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
c020: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
c030: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
c040: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
c050: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
c060: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
c070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c080: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
c090: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
c0a0: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
c0b0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
c0c0: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
c0d0: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
c0e0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
c0f0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
c100: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
c110: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
c120: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a  re(pFrame);.  }.
c130: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
c140: 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30  .  p->nFrame = 0
c150: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ;..  if( p->apCs
c160: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
c170: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c180: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
c190: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
c1a0: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
c1b0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
c1c0: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
c1d0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
c1e0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
c1f0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
c200: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
c210: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
c220: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
c230: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
c240: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
c250: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
c260: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
c270: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
c280: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
c290: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
c2a0: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
c2b0: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
c2c0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
c2d0: 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pDel);.  }.}../*
c2e0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
c2f0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
c300: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
c310: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
c320: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
c330: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
c340: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
c350: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
c360: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
c370: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
c380: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
c390: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
c3a0: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
c3b0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
c3c0: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
c3d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c3e0: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  >db;..#ifdef SQL
c3f0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
c400: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
c410: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
c420: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
c430: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
c440: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
c450: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
c460: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
c470: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  d up.  */.  int 
c480: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  i;.  if( p->apCs
c490: 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  r ) for(i=0; i<p
c4a0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
c4b0: 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
c4c0: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]==0 );.  if( 
c4d0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66  p->aMem ){.    f
c4e0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d  or(i=1; i<=p->nM
c4f0: 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  em; i++) assert(
c500: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
c510: 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20 29  s==MEM_Invalid )
c520: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
c530: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c540: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
c550: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
c560: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
c570: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
c580: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
c590: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
c5a0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
c5b0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
c5c0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
c5d0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
c5e0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
c5f0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
c600: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
c610: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
c620: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
c630: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
c640: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
c650: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
c660: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
c670: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
c680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
c690: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
c6a0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
c6b0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
c6c0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
c6d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c6e0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
c6f0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
c700: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
c710: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
c730: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
c740: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
c750: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
c760: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
c770: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
c780: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
c790: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
c7a0: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
c7b0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
c7c0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
c7d0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
c7e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
c7f0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
c800: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
c810: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
c820: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
c830: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
c840: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
c850: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c860: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
c870: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
c880: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
c890: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
c8a0: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
c8b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
c8c0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
c8d0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
c8e0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
c8f0: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
c900: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
c910: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
c920: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
c930: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
c940: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
c950: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
c960: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
c970: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
c980: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
c990: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
c9a0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
c9b0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
c9c0: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
c9d0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
c9e0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
c9f0: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
ca00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
ca10: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
ca20: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
ca50: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
ca60: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca80: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
ca90: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
caa0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
cad0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
cae0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
caf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
cb00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
cb10: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
cb20: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
cb30: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
cb40: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cb60: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
cb70: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
cb80: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
cb90: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
cba0: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
cbb0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
cbc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
cbd0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
cbe0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
cbf0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
cc00: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
cc10: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
cc20: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
cc30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
cc40: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
cc50: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
cc60: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
cc70: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
cc80: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
cc90: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
cca0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
ccb0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
ccc0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
ccd0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
cce0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
ccf0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
cd00: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
cd10: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
cd20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cd30: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
cd40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
cd50: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
cd60: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
cd70: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
cd80: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
cd90: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
cda0: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
cdb0: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
cdc0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
cdd0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
cde0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
cdf0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
ce00: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
ce10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce20: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
ce30: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
ce40: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
ce50: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
ce60: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
ce70: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
ce80: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
ce90: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
cea0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
ceb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cec0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
ced0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
cee0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
cef0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
cf00: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
cf10: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
cf20: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
cf30: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
cf40: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
cf50: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
cf60: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
cf70: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
cf80: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
cf90: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
cfa0: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
cfb0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
cfc0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
cfd0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
cfe0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
cff0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
d000: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
d010: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
d020: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
d030: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
d040: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
d050: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
d060: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
d070: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
d080: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
d090: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
d0a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
d0b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
d0c0: 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e  tabSync(db, &p->
d0d0: 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20  zErrMsg);..  /* 
d0e0: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
d0f0: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
d100: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
d110: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
d120: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
d130: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
d140: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
d150: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
d160: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
d170: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
d180: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
d190: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
d1a0: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
d1b0: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
d1c0: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
d1d0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
d1e0: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
d1f0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
d200: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
d210: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
d220: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
d230: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
d240: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
d250: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
d260: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d270: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
d280: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
d290: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
d2a0: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
d2b0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
d2c0: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
d2d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2e0: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
d2f0: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
d300: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
d310: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
d320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d330: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d340: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d350: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
d360: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
d370: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
d380: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
d390: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
d3a0: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
d3b0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
d3c0: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
d3d0: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
d3e0: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
d3f0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
d400: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
d410: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
d420: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
d430: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
d440: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
d450: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
d460: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
d470: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
d480: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
d490: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
d4a0: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
d4b0: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
d4c0: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
d4d0: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
d4e0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
d4f0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
d500: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
d510: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
d520: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
d530: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
d540: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
d550: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
d560: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
d570: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
d580: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
d590: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
d5a0: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
d5b0: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
d5c0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
d5d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
d5e0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d5f0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
d600: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
d610: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
d620: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d630: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d640: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d650: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d660: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d670: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d680: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d690: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d6a0: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
d6b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d6c0: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
d6d0: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
d6e0: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
d6f0: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
d700: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
d710: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
d720: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d730: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
d740: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
d750: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
d760: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
d770: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
d780: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d790: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
d7a0: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
d7b0: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
d7c0: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
d7d0: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d7e0: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
d7f0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
d800: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d810: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d820: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d830: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d840: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d850: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d860: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d870: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
d880: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d890: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d8a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
d8c0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
d8d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
d8e0: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
d8f0: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
d900: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
d910: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
d920: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
d930: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
d940: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
d950: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
d960: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
d970: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
d980: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
d990: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
d9a0: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
d9b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
d9c0: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
d9d0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
d9e0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
d9f0: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
da00: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
da10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
da20: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
da30: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
da40: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
da50: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
da60: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
da70: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
da80: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
da90: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
daa0: 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
dab0: 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
dac0: 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
dad0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
dae0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
daf0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
db00: 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
db10: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
db20: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
db30: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
db40: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
db50: 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
db60: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
db70: 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
db80: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
db90: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
dba0: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
dbb0: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
dbc0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
dbd0: 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
dbe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dbf0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
dc00: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
dc10: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
dc20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dc30: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
dc40: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
dc50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
dc60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
dc70: 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
dc80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
dc90: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
dca0: 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
dcb0: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
dcc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dcd0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
dce0: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
dcf0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
dd00: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
dd10: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
dd20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
dd30: 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
dd40: 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
dd50: 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
dd80: 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
dd90: 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
dda0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
ddb0: 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
ddc0: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
ddd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
dde0: 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
ddf0: 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
de00: 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
de10: 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
de20: 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
de30: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
de40: 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
de50: 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
de60: 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
de70: 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
de80: 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
de90: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
dea0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
deb0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
dec0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
ded0: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
dee0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
def0: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
df00: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
df10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
df20: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
df30: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
df40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df50: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
df60: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
df70: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
df80: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
df90: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
dfa0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
dfb0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
dfc0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
dfd0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
dfe0: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
dff0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
e000: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e010: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e020: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e030: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
e040: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
e050: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
e060: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
e070: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
e080: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
e090: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
e0a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e0b0: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
e0c0: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
e0d0: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
e0e0: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
e0f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e100: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
e110: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
e120: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
e130: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
e140: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
e150: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
e160: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
e170: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
e180: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
e190: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
e1a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
e1b0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
e1c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
e1d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e1e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e1f0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
e200: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
e210: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
e220: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
e230: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
e240: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
e250: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
e260: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e270: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
e280: 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
e290: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
e2a0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
e2b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
e2c0: 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
e2d0: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
e2e0: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
e2f0: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
e300: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
e310: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
e320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e330: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e340: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
e350: 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
e360: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
e370: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
e380: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
e390: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
e3a0: 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
e3b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e3c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e3d0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
e3e0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
e3f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
e400: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
e410: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
e420: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e430: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
e440: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
e450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e460: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e470: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
e480: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
e490: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
e4a0: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
e4b0: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
e4c0: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
e4d0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
e4e0: 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
e4f0: 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
e500: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e510: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
e520: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
e530: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
e540: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
e550: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
e560: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
e570: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
e580: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
e590: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
e5a0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
e5b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
e5c0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
e5d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e5e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
e5f0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
e600: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
e610: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
e620: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
e630: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
e640: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
e650: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
e660: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
e670: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
e680: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
e690: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
e6a0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
e6b0: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
e6c0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
e6d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e6e0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
e6f0: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
e700: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
e710: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
e720: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
e730: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
e740: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
e750: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
e760: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
e770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
e780: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
e790: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
e7a0: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
e7b0: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
e7c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
e7d0: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
e7e0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
e7f0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
e800: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
e810: 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
e820: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
e830: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e840: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
e850: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e860: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e870: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e880: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e890: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
e8a0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
e8b0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e8c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
e8d0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
e8e0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
e8f0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e900: 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
e910: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e930: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
e940: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
e950: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
e960: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
e970: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e980: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
e990: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e9a0: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
e9b0: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
e9c0: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
e9d0: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
e9e0: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
e9f0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ea00: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
ea10: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
ea20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ea30: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
ea40: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
ea50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
ea60: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
ea70: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
ea80: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
ea90: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
eaa0: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
eab0: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
eac0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
ead0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
eae0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
eaf0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
eb00: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
eb10: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
eb20: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
eb30: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
eb40: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
eb50: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
eb60: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
eb70: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
eb80: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
eb90: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
eba0: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
ebb0: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
ebc0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
ebd0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
ebe0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
ebf0: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
ec00: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
ec10: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
ec20: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
ec30: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
ec40: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
ec50: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
ec60: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
ec70: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
ec80: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
ec90: 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
eca0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
ecb0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
ecc0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ecd0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ece0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ecf0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
ed00: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ed10: 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
ed20: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
ed30: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
ed40: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
ed50: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
ed60: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
ed70: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
ed80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
ed90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
eda0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
edb0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
edc0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
edd0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
ede0: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
edf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
ee00: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
ee10: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
ee20: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
ee30: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
ee40: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
ee50: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
ee60: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
ee70: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
ee80: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
ee90: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
eea0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
eeb0: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
eec0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
eed0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
eee0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
eef0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
ef00: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
ef10: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
ef20: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
ef30: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
ef40: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
ef50: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d  Write = 0;.  p =
ef60: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
ef70: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
ef80: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
ef90: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
efa0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
efb0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
efc0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
efd0: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
efe0: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
eff0: 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
f000: 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76  ( cnt==db->activ
f010: 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73  eVdbeCnt );.  as
f020: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
f030: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
f040: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
f050: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
f060: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
f070: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
f080: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
f090: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
f0a0: 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
f0b0: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
f0c0: 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
f0d0: 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
f0e0: 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
f0f0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
f100: 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
f110: 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
f120: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
f130: 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
f140: 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
f150: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
f160: 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
f170: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f180: 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
f190: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f1a0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74  action is commtt
f1b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
f1c0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
f1d0: 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
f1e0: 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
f1f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
f200: 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
f210: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
f220: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
f230: 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
f240: 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
f250: 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
f260: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
f270: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
f280: 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
f290: 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
f2a0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
f2b0: 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
f2c0: 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
f2d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
f2e0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
f2f0: 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
f300: 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
f310: 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
f320: 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
f330: 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20  ccured, causing 
f340: 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
f350: 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
f360: 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
f370: 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
f380: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
f390: 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
f3a0: 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
f3b0: 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
f3c0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
f3d0: 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
f3e0: 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
f3f0: 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
f400: 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
f410: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
f420: 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
f430: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
f440: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
f450: 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
f460: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
f470: 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
f480: 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
f490: 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
f4a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
f4b0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
f4c0: 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
f4d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
f4e0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
f4f0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
f500: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
f510: 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
f520: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f530: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f540: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
f550: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
f560: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f570: 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
f580: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f590: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
f5a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f5b0: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
f5c0: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
f5d0: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
f5e0: 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
f5f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f600: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f610: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f620: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
f630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f640: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
f650: 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
f660: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
f670: 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0;..    if( rc==
f680: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f690: 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
f6a0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
f6b0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
f6c0: 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
f6d0: 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
f6e0: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
f6f0: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
f700: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
f710: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f730: 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
f740: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
f750: 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
f760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f770: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
f780: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
f790: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
f7a0: 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
f7b0: 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
f7c0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
f7d0: 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
f7e0: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
f7f0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
f800: 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
f810: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
f820: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
f830: 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
f840: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
f850: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
f860: 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
f870: 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
f880: 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  tDefCons;.    }.
f890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f8a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
f8b0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
f8c0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
f8d0: 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
f8e0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
f8f0: 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
f900: 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
f910: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
f920: 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
f930: 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
f940: 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
f950: 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
f960: 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
f970: 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
f980: 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
f990: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
f9a0: 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
f9b0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
f9c0: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
f9d0: 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
f9e0: 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
f9f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
fa00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
fa10: 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
fa20: 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
fa30: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
fa40: 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  write.** an erro
fa50: 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
fa60: 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
fa70: 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
fa80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fa90: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
faa0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
fab0: 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
fac0: 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
fad0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
fae0: 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
faf0: 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66 65  red && db->nDefe
fb00: 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20 28  rredCons>0) || (
fb10: 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
fb20: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
fb30: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
fb40: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
fb50: 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  T;.    p->errorA
fb60: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
fb70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
fb80: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
fb90: 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e  sg, db, "foreign
fba0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
fbb0: 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
fbc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
fbd0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
fbe0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
fbf0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
fc00: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
fc10: 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
fc20: 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
fc30: 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
fc40: 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
fc50: 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
fc60: 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
fc70: 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
fc80: 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
fc90: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
fca0: 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
fcb0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
fcc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fcd0: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
fce0: 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
fcf0: 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
fd00: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
fd10: 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
fd20: 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
fd30: 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
fd40: 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
fd50: 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
fd60: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
fd70: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
fd80: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fd90: 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
fda0: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
fdb0: 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
fdc0: 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
fdd0: 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
fde0: 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
fdf0: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
fe00: 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
fe10: 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
fe20: 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
fe30: 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
fe40: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
fe50: 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
fe60: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
fe90: 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
fea0: 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
feb0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
fec0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
fed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
fee0: 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
fef0: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
ff00: 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
ff10: 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
ff20: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
ff30: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
ff40: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
ff50: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
ff60: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
ff70: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
ff80: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
ff90: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
ffa0: 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
ffb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
ffc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
ffd0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
ffe0: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
fff0: 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
10000 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
10010 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
10020 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
10030 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
10040 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
10050 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
10060 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
10070 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
10080 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10090 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
100a0 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
100b0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
100c0 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
100d0 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
100e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
100f0 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
10100 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10110 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
10120 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
10130 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61   if( p->aOnceFla
10140 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f  g ) memset(p->aO
10150 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e  nceFlag, 0, p->n
10160 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f  OnceFlag);.  clo
10170 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
10180 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
10190 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
101a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
101b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
101c0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
101d0 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
101e0 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
101f0 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
10200 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
10210 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
10220 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
10230 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
10240 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
10250 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
10260 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
10270 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
10280 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
10290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
102a0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
102b0 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
102c0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
102d0 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
102e0 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
102f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10300 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
10310 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
10320 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
10330 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
10340 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
10350 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ff;.    assert( 
10360 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  p->rc!=SQLITE_IO
10370 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20  ERR_BLOCKED );  
10380 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f  /* This error no
10390 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a   longer exists *
103a0 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  /.    isSpecialE
103b0 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
103c0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
103d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
10400 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
10410 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
10420 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
10430 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
10440 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
10450 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
10460 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
10470 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
10480 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
10490 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
104a0 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
104b0 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
104c0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
104d0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
104e0 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
104f0 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
10500 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
10510 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
10520 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
10530 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10540 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
10550 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
10560 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
10570 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
10580 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
10590 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
105a0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
105b0 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
105c0 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
105d0 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  cured while writ
105e0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
105f0 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
10600 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
10610 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
10620 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
10630 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
10640 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
10650 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
10660 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
10670 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
10680 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
10690 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
106a0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
106b0 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
106c0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
106d0 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
106e0 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
106f0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
10700 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
10710 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
10720 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
10730 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
10740 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
10750 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
10760 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
10770 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
10780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10790 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
107a0 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
107b0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
107c0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
107d0 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
107e0 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
107f0 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
10800 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
10810 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
10820 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
10830 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
10840 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10850 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
10860 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
10870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
10880 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
10890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
108a0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
108b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
108c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
108d0 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
108e0 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
108f0 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
10900 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
10910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10920 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
10930 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
10940 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
10950 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
10960 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
10970 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
10980 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
10990 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
109a0 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
109b0 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
109c0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
109d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
109e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
109f0 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
10a00 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
10a10 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
10a20 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
10a30 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
10a40 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
10a50 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
10a60 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
10a70 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
10a80 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
10a90 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10aa0 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
10ab0 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
10ac0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10ad0 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
10ae0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
10af0 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
10b00 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
10b10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
10b20 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
10b30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
10b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10b50 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
10b60 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
10b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
10b80 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
10b90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
10ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10bb0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
10bc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10bd0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
10be0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
10bf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
10c00 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
10c10 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
10c20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
10c30 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
10c40 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
10c50 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
10c60 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
10c70 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
10c80 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
10c90 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
10ca0 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
10cb0 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
10cc0 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
10cd0 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
10ce0 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
10cf0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
10d00 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
10d10 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
10d20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
10d30 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10d40 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
10d50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10d60 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
10d70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10d80 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
10d90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
10da0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10db0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
10dc0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
10dd0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
10de0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
10df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
10e00 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
10e10 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
10e20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0;.          sql
10e30 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
10e40 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
10e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
10e70 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10e80 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
10e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
10ea0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
10eb0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
10ec0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
10ed0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
10ee0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
10ef0 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
10f00 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
10f10 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10f20 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
10f30 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
10f40 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
10f50 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
10f60 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
10f70 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
10f80 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
10f90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10fa0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
10fb0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
10fc0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
10fd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10fe0 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
10ff0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
11000 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
11010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11020 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
11030 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
11040 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
11050 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11060 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
11070 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
11080 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
11090 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
110a0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
110b0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
110c0 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
110d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
110e0 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
110f0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
11100 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
11110 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
11120 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
11130 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
11140 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
11150 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
11160 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
11170 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
11180 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
11190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
111a0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
111b0 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
111c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
111d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
111e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
111f0 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
11200 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
11210 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
11220 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
11230 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11240 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
11250 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
11260 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
11270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11280 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
11290 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
112a0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
112b0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
112c0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
112d0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
112e0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
112f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
11300 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
11310 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
11320 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
11330 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
11340 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
11350 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
11360 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
11370 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11380 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
11390 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
113a0 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
113b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
113c0 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
113d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
113e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
113f0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
11400 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
11410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11430 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
11440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11450 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
11460 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
11470 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
11480 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
11490 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
114a0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
114b0 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
114c0 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
114d0 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
114e0 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
114f0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
11500 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
11510 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  Cnt--;.    if( !
11520 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
11530 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64       db->writeVd
11540 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  beCnt--;.    }. 
11550 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
11560 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62  ctiveVdbeCnt>=db
11570 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
11580 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
11590 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
115a0 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
115b0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
115c0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
115d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
115e0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
115f0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
11600 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
11610 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
11620 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
11630 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
11640 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
11650 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
11660 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
11670 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
11680 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
11690 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
116a0 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
116b0 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
116c0 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
116d0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
116e0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
116f0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11700 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
11710 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74   assert( db->act
11720 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20  iveVdbeCnt>0 || 
11730 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
11740 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
11750 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
11760 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
11770 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
11780 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
11790 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
117a0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
117b0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
117c0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
117d0 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
117e0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
117f0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
11800 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
11810 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
11820 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11830 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
11840 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
11850 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11860 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
11870 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
11880 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
11890 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
118a0 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
118b0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
118c0 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
118d0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
118e0 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
118f0 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
11900 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
11910 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
11920 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
11930 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
11940 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
11950 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
11960 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
11970 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
11980 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
11990 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
119a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
119b0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
119c0 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
119d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
119e0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
119f0 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
11a00 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
11a10 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
11a20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
11a40 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
11a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
11a60 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
11a70 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
11a80 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
11a90 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
11aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
11ab0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
11ac0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
11ad0 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61  ailed = mallocFa
11ae0 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72  iled;.    db->er
11af0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
11b00 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11b10 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
11b20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11b30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  c;.}../*.** Clea
11b40 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
11b50 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
11b60 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
11b70 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
11b80 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
11b90 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
11ba0 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
11bb0 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
11bc0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
11bd0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
11be0 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
11bf0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
11c00 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
11c10 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
11c20 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
11c30 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
11c40 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
11c50 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
11c60 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
11c70 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
11c80 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
11c90 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
11ca0 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
11cb0 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
11cc0 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
11cd0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
11ce0 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
11cf0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
11d00 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
11d10 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
11d20 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
11d30 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
11d40 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
11d50 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
11d60 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
11d70 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
11d80 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
11d90 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
11da0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
11db0 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
11dc0 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
11dd0 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
11de0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
11df0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
11e00 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
11e10 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
11e20 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
11e30 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
11e40 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
11e50 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
11e60 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
11e70 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
11e80 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
11e90 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
11ea0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
11eb0 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
11ec0 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
11ed0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
11ee0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11ef0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
11f00 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(p);.    sqlite
11f10 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11f20 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
11f30 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
11f40 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f   if( p->runOnlyO
11f50 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64  nce ) p->expired
11f60 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
11f70 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
11f80 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
11f90 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
11fa0 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
11fb0 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
11fc0 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
11fd0 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
11fe0 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
11ff0 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
12000 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
12010 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
12020 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
12030 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
12040 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
12050 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
12060 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
12070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
12080 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
12090 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
120a0 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
120b0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
120c0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  T);.    sqlite3D
120d0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
120e0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
120f0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
12100 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
12110 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
12120 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
12130 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
12140 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
12150 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
12160 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
12170 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
12180 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
12190 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
121a0 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
121b0 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
121c0 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
121d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
121e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
121f0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
12200 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
12210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
12220 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
12230 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
12240 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
12250 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
12260 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
12270 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
12280 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
12290 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
122a0 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
122b0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
122c0 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
122d0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
122e0 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
122f0 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
12300 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
12310 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
12320 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
12330 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12340 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
12350 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
12360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12370 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
12380 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
12390 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
123a0 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
123b0 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
123c0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
123d0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
123e0 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
123f0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
12400 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
12410 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
12420 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
12430 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
12440 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
12450 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
12460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12470 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
12480 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
12490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
124a0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
124b0 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
124c0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
124d0 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
124e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
124f0 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
12500 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
12510 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
12520 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12530 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
12540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12550 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72  * Call the destr
12560 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61  uctor for each a
12570 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20  uxdata entry in 
12580 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68  pVdbeFunc for wh
12590 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ich.** the corre
125a0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
125b0 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20  mask is clear.  
125c0 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20  Auxdata entries 
125d0 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65  beyond 31.** are
125e0 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65   always destroye
125f0 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61  d.  To destroy a
12600 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69  ll auxdata entri
12610 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  es, call this.**
12620 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61   routine with ma
12630 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sk==0..*/.void s
12640 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12650 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63  AuxData(VdbeFunc
12660 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74   *pVdbeFunc, int
12670 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b   mask){.  int i;
12680 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56  .  for(i=0; i<pV
12690 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69  dbeFunc->nAux; i
126a0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
126b0 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
126c0 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75  &pVdbeFunc->apAu
126d0 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69  x[i];.    if( (i
126e0 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28  >31 || !(mask&((
126f0 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26  (u32)1)<<i))) &&
12700 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20   pAux->pAux ){. 
12710 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
12720 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
12730 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
12740 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
12750 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d     }.      pAux-
12760 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
12770 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
12780 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
12790 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
127a0 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
127b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
127c0 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 69 66  ment..** The dif
127d0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
127e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
127f0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
12800 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
12810 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
12820 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
12830 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
12840 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
12850 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
12860 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12870 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
12880 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62  ite3VdbeDeleteOb
12890 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
128a0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75  , Vdbe *p){.  Su
128b0 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20  bProgram *pSub, 
128c0 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b  *pNext;.  int i;
128d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
128e0 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
128f0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
12900 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
12910 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
12920 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
12930 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
12940 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
12950 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
12960 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
12970 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
12980 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
12990 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
129a0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
129b0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
129c0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
129d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
129e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d  ;.  }.  for(i=p-
129f0 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nzVar-1; i>=0; 
12a00 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72  i--) sqlite3DbFr
12a10 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b  ee(db, p->azVar[
12a20 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f  i]);.  vdbeFreeO
12a30 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
12a40 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
12a50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12a60 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
12a70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12a80 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
12a90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12aa0 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71  , p->zSql);.  sq
12ab0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12ac0 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64  p->pFree);.#if d
12ad0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12ae0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
12af0 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  N).  sqlite3DbFr
12b00 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61  ee(db, p->zExpla
12b10 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  in);.  sqlite3Db
12b20 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70  Free(db, p->pExp
12b30 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lain);.#endif.  
12b40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12b50 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
12b60 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
12b70 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
12b80 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
12b90 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
12ba0 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
12bb0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
12bc0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
12bd0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
12be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12bf0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
12c00 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
12c10 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
12c20 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
12c30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
12c40 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
12c50 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
12c60 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
12c70 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
12c80 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
12c90 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
12ca0 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
12cb0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
12cc0 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
12cd0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  = 0;.  sqlite3Vd
12ce0 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 64  beDeleteObject(d
12cf0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
12d00 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
12d10 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
12d20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
12d30 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
12d40 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
12d50 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
12d60 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
12d70 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
12d80 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
12d90 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
12da0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
12db0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
12dc0 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
12dd0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
12de0 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
12df0 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
12e00 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
12e10 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
12e20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
12e30 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
12e40 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
12e50 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
12e60 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
12e70 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
12e80 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
12e90 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
12ea0 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
12eb0 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
12ec0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
12ed0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
12ee0 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
12ef0 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
12f00 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
12f10 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
12f20 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
12f30 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
12f40 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
12f50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12f60 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
12f70 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
12f80 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
12f90 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
12fa0 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
12fb0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
12fc0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
12fd0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
12fe0 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
12ff0 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
13000 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
13010 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
13020 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72  Unpacked(p->pCur
13030 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
13040 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
13050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
13060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
13070 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 2d  ->lastRowid = p-
13080 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 20  >movetoTarget;. 
13090 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20     if( res!=0 ) 
130a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
130b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
130c0 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
130d0 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
130e0 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
130f0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
13100 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
13110 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
13120 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
13130 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
13140 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  _STALE;.  }else 
13150 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43  if( ALWAYS(p->pC
13160 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e  ursor) ){.    in
13170 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20  t hasMoved;.    
13180 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
13190 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
131a0 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ved(p->pCursor, 
131b0 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20  &hasMoved);.    
131c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
131d0 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d  rc;.    if( hasM
131e0 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  oved ){.      p-
131f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
13200 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
13210 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31    p->nullRow = 1
13220 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13230 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13240 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
13250 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
13260 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
13270 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
13280 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
13290 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
132a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
132b0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
132c0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
132d0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
132e0 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
132f0 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
13300 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
13310 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
13320 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
13330 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
13340 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
13350 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
13360 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
13370 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
13380 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
13390 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
133a0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
133b0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
133c0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
133d0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
133e0 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
133f0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
13400 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
13410 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
13420 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
13430 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
13440 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
13450 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
13460 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
13470 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
13480 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
13490 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
134a0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
134b0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
134c0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
134d0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
134e0 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
134f0 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
13500 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
13510 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
13520 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
13530 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
13540 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
13550 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
13560 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
13570 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
13580 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
13590 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
135a0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
135b0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
135c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
135e0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
135f0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
13600 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
13610 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
13620 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
13630 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13640 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13650 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
13660 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
13670 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13680 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
136b0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
136c0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
136d0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
136e0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
136f0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
13720 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13730 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
13750 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13760 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13770 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
13780 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
13790 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
137a0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
137c0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
137d0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
137e0 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
137f0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
13800 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
13810 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
13820 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     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 72 65 73 65 72 76 65 64 20         reserved 
13850 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
13860 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
13870 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
13880 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
13890 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
138a0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
138b0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
138c0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
138d0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
138e0 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
138f0 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
13900 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
13910 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
13920 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
13930 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
13940 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
13950 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
13960 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
13970 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
13980 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
13990 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
139a0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
139b0 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
139c0 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
139d0 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
139e0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
139f0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
13a00 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
13a10 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
13a20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13a30 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
13a40 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
13a50 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
13a60 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
13a70 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
13a80 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
13a90 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
13aa0 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
13ab0 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
13ac0 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
13ad0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
13ae0 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20  +(u32)i;.    }. 
13af0 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
13b00 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f      if( i<(-MAX_
13b10 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20  6BYTE) ) return 
13b20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76  6;.      /* Prev
13b30 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e  ious test preven
13b40 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33  ts:  u = -(-9223
13b50 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29  372036854775808)
13b60 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69   */.      u = -i
13b70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13b80 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
13b90 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
13ba0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
13bb0 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
13bc0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
13bd0 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
13be0 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
13bf0 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
13c00 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
13c10 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
13c20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
13c30 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
13c40 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
13c50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
13c60 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13c70 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
13c80 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
13c90 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
13ca0 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d  b) );.  n = pMem
13cb0 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
13cc0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
13cd0 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
13ce0 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73  nZero;.  }.  ass
13cf0 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
13d00 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
13d10 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
13d20 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
13d30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
13d40 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
13d50 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
13d60 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
13d70 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
13d80 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
13d90 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
13da0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
13db0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
13dc0 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
13dd0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
13de0 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
13df0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13e00 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
13e10 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
13e20 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
13e30 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
13e40 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
13e50 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
13e60 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
13e70 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
13e80 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
13e90 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
13ea0 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
13eb0 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
13ec0 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
13ed0 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
13ee0 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
13ef0 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
13f00 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
13f10 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
13f20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
13f30 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
13f40 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
13f50 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
13f60 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
13f70 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
13f80 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
13f90 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
13fa0 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
13fb0 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
13fc0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
13fd0 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
13fe0 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
13ff0 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
14000 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
14010 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
14020 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
14030 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
14040 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
14050 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
14060 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
14070 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
14080 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
14090 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
140a0 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
140b0 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
140c0 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
140d0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
140e0 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
140f0 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
14100 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
14110 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
14120 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
14130 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
14140 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
14150 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
14160 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
14170 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
14180 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
14190 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
141a0 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
141b0 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
141c0 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
141d0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
141e0 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
141f0 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
14200 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
14210 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
14220 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
14230 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
14240 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
14250 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
14260 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
14270 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
14280 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
14290 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
142a0 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
142b0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
142c0 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
142d0 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
142e0 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
142f0 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
14300 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
14310 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
14320 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
14330 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
14340 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
14350 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
14360 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
14370 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
14380 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
14390 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
143a0 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
143b0 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
143c0 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
143d0 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
143e0 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
143f0 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
14400 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
14410 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
14420 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
14430 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
14440 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
14450 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
14460 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
14470 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
14480 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
14490 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
144a0 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
144b0 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
144c0 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
144d0 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
144e0 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
144f0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
14500 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
14510 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
14520 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
14530 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
14540 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
14550 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
14560 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
14570 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
14580 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
14590 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
145a0 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
145b0 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
145c0 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
145d0 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
145e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
145f0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
14600 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
14610 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
14620 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
14630 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
14640 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
14650 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
14660 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
14670 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
14680 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
14690 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
146a0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
146b0 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
146c0 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
146d0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
146e0 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
146f0 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
14700 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
14710 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
14720 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
14730 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
14740 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
14750 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
14760 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
14770 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
14780 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
14790 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
147a0 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
147b0 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
147c0 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
147d0 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
147e0 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
147f0 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
14800 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
14810 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
14820 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
14830 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
14840 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
14850 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
14860 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
14870 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
14880 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
14890 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
148a0 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
148b0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
148c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
148d0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
148e0 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
148f0 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
14900 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
14910 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
14920 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
14930 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
14940 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
14950 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
14960 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
14970 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
14980 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
14990 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
149a0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
149b0 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
149c0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
149d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
149e0 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
149f0 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c  format);.  u32 l
14a00 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
14a10 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
14a20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
14a30 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
14a40 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
14a50 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
14a60 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14a70 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
14a80 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
14a90 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
14aa0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14ab0 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
14ac0 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
14ad0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14ae0 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
14af0 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
14b00 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
14b10 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
14b20 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14b30 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
14b40 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
14b50 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29  len<=(u32)nBuf )
14b60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
14b70 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
14b80 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
14b90 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
14ba0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14bb0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
14bc0 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
14bd0 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
14be0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
14bf0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
14c00 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
14c10 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
14c20 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
14c30 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
14c40 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
14c50 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
14c60 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
14c70 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
14c80 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
14c90 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
14ca0 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
14cb0 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
14cc0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
14cd0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
14ce0 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
14cf0 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73  nZero;.      ass
14d00 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a  ert( nBuf>=0 );.
14d10 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20        if( len > 
14d20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20  (u32)nBuf ){.   
14d30 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29       len = (u32)
14d40 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nBuf;.      }.  
14d50 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b      memset(&buf[
14d60 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e  pMem->n], 0, len
14d70 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d  -pMem->n);.    }
14d80 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
14d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
14da0 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
14db0 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
14dc0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  0;.}../*.** Dese
14dd0 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
14de0 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
14df0 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
14e00 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
14e10 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
14e20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
14e30 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
14e40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14e50 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  read..*/ .u32 sq
14e60 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
14e70 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
14e80 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
14e90 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
14ea0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
14eb0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
14ec0 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
14ed0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
14ee0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
14ef0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
14f00 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
14f10 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
14f20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
14f30 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
14f40 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
14f50 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
14f60 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
14f70 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
14f80 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
14f90 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
14fa0 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
14fb0 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
14fc0 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
14fd0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14fe0 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
14ff0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15000 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
15010 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15020 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
15030 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
15040 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
15050 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15060 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15070 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
15080 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
15090 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
150a0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
150b0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
150c0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
150d0 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
150e0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
150f0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15100 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
15110 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
15120 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
15130 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15140 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
15150 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
15160 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
15170 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
15180 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
15190 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
151a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
151b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
151c0 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
151d0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
151e0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
151f0 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
15200 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
15210 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
15220 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
15230 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15240 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
15250 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
15260 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
15270 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15280 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
15290 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
152a0 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
152b0 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
152c0 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
152d0 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
152e0 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
152f0 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
15300 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
15310 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
15320 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
15330 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15340 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
15350 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
15360 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
15370 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
15380 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
15390 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
153a0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
153b0 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a  */.      u64 x;.
153c0 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66        u32 y;.#if
153d0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
153e0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
153f0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
15400 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
15410 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
15420 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
15430 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
15440 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
15450 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64       ** byte ord
15460 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
15470 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
15480 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
15490 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66   is.      ** def
154a0 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
154b0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
154c0 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
154d0 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a  e mixed.      **
154e0 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a   endian..      *
154f0 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
15500 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
15510 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
15520 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69  <32;.      stati
15530 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
15540 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75  1 = 1.0;.      u
15550 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
15560 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
15570 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
15580 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
15590 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
155a0 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
155b0 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
155c0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
155d0 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d       x = (buf[0]
155e0 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
155f0 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
15600 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
15610 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c     y = (buf[4]<<
15620 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31  24) | (buf[5]<<1
15630 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29  6) | (buf[6]<<8)
15640 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20   | buf[7];.     
15650 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
15660 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
15670 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
15680 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15690 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
156a0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
156b0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
156c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
156d0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
156e0 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
156f0 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20  pMem->r)==8 );. 
15700 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64         swapMixed
15710 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
15720 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
15730 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a  pMem->r, &x, siz
15740 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20  eof(x));.       
15750 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
15760 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
15770 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  ->r) ? MEM_Null 
15780 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  : MEM_Real;.    
15790 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
157a0 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   8;.    }.    ca
157b0 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
157c0 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
157d0 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
157e0 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
157f0 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
15800 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
15810 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15820 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15830 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
15840 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
15850 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69   u32 len = (seri
15860 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
15870 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
15880 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
15890 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
158a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65  .      pMem->xDe
158b0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  l = 0;.      if(
158c0 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30   serial_type&0x0
158d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
158e0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
158f0 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  tr | MEM_Ephem;.
15900 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15910 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15920 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45   = MEM_Blob | ME
15930 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
15940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65  .      return le
15950 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
15960 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15980 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
15990 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
159a0 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
159b0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
159c0 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
159d0 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
159e0 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
159f0 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
15a00 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
15a10 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
15a20 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
15a30 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
15a40 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
15a50 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
15a60 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
15a70 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
15a80 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
15a90 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
15aa0 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
15ab0 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
15ac0 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
15ad0 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
15ae0 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
15af0 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
15b00 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
15b10 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
15b20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
15b30 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
15b40 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
15b50 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
15b60 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
15b70 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
15b80 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
15b90 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
15ba0 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
15bb0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
15bc0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
15bd0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
15be0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
15bf0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
15c00 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
15c10 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
15c20 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
15c30 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
15c40 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15c50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
15c60 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
15c70 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
15c80 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
15c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
15ca0 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
15cb0 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
15cc0 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ce0 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
15cf0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
15d00 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15d20 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
15d30 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
15d40 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
15d50 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
15d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15d70 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
15d80 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
15d90 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
15dc0 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
15dd0 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
15de0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e00 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15e10 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
15e20 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
15e30 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
15e40 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
15e50 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
15e60 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
15e70 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
15e80 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
15e90 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
15ea0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
15eb0 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
15ec0 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
15ed0 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
15ee0 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
15ef0 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
15f00 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
15f10 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
15f20 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
15f30 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
15f40 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
15f50 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
15f60 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
15f70 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
15f80 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
15f90 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
15fa0 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
15fb0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
15fc0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15fd0 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
15fe0 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
15ff0 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
16000 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
16010 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
16020 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
16030 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
16040 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
16050 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
16060 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
16070 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
16080 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
16090 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 70  edRecord))];.  p
160a0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
160b0 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
160c0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
160d0 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74  Field + 1;.  ret
160e0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
160f0 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
16100 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
16110 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
16120 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  [], populate the
16130 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63   .** UnpackedRec
16140 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e  ord structure in
16150 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
16160 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77  ourth argument w
16170 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ith the.** conte
16180 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64  nts of the decod
16190 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76  ed record..*/ .v
161a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
161b0 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
161c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
161d0 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
161e0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
161f0 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
16200 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
16210 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16220 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
16230 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
16240 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
16250 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
16260 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61  record */.  Unpa
16270 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20  ckedRecord *p   
16280 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
16290 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65  his structure be
162a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
162b0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
162c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
162d0 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
162e0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
162f0 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32  .  int d; .  u32
16300 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16320 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d  Offset in aKey[]
16330 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
16340 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
16370 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
16380 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
16390 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65  m *pMem = p->aMe
163a0 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d  m;..  p->flags =
163b0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
163c0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
163d0 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
163e0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
163f0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
16400 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
16410 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
16420 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
16430 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79  Field && d<=nKey
16440 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
16450 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
16460 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
16470 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
16480 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
16490 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
164a0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
164b0 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
164c0 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
164d0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
164e0 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
164f0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
16500 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
16510 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
16520 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
16530 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16540 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
16550 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
16560 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
16570 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
16580 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
16590 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
165a0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
165b0 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  u;.}../*.** This
165c0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
165d0 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
165e0 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
165f0 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
16600 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
16610 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
16620 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
16630 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
16640 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
16650 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
16660 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
16670 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
16680 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
16690 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
166a0 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
166b0 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
166c0 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65   by th OP_MakeRe
166d0 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
166e0 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
166f0 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
16700 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
16710 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
16720 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
16730 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
16740 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
16750 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
16760 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
16770 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16780 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b  fields..** The k
16790 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66 69  ey with fewer fi
167a0 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20  elds is usually 
167b0 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68  compares less th
167c0 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65  an the .** longe
167d0 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20  r key.  However 
167e0 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
167f0 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e  INCRKEY flags in
16800 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a   pPKey2 is set.*
16810 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  * and the common
16820 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65 71   prefixes are eq
16830 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69  ual, then key1 i
16840 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32  s less than key2
16850 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55  ..** Or if the U
16860 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52  NPACKED_MATCH_PR
16870 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65 74  EFIX flag is set
16880 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78 65   and the prefixe
16890 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20  s are.** equal, 
168a0 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72  then the keys ar
168b0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
168c0 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20  be equal and.** 
168d0 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64  the parts beyond
168e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
168f0 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ix are ignored..
16900 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16910 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
16920 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
16930 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
16940 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
16950 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16960 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
16970 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
16980 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20  ){.  int d1;    
16990 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
169a0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
169b0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
169c0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
169d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
169e0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
169f0 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
16a00 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
16a10 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
16a20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
16a30 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
16a40 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
16a50 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
16a60 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
16a70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16a80 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
16a90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
16aa0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
16ab0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
16ac0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
16ad0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
16ae0 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
16af0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
16b00 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
16b10 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
16b20 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
16b30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
16b40 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
16b50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
16b60 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
16b70 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
16b80 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
16b90 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
16ba0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
16bb0 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
16bc0 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
16bd0 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
16be0 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
16bf0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
16c00 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
16c10 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
16c20 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
16c30 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
16c40 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
16c50 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
16c60 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
16c70 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
16c80 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
16c90 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
16ca0 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
16cb0 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
16cc0 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
16cd0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
16ce0 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
16cf0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16d00 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
16d10 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
16d20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
16d30 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
16d40 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
16d50 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
16d60 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
16d70 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
16d80 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
16d90 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
16da0 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
16db0 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
16dc0 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
16dd0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
16de0 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
16df0 7a 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c 64 20  zHdr1;.  nField 
16e00 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
16e10 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78  ld;.  while( idx
16e20 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
16e30 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a  Key2->nField ){.
16e40 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
16e50 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
16e60 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
16e70 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
16e80 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
16e90 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
16ea0 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
16eb0 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
16ec0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20  rial_type1 );.  
16ed0 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
16ee0 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
16ef0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
16f00 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
16f10 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  eak;..    /* Ext
16f20 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
16f30 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
16f40 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
16f50 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16f60 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
16f70 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
16f80 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
16f90 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
16fa0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
16fb0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
16fc0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
16fd0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20  y2->aMem[i],.   
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64          i<nField
17000 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
17010 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
17020 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
17030 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
17040 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
17050 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
17060 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  low */..      /*
17070 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
17080 6c 74 20 69 66 20 77 65 20 61 72 65 20 75 73 69  lt if we are usi
17090 6e 67 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  ng DESC sort ord
170a0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
170b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
170c0 4f 72 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c  Order && i<nFiel
170d0 64 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  d && pKeyInfo->a
170e0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
170f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
17100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
17110 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50       /* If the P
17120 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
17130 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c  g is set and all
17140 20 66 69 65 6c 64 73 20 65 78 63 65 70 74 20 74   fields except t
17150 68 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a  he final.      *
17160 2a 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65  * rowid field we
17170 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63  re equal, then c
17180 6c 65 61 72 20 74 68 65 20 50 52 45 46 49 58 5f  lear the PREFIX_
17190 53 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20  SEARCH flag and 
171a0 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50  set .      ** pP
171b0 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74  Key2->rowid to t
171c0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
171d0 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28  rowid field in (
171e0 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20  pKey1, nKey1).. 
171f0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
17200 75 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49  used by the OP_I
17210 73 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a  sUnique opcode..
17220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17230 66 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67  f( (pPKey2->flag
17240 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
17250 46 49 58 5f 53 45 41 52 43 48 29 20 26 26 20 69  FIX_SEARCH) && i
17260 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  ==(pPKey2->nFiel
17270 64 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  d-1) ){.        
17280 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a  assert( idx1==sz
17290 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20  Hdr1 && rc );.  
172a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
172b0 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m1.flags & MEM_I
172c0 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  nt );.        pP
172d0 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Key2->flags &= ~
172e0 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
172f0 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20  SEARCH;.        
17300 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20  pPKey2->rowid = 
17310 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20  mem1.u.i;.      
17320 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65 74  }.    .      ret
17330 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17340 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
17350 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
17360 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
17370 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
17380 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
17390 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
173a0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
173b0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
173c0 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
173d0 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
173e0 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
173f0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
17400 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
17410 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
17420 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
17430 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
17440 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
17450 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
17460 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
17470 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
17480 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
17490 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
174a0 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20  e equal. If the 
174b0 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
174c0 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65  .  ** flag is se
174d0 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68  t, then break th
174e0 65 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e  e tie by treatin
174f0 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72  g key2 as larger
17500 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50  ..  ** If the UP
17510 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
17520 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CH flag is set, 
17530 74 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63  then keys with c
17540 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20  ommon prefixes. 
17550 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72   ** are consider
17560 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20  ed to be equal. 
17570 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
17580 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68  longer key is th
17590 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20  e .  ** larger. 
175a0 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20   As it happens, 
175b0 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20  the pPKey2 will 
175c0 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f  always be the lo
175d0 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  nger.  ** if the
175e0 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  re is a differen
175f0 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ce..  */.  asser
17600 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66  t( rc==0 );.  if
17610 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
17620 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b  & UNPACKED_INCRK
17630 45 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d  EY ){.    rc = -
17640 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
17650 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
17660 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
17670 41 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c  ATCH ){.    /* L
17680 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20  eave rc==0 */.  
17690 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73  }else if( idx1<s
176a0 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20  zHdr1 ){.    rc 
176b0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
176c0 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a  n rc;.}. ../*.**
176d0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
176e0 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
176f0 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
17700 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
17710 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
17720 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
17730 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
17740 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
17750 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
17760 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
17770 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
17780 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
17790 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
177a0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
177b0 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
177c0 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
177d0 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
177e0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
177f0 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
17800 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
17810 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
17820 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
17830 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
17840 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
17850 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
17860 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
17870 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
17880 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
17890 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
178a0 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
178b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
178c0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
178d0 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
178e0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
178f0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
17900 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
17910 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
17920 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
17930 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45  m m, v;..  UNUSE
17940 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
17950 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
17960 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
17970 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
17980 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
17990 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
179a0 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
179b0 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
179c0 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
179d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
179e0 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69   ** Any corrupti
179f0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69  on is detected i
17a00 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n sqlite3BtreePa
17a10 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68  rseCellPtr(), th
17a20 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68  ough, so.  ** th
17a30 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65  is code can safe
17a40 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e  ly assume that n
17a50 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69  CellKey is 32-bi
17a60 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts  .  */.  asse
17a70 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
17a80 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
17a90 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
17aa0 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
17ab0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
17ac0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
17ad0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
17ae0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20  TE_OK );     /* 
17af0 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
17b00 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
17b10 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
17b20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b   assert( (nCellK
17b30 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ey & SQLITE_MAX_
17b40 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c  U32)==(u64)nCell
17b50 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  Key );..  /* Rea
17b60 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  d in the complet
17b70 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
17b80 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
17b90 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
17ba0 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
17bb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
17bc0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
17bd0 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
17be0 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
17bf0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
17c00 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17c10 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
17c20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
17c30 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
17c40 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
17c50 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
17c60 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
17c70 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
17c80 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
17c90 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
17ca0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
17cb0 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
17cc0 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
17cd0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17ce0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
17cf0 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
17d00 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
17d10 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
17d20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
17d30 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
17d40 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
17d50 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
17d60 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
17d70 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
17d80 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
17d90 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
17da0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17db0 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
17dc0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
17dd0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17de0 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
17df0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17e00 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
17e10 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17e20 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
17e30 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
17e40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17e50 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
17e60 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17e70 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
17e80 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
17e90 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
17ea0 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
17eb0 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
17ec0 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
17ed0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
17ee0 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
17ef0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
17f00 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74  (typeRowid);.  t
17f10 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
17f20 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
17f30 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
17f40 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
17f50 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
17f60 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
17f70 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
17f80 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
17f90 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
17fa0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
17fb0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
17fc0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17fd0 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
17fe0 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
17ff0 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
18000 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
18010 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18020 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
18030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18040 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
18050 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
18060 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
18070 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
18080 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
18090 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
180a0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
180b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
180c0 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
180d0 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
180e0 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f  stcase( m.zMallo
180f0 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
18100 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
18110 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
18120 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18130 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
18140 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
18150 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
18160 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
18170 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
18180 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
18190 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
181a0 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
181b0 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
181c0 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
181d0 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
181e0 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
181f0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
18200 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
18210 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
18220 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
18230 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
18240 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
18250 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
18260 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
18270 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
18280 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
18290 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
182a0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
182b0 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
182c0 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
182d0 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
182e0 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
182f0 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
18300 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
18310 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
18320 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
18330 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
18340 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
18350 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
18360 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
18370 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64  KeyCompare(.  Vd
18380 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
18390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
183a0 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
183b0 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
183c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
183d0 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55  pUnpacked,  /* U
183e0 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
183f0 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  of key to compar
18400 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69  e against */.  i
18410 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
18420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
18430 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
18440 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
18450 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
18460 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
18470 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
18480 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
18490 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
184a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
184b0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
184c0 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
184d0 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
184e0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
184f0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
18500 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
18510 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
18520 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
18530 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
18540 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
18550 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
18560 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
18570 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
18580 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
18590 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74  f the say.  ** t
185a0 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
185b0 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
185c0 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
185d0 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
185e0 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
185f0 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
18600 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
18610 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
18620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18630 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18640 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30  }.  memset(&m, 0
18650 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20  , sizeof(m));.  
18660 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
18670 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
18680 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e  >pCursor, 0, (in
18690 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
186a0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
186b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
186c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e   }.  assert( pUn
186d0 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20  packed->flags & 
186e0 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f  UNPACKED_PREFIX_
186f0 4d 41 54 43 48 20 29 3b 0a 20 20 2a 72 65 73 20  MATCH );.  *res 
18700 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
18710 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20  ordCompare(m.n, 
18720 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b  m.z, pUnpacked);
18730 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
18740 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
18750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18770 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
18780 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
18790 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
187a0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
187b0 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
187c0 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
187d0 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
187e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
187f0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
18800 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
18810 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
18820 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18830 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
18840 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
18850 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
18860 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
18870 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
18880 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
18890 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
188a0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
188b0 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
188c0 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
188d0 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
188e0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
188f0 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
18900 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
18910 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
18920 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
18930 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18940 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
18950 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
18960 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
18970 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
18980 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
18990 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
189a0 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
189b0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
189c0 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
189d0 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
189e0 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
189f0 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
18a00 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
18a10 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
18a20 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
18a30 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
18a40 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
18a50 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
18a60 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
18a70 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
18a80 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
18a90 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
18aa0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
18ab0 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
18ac0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
18ad0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
18ae0 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
18af0 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
18b00 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
18b10 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
18b20 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
18b30 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
18b40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18b50 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
18b60 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
18b70 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
18b80 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
18b90 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
18ba0 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v->db;.}../*.** 
18bb0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
18bc0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
18bd0 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
18be0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
18bf0 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72  lue bound.** par
18c00 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56  ameter iVar of V
18c10 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20  M v. Except, if 
18c20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
18c30 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  SQL NULL, return
18c40 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20   .** 0 instead. 
18c50 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c  Unless it is NUL
18c60 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74  L, apply affinit
18c70 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68  y aff (one of th
18c80 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a  e SQLITE_AFF_*.*
18c90 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20  * constants) to 
18ca0 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
18cb0 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a   returning it..*
18cc0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
18cd0 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  d value must be 
18ce0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
18cf0 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
18d00 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f  3ValueFree()..*/
18d10 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
18d20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61  sqlite3VdbeGetVa
18d30 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
18d40 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
18d50 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
18d60 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
18d70 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
18d80 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
18d90 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
18da0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
18db0 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
18dc0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
18dd0 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
18de0 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
18df0 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
18e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18e10 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
18e20 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
18e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
18e40 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
18e50 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
18e60 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20  _UTF8);.        
18e70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
18e80 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70  oreType((Mem *)p
18e90 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ret);.      }.  
18ea0 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
18eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18ec0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
18ed0 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
18ee0 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
18ef0 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
18f00 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
18f10 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
18f20 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
18f30 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
18f40 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
18f50 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
18f60 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
18f70 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
18f80 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
18f90 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
18fa0 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
18fb0 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
18fc0 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
18fd0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
18fe0 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
18ff0 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
19000 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
19010 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
19020 7d 0a                                            }.