/ Hex Artifact Content
Login

Artifact 819a6b2b0dff718231311ff3a7bac0addecdb6a1:


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 3b 0a 20 20 69 20  ){.  int i;.  i 
19f0: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
1a00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a10: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a20: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
1a30: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b  ->nLabelAlloc ){
1a40: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e  .    int n = p->
1a50: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
1a60: 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  5;.    p->aLabel
1a70: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1a80: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
1a90: 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20   p->aLabel,.    
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61     n*sizeof(p->a
1ad0: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  Label[0]));.    
1ae0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
1af0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b00: 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Size(p->db, p->a
1b10: 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d  Label)/sizeof(p-
1b20: 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d  >aLabel[0]);.  }
1b30: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
1b40: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1b50: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
1b60: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
1b70: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
1b80: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
1b90: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1ba0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1bb0: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
1bc0: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
1bd0: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
1be0: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1bf0: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
1c00: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1c10: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
1c20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c30: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1c40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
1c50: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
1c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1c70: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1c80: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1c90: 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e  t( j>=0 && j<p->
1ca0: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20  nLabel );.  if( 
1cb0: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1cc0: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
1cd0: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->nOp;.  }.}../
1ce0: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
1cf0: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
1d00: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f  an only be run o
1d10: 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  ne time..*/.void
1d20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f   sqlite3VdbeRunO
1d30: 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29  nlyOnce(Vdbe *p)
1d40: 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  {.  p->runOnlyOn
1d50: 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65  ce = 1;.}..#ifde
1d60: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f  f SQLITE_DEBUG /
1d70: 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  * sqlite3AssertM
1d80: 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20  ayAbort() logic 
1d90: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  */../*.** The fo
1da0: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64  llowing type and
1db0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73   function are us
1dc0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1dd0: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
1de0: 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d  s.** in a Vdbe m
1df0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20  ain program and 
1e00: 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d  each of the sub-
1e10: 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65  programs (trigge
1e20: 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69  rs) it may .** i
1e30: 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f  nvoke directly o
1e40: 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74  r indirectly. It
1e50: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1e60: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e70: 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20  *   Op *pOp;.** 
1e80: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
1e90: 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73  er;.**.**   mems
1ea0: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
1eb0: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a  zeof(sIter));.**
1ec0: 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20     sIter.v = v; 
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20             // v 
1ef0: 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a  is of type Vdbe*
1f00: 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70   .**   while( (p
1f10: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
1f20: 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20  &sIter)) ){.**  
1f30: 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69     // Do somethi
1f40: 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20  ng with pOp.**  
1f50: 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44   }.**   sqlite3D
1f60: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
1f70: 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a  er.apSub);.** .*
1f80: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1f90: 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65   VdbeOpIter Vdbe
1fa0: 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56  OpIter;.struct V
1fb0: 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64  dbeOpIter {.  Vd
1fc0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
1fe0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1ff0: 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20  ugh the opcodes 
2000: 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  of */.  SubProgr
2010: 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20  am **apSub;     
2020: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
2030: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
2040: 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20  int nSub;       
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2060: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2070: 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e  in apSub */.  in
2080: 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20  t iAddr;        
2090: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
20a0: 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74  ess of next inst
20b0: 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72  ruction to retur
20c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b  n */.  int iSub;
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72    /* 0 = main pr
20f0: 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74  ogram, 1 = first
2100: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63   sub-program etc
2110: 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f  . */.};.static O
2120: 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64  p *opIterNext(Vd
2130: 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20  beOpIter *p){.  
2140: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a  Vdbe *v = p->v;.
2150: 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a    Op *pRet = 0;.
2160: 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74    Op *aOp;.  int
2170: 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   nOp;..  if( p->
2180: 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b  iSub<=p->nSub ){
2190: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75  ..    if( p->iSu
21a0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f  b==0 ){.      aO
21b0: 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = v->aOp;.    
21c0: 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a    nOp = v->nOp;.
21d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e0: 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   aOp = p->apSub[
21f0: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b  p->iSub-1]->aOp;
2200: 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e  .      nOp = p->
2210: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
2220: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
2230: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64   assert( p->iAdd
2240: 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52  r<nOp );..    pR
2250: 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64  et = &aOp[p->iAd
2260: 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64  dr];.    p->iAdd
2270: 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r++;.    if( p->
2280: 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20  iAddr==nOp ){.  
2290: 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20      p->iSub++;. 
22a0: 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20       p->iAddr = 
22b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
22c0: 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65  if( pRet->p4type
22d0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
22e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
22f0: 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29  te = (p->nSub+1)
2300: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
2310: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  am*);.      int 
2320: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
2330: 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b  ; j<p->nSub; j++
2340: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2350: 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74  ->apSub[j]==pRet
2360: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
2370: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2380: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
2390: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
23a0: 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65  ->apSub = sqlite
23b0: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
23c0: 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62  (v->db, p->apSub
23d0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
23e0: 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20    if( !p->apSub 
23f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ){.          pRe
2400: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
2410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2420: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62  p->apSub[p->nSub
2430: 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70  ++] = pRet->p4.p
2440: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
2450: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2460: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2470: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Ret;.}../*.** Ch
2480: 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72  eck if the progr
2490: 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  am stored in the
24a0: 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77   VM associated w
24b0: 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a  ith pParse may.*
24c0: 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54  * throw an ABORT
24d0: 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73   exception (caus
24e0: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
24f0: 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72  t, but not entir
2500: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
2510: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
2520: 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74  ck). This condit
2530: 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
2540: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
2550: 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72  or any.** sub-pr
2560: 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20  ograms contains 
2570: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
2580: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  wing:.**.**   * 
2590: 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31   OP_Halt with P1
25a0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
25b0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
25c0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  rt..**   *  OP_H
25d0: 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50  altIfNull with P
25e0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
25f0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
2600: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
2610: 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20  Destroy.**   *  
2620: 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20  OP_VUpdate.**   
2630: 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a  *  OP_VRename.**
2640: 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74     *  OP_FkCount
2650: 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69  er with P2==0 (i
2660: 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
2670: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29   key constraint)
2680: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2690: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
26a0: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
26b0: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
26c0: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
26d0: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
26e0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
26f0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
2700: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
2710: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
2720: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2730: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
2740: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
2750: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2760: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2770: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2780: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2790: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
27a0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
27b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
27c0: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
27d0: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
27e0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
27f0: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
2800: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
2810: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
2820: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  .  Op *pOp;.  Vd
2830: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
2840: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
2850: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
2860: 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20  ));.  sIter.v = 
2870: 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f  v;..  while( (pO
2880: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2890: 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20  sIter))!=0 ){.  
28a0: 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70    int opcode = p
28b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
28c0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
28d0: 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65  estroy || opcode
28e0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
28f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
2900: 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  me .#ifndef SQLI
2910: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
2920: 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63  KEY.     || (opc
2930: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
2940: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
2950: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a  && pOp->p2==1) .
2960: 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28  #endif.     || (
2970: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
2980: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
2990: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
29a0: 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53    && (pOp->p1==S
29b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
29c0: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
29d0: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
29e0: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
29f0: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
2a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2a10: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
2a20: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
2a30: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
2a40: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
2a50: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
2a60: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
2a70: 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ccured..  ** If 
2a80: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
2a90: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
2aa0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
2ab0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
2ac0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
2ad0: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
2ae0: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
2af0: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
2b00: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
2b10: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
2b20: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
2b30: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
2b40: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
2b50: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
2b60: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
2b70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b80: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
2b90: 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64  yAbort );.}.#end
2ba0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2bb0: 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33  UG - the sqlite3
2bc0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
2bd0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a   function */../*
2be0: 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  .** Loop through
2bf0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f   the program loo
2c00: 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75  king for P2 valu
2c10: 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61  es that are nega
2c20: 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20  tive.** on jump 
2c30: 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45  instructions.  E
2c40: 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69  ach such value i
2c50: 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f  s a label.  Reso
2c60: 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c  lve the.** label
2c70: 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
2c80: 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20  P2 value to its 
2c90: 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f  correct non-zero
2ca0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
2cb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2cc0: 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20  lled once after 
2cd0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
2ce0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a   been inserted..
2cf0: 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a  **.** Variable *
2d00: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20  pMaxFuncArgs is 
2d10: 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  set to the maxim
2d20: 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20  um value of any 
2d30: 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  P2 argument .** 
2d40: 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f  to an OP_Functio
2d50: 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  n, OP_AggStep or
2d60: 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f   OP_VFilter opco
2d70: 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  de. This is used
2d80: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   by .** sqlite3V
2d90: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74  dbeMakeReady() t
2da0: 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  o size the Vdbe.
2db0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  apArg[] array..*
2dc0: 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c  *.** The Op.opfl
2dd0: 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74  ags field is set
2de0: 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e   on all opcodes.
2df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e00: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
2e10: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
2e20: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
2e30: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nt i;.  int nMax
2e40: 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63  Args = *pMaxFunc
2e50: 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b  Args;.  Op *pOp;
2e60: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
2e70: 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d   p->aLabel;.  p-
2e80: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
2e90: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
2ea0: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
2eb0: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
2ec0: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
2ed0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
2ee0: 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d    pOp->opflags =
2ef0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72   sqlite3OpcodePr
2f00: 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a  operty[opcode];.
2f10: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
2f20: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f  OP_Function || o
2f30: 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65  pcode==OP_AggSte
2f40: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  p ){.      if( p
2f50: 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20  Op->p5>nMaxArgs 
2f60: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2f70: 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ->p5;.    }else 
2f80: 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  if( (opcode==OP_
2f90: 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70  Transaction && p
2fa0: 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70  Op->p2!=0) || op
2fb0: 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20  code==OP_Vacuum 
2fc0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64  ){.      p->read
2fd0: 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Only = 0;.#ifnde
2fe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2ff0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
3000: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
3010: 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20  =OP_VUpdate ){. 
3020: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
3030: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3040: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  Args = pOp->p2;.
3050: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
3060: 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72  code==OP_VFilter
3070: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   ){.      int n;
3080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3090: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
30a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30b0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
30c0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
30d0: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
30e0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  p1;.      if( n>
30f0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
3100: 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a  rgs = n;.#endif.
3110: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
3120: 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c  code==OP_Next ||
3130: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74   opcode==OP_Sort
3140: 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  erNext ){.      
3150: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3160: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
3170: 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ext;.      pOp->
3180: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3190: 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NCE;.    }else i
31a0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 72  f( opcode==OP_Pr
31b0: 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  ev ){.      pOp-
31c0: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
31d0: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
31e0: 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ous;.      pOp->
31f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3200: 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  NCE;.    }..    
3210: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
3220: 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  s & OPFLG_JUMP)!
3230: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  =0 && pOp->p2<0 
3240: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
3250: 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e   -1-pOp->p2<p->n
3260: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
3270: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
3280: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
3290: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
32a0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
32b0: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61  >aLabel);.  p->a
32c0: 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70  Label = 0;..  *p
32d0: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
32e0: 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  axArgs;.}../*.**
32f0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
3300: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
3310: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
3320: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
3330: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
3340: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
3350: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
3360: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3370: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
3380: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
3390: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
33a0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
33b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
33c0: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
33d0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
33e0: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
33f0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
3400: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
3410: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
3420: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
3430: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
3440: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
3450: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
3460: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
3470: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
3480: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
3490: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
34a0: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
34b0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
34c0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
34d0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
34e0: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
34f0: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
3500: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
3510: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
3520: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
3530: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
3540: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
3550: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
3560: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
3570: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
3580: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
3590: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
35a0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
35b0: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
35c0: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
35d0: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
35e0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
35f0: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
3600: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
3610: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
3620: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
3630: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
3640: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
3650: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  /.  assert( p->b
3660: 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a  treeMask==0 );..
3670: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
3680: 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a  s(p, pnMaxArg);.
3690: 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70    *pnOp = p->nOp
36a0: 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a  ;.  p->aOp = 0;.
36b0: 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a    return aOp;.}.
36c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
36d0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
36e0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
36f0: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
3700: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64  eturn the.** add
3710: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73  ress of the firs
3720: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65  t operation adde
3730: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3740: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56  3VdbeAddOpList(V
3750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c  dbe *p, int nOp,
3760: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
3770: 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61  t *aOp){.  int a
3780: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3790: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
37a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
37b0: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
37c0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20   p->nOpAlloc && 
37d0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
37e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
37f0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e    }.  addr = p->
3800: 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  nOp;.  if( ALWAY
3810: 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20  S(nOp>0) ){.    
3820: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
3830: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
3840: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
3850: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
3860: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
3870: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
3880: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
3890: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
38a0: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
38b0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
38c0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
38d0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
38e0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
38f0: 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70 63  0 && (sqlite3Opc
3900: 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74  odeProperty[pOut
3910: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
3920: 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20 20  G_JUMP)!=0 ){.  
3930: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
3940: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
3950: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3960: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3970: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
3980: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
3990: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
39a0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
39b0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
39c0: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
39d0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
39e0: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
39f0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75  _DEBUG.      pOu
3a00: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
3a10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3a20: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
3a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3a40: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
3a50: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
3a60: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
3a70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
3a80: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
3a90: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
3aa0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
3ab0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3ac0: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
3ad0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3ae0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3af0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3b00: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
3b10: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
3b20: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
3b30: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
3b40: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
3b50: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
3b60: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
3b70: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
3b80: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
3b90: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
3ba0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
3bb0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3bc0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3bd0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3be0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3bf0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3c00: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
3c10: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3c20: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3c30: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
3c40: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3c50: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3c60: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3c70: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
3c80: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
3c90: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
3ca0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3cb0: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
3cc0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3cd0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3ce0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3cf0: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3d00: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3d10: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
3d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3d30: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3d40: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
3d50: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3d60: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
3d70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3d80: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
3d90: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
3da0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3db0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
3dc0: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
3dd0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3de0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
3df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3e00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3e10: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
3e20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3e30: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
3e40: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
3e50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3e60: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
3e70: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3e80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3e90: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
3ea0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
3eb0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
3ec0: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
3ed0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3ee0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
3ef0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
3f00: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
3f10: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3f20: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3f30: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
3f40: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
3f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3f60: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
3f70: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3f80: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3f90: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3fa0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
3fb0: 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74 65  addr>=0 ) sqlite
3fc0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
3fd0: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
3fe0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
3ff0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
4000: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
4010: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
4020: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
4030: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
4040: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
4050: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
4060: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
4070: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
4080: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
4090: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
40a0: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
40b0: 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  & (pDef->flags &
40c0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
40d0: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
40e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
40f0: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pDef);.  }.}..st
4100: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
4110: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
4120: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
4130: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
4140: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
4150: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
4160: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
4170: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
4180: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
4190: 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20  {.  if( p4 ){.  
41a0: 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a    assert( db );.
41b0: 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79      switch( p4ty
41c0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
41d0: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20   P4_REAL:.      
41e0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
41f0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e       case P4_DYN
4200: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
4210: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P4_KEYINFO:.   
4220: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
4230: 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20  RAY:.      case 
4240: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4250: 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FF: {.        sq
4260: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4270: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4280: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4290: 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54    case P4_MPRINT
42a0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  F: {.        if(
42b0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
42c0: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66  d==0 ) sqlite3_f
42d0: 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20  ree(p4);.       
42e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
42f0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44        case P4_VD
4300: 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  BEFUNC: {.      
4310: 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62    VdbeFunc *pVdb
4320: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
4330: 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  c *)p4;.        
4340: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
4350: 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46  ction(db, pVdbeF
4360: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
4370: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4380: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4390: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
43a0: 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e  AuxData(pVdbeFun
43b0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  c, 0);.        s
43c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
43d0: 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20   pVdbeFunc);.   
43e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
43f0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4400: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
4410: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
4420: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
4430: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
4440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4450: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4460: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
4470: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4480: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
4490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
44a0: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
44b0: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
44c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
44d0: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
44e0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
44f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4500: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
4510: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4520: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4550: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
4560: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
4570: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4580: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
4590: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
45a0: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
45b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
45c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
45d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
45e0: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
45f0: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
4600: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
4610: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
4620: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
4630: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
4640: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
4650: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
4660: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
4670: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
4680: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4690: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
46a0: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
46b0: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
46c0: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
46d0: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
46e0: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
46f0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
4700: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4710: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4720: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4730: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
4740: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
4750: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
4760: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
4770: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
4780: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
4790: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
47a0: 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63  SubProgram objec
47b0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
47c0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
47d0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a  into the linked.
47e0: 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e  ** list at Vdbe.
47f0: 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69  pSubProgram. Thi
4800: 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74  s list is used t
4810: 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62  o delete all sub
4820: 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65  -program.** obje
4830: 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20  cts when the VM 
4840: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  is no longer req
4850: 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  uired..*/.void s
4860: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
4870: 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70  bProgram(Vdbe *p
4880: 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d  Vdbe, SubProgram
4890: 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74   *p){.  p->pNext
48a0: 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72   = pVdbe->pProgr
48b0: 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72  am;.  pVdbe->pPr
48c0: 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  ogram = p;.}../*
48d0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
48e0: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e  pcode at addr in
48f0: 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f  to OP_Noop.*/.vo
4900: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4910: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
4920: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
4930: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
4940: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
4950: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4960: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4970: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65  = p->db;.    fre
4980: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4990: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
49a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  .    memset(pOp,
49b0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
49c0: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  ]));.    pOp->op
49d0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
49e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
49f0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
4a00: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4a10: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
4a20: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4a30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4a40: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
4a50: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
4a60: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
4a70: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4a80: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4a90: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4aa0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4ab0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4ac0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
4ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
4ae0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
4af0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
4b00: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
4b10: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
4b20: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
4b30: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4b40: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4b50: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
4b60: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
4b70: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4b80: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4b90: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4ba0: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4bb0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4bc0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
4bd0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
4be0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
4bf0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
4c00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
4c10: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4c20: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
4c30: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
4c40: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
4c50: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4c60: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
4c70: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4c80: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4c90: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4ca0: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4cb0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4cc0: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4cd0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4ce0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4cf0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4d00: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4d10: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
4d20: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4d30: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
4d40: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
4d50: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
4d60: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
4d70: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4d80: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4d90: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4da0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4db0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4dc0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4dd0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4de0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4df0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4e00: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4e10: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
4e20: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
4e30: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
4e40: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
4e50: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
4e60: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
4e70: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4e80: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4e90: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4ea0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4eb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4ec0: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4ed0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4ee0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4ef0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4f00: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4f10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4f20: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4f30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4f40: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4f50: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4f60: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4f70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4f80: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4f90: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4fa0: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4fb0: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
4fc0: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
4fd0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
4fe0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ff0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
5000: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
5010: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
5020: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
5030: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
5040: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
5050: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
5060: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
5070: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
5080: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
5090: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
50a0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
50b0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
50c0: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
50d0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
50e0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
50f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
5100: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
5110: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
5120: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
5130: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
5140: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
5150: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
5160: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
5170: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
5180: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
5190: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
51a0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
51b0: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
51c0: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
51d0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
51e0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
51f0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
5200: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
5210: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
5220: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
5230: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
5240: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
5250: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
5260: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
5270: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
5280: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
5290: 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  Byte);.    pOp->
52a0: 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p4.pKeyInfo = pK
52b0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
52c0: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
52d0: 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72    u8 *aSortOrder
52e0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28  ;.      memcpy((
52f0: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
5300: 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69  zP4, nByte - nFi
5310: 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  eld);.      aSor
5320: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
5330: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
5340: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
5350: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
5360: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5370: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
5380: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
5390: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
53a0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
53b0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
53c0: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
53d0: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
53e0: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  }.      pOp->p4t
53f0: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5400: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5410: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
5420: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5430: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5440: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
5450: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
5460: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
5470: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
5480: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5490: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
54a0: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
54b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
54c0: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
54d0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
54e0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
54f0: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
5500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
5510: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
5520: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
5530: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
5540: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
5550: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
5560: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5570: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5580: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5590: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
55a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
55b0: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
55c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
55d0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
55e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
55f0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
5600: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
5610: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
5620: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5630: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
5640: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
5650: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
5660: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
5670: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
5680: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
5690: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
56a0: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
56b0: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
56c0: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
56d0: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
56e0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
56f0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
5700: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
5710: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
5720: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
5730: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
5740: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
5750: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5760: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
5770: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5780: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
5790: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
57a0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
57b0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
57c0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
57d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
57e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
57f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5800: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
5810: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
5820: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5830: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
5840: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5850: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
5860: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
5870: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
5880: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
5890: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
58a0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
58b0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
58c0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
58d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
58e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
58f0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
5900: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
5910: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
5920: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
5930: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
5940: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
5950: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5960: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5970: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5980: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
5990: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
59a0: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
59b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
59c0: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
59d0: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
59e0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
59f0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
5a00: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
5a10: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
5a20: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
5a30: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
5a40: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
5a50: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
5a60: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
5a70: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
5a80: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
5a90: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
5aa0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
5ab0: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
5ac0: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
5ad0: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
5ae0: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
5af0: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
5b00: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
5b10: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
5b20: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
5b30: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
5b40: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
5b50: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
5b60: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
5b70: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
5b80: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
5b90: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
5ba0: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
5bb0: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f  ng.** after a OO
5bc0: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
5bd0: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
5be0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
5bf0: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
5c00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
5c10: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
5c20: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
5c30: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
5c40: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
5c50: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
5c60: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
5c70: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
5c80: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
5c90: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
5ca0: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a  h Valgrind..**.*
5cb0: 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66 64  * About the #ifd
5cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
5cd0: 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c  RACE:  Normally,
5ce0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5cf0: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a   never called.**
5d00: 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30   unless p->nOp>0
5d10: 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75  .  This is becau
5d20: 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73  se in the absens
5d30: 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
5d40: 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50  _TRACE,.** an OP
5d50: 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74 69  _Trace instructi
5d60: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73  on is always ins
5d70: 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  erted by sqlite3
5d80: 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f  VdbeGet() as soo
5d90: 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44  n as.** a new VD
5da0: 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  BE is created.  
5db0: 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20 74  So we are free t
5dc0: 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d  o set addr to p-
5dd0: 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a  >nOp-1 without.*
5de0: 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62  * having to doub
5df0: 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  le-check to make
5e00: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
5e10: 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67  esult is non-neg
5e20: 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66  ative. But.** if
5e30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5e40: 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  CE is defined, t
5e50: 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f  he OP_Trace is o
5e60: 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f  mitted and we do
5e70: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63   need to.** chec
5e80: 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  k the value of p
5e90: 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63  ->nOp-1 before c
5ea0: 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64  ontinuing..*/.Vd
5eb0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
5ec0: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
5ed0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
5ee0: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
5ef0: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
5f00: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
5f10: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
5f20: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
5f30: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
5f40: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
5f50: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
5f60: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
5f70: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
5f80: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
5f90: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
5fa0: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
5fb0: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
5fc0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5fd0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5fe0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23   if( addr<0 ){.#
5ff0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
6000: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
6010: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75  p->nOp==0 ) retu
6020: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6030: 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  my;.#endif.    a
6040: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
6050: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6060: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
6070: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
6080: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6090: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
60a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
60b0: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65      return (Vdbe
60c0: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65  Op*)&dummy;.  }e
60d0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
60e0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
60f0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
6100: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
6110: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69  XPLAIN) || !defi
6120: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20  ned(NDEBUG) \.  
6130: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44     || defined(VD
6140: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
6150: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6160: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  BUG)./*.** Compu
6170: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
6180: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
6190: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
61a0: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
61b0: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
61c0: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
61d0: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
61e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
61f0: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
6200: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
6210: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
6220: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
6230: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
6240: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
6250: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
6260: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
6270: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20  YINFO_STATIC:.  
6280: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6290: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
62a0: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
62b0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
62c0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
62d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
62e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
62f0: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25  Temp, "keyinfo(%
6300: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
6310: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
6320: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6330: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
6340: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
6350: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
6360: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
6370: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
6380: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
6390: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
63a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
63b0: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
63c0: 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
63d0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  me);.          i
63e0: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
63f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
6400: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
6410: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
6420: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6440: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6450: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ',';.          i
6460: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
6470: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49  rtOrder && pKeyI
6480: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
6490: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
64a0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
64b0: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -';.          }.
64c0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
64d0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c  (&zTemp[i], pCol
64e0: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20  l->zName,n+1);. 
64f0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b           i += n;
6500: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6510: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29  f( i+4<nTemp-6 )
6520: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
6530: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e  py(&zTemp[i],",n
6540: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  il",4);.        
6550: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
6560: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6570: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6580: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
6590: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
65a0: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
65b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
65c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
65d0: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
65e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
65f0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
6600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6610: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6620: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25  Temp, "collseq(%
6630: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
6640: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
6650: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6660: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
6670: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
6680: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
6690: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
66a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
66b0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
66c0: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
66d0: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
66e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
66f0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
6700: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
6710: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6720: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
6730: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
6740: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6750: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6760: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
6770: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6780: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6790: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
67a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
67b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
67c0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
67d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
67e0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
67f0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
6800: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
6810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6820: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
6830: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
6840: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
6850: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
6860: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
6870: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
6880: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
6890: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
68a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
68b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
68c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
68d0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
68e0: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
68f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6900: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
6910: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
6920: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6930: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6940: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
6950: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6960: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6970: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
6980: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6990: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
69a0: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
69b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
69c0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
69d0: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
69e0: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
69f0: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
6a00: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6a10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6a20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6a30: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
6a40: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
6a50: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
6a60: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
6a70: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
6a80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6a90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6aa0: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
6ab0: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
6ac0: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
6ad0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6ae0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6af0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
6b00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6b10: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
6b20: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
6b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b40: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
6b50: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
6b60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6b70: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
6b80: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
6b90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6ba0: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
6bb0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
6bc0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
6bd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6be0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
6bf0: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
6c00: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
6c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
6c20: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6c30: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6c40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6c50: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6c60: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6c70: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6c80: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6c90: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6ca0: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6cb0: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6cc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6cd0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6ce0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
6cf0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
6d00: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
6d10: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6d20: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
6d30: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
6d40: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
6d50: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
6d60: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
6d70: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
6d80: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
6d90: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
6da0: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
6db0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
6dc0: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
6dd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6de0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
6df0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
6e00: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
6e10: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
6e20: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
6e30: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
6e40: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
6e50: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
6e60: 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74  sk)*8 );.  p->bt
6e70: 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62  reeMask |= ((yDb
6e80: 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66  Mask)1)<<i;.  if
6e90: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
6ea0: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
6eb0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
6ec0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b  ) ){.    p->lock
6ed0: 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
6ee0: 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a  k)1)<<i;.  }.}..
6ef0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6f00: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
6f10: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
6f20: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
6f30: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
6f40: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
6f50: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
6f60: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
6f70: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
6f80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
6f90: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
6fa0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
6fb0: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
6fc0: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
6fd0: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
6fe0: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
6ff0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
7000: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61  In doing so it a
7010: 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  lso.** sets the 
7020: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
7030: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
7040: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
7050: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
7060: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
7070: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
7080: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
7090: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
70a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
70b0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
70c0: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
70d0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
70e0: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
70f0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
7100: 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  r() is invoked t
7110: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
7120: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
7130: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
7140: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
7150: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
7160: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
7170: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
7180: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a  ed with the VM..
7190: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
71a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
71b0: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
71c0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
71d0: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
71e0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
71f0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
7200: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69   p->btreeMask fi
7210: 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b  eld is a bitmask
7220: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74   of all btrees t
7230: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
7240: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70   .** statement p
7250: 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20   will ever use. 
7260: 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75   Let N be the nu
7270: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
7280: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20  p->btreeMask.** 
7290: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
72a0: 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65   btrees that use
72b0: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
72c0: 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65  Then the runtime
72d0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   of.** this rout
72e0: 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74  ine is N*N.  But
72f0: 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20   as N is rarely 
7300: 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69  more than 1, thi
7310: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  s should not.** 
7320: 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
7330: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7340: 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  eEnter(Vdbe *p){
7350: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d  .  int i;.  yDbM
7360: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69  ask mask;.  sqli
7370: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
7380: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
7390: 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   if( p->lockMask
73a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
73b0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
73c0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
73d0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
73e0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
73f0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  nDb;.  for(i=0, 
7400: 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69  mask=1; i<nDb; i
7410: 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b  ++, mask += mask
7420: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
7430: 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f  && (mask & p->lo
7440: 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c  ckMask)!=0 && AL
7450: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
7460: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
7470: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
7480: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
7490: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
74a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
74b0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
74c0: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
74d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
74e0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
74f0: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
7500: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
7510: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
7520: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
7530: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7540: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
7550: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44  ){.  int i;.  yD
7560: 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71  bMask mask;.  sq
7570: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
7580: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
7590: 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61  .  if( p->lockMa
75a0: 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  sk==0 ) return; 
75b0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
75c0: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d  ase */.  db = p-
75d0: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
75e0: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
75f0: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
7600: 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b  , mask=1; i<nDb;
7610: 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61   i++, mask += ma
7620: 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  sk){.    if( i!=
7630: 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e  1 && (mask & p->
7640: 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20  lockMask)!=0 && 
7650: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
7660: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
7670: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
7680: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
7690: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
76a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
76b0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
76c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
76d0: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
76e0: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
76f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7700: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
7710: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
7720: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
7730: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
7740: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
7750: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
7760: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
7770: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
7780: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
7790: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
77a0: 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20 25  d %4d %4d %-4s %
77b0: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
77c0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
77d0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
77e0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
77f0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
7800: 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  tr));.  fprintf(
7810: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
7820: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
7830: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
7840: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
7850: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
7860: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
7870: 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p5,.#ifdef SQLIT
7880: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
7890: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f  p->zComment ? pO
78a0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22  p->zComment : ""
78b0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a  .#else.      "".
78c0: 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66  #endif.  );.  ff
78d0: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
78e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ndif../*.** Rele
78f0: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
7900: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
7910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7920: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
7930: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
7940: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
7950: 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20    Mem *pEnd;.   
7960: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7970: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
7980: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
7990: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
79a0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
79b0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
79c0: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b   for(pEnd=&p[N];
79d0: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
79e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
79f0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
7a00: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  loc);.      }.  
7a10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7a20: 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26  }.    for(pEnd=&
7a30: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
7a40: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
7a50: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
7a60: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
7a70: 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  .db );..      /*
7a80: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
7a90: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
7aa0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
7ab0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
7ac0: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
7ad0: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
7ae0: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
7af0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
7b00: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
7b10: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
7b20: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
7b30: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
7b40: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
7b50: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
7b60: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
7b70: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
7b80: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
7b90: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
7ba0: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
7bb0: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
7bc0: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
7bd0: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
7be0: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
7bf0: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
7c00: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
7c10: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
7c20: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
7c30: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
7c40: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
7c50: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
7c60: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
7c70: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
7c80: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
7c90: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
7ca0: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
7cb0: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
7cc0: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
7cd0: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
7ce0: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
7cf0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
7d00: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
7d10: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
7d20: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
7d30: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
7d40: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
7d50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
7d60: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
7d70: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
7d80: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
7d90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7da0: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
7db0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7dc0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
7dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7de0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
7df0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  c);.        p->z
7e00: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
7e10: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
7e20: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69  ags = MEM_Invali
7e30: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  d;.    }.    db-
7e40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7e50: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
7e60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
7e70: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
7e80: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
7e90: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
7ea0: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
7eb0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
7ec0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
7ed0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
7ee0: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
7ef0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
7f00: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
7f10: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
7f20: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
7f30: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
7f40: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
7f50: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
7f60: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
7f70: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
7f80: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
7f90: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
7fa0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7fb0: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
7fc0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
7fd0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
7fe0: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
7ff0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
8000: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
8010: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8020: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
8030: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
8040: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
8050: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
8060: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
8070: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
8080: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
8090: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
80a0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
80b0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
80c0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
80d0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
80e0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
80f0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
8100: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
8110: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
8120: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
8130: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
8140: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
8150: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
8160: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
8170: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
8180: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
8190: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
81a0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
81b0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
81c0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
81d0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
81e0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
81f0: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
8200: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
8210: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
8220: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
8230: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
8240: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
8250: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
8260: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
8270: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
8280: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
8290: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
82a0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
82b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
82c0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
82d0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
8300: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
8310: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
8320: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8340: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
8350: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
8360: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
8370: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
8380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
8390: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
83a0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
83b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
83c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
83d0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
83e0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
83f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8400: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
8410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8420: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
8430: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
8440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8470: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
8480: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
8490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
84a0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
84b0: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
84c0: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
84d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
84e0: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
84f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
8500: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
8510: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
8520: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
8530: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
8540: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
8550: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
8560: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
8570: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
8580: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
8590: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
85a0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
85b0: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
85c0: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
85d0: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
85e0: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
85f0: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
8600: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
8610: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
8620: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
8630: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
8640: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
8650: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
8660: 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65  em, 8);.  p->pRe
8670: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20  sultSet = 0;..  
8680: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8690: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
86a0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
86b0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
86c0: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
86d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
86e0: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
86f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
8700: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
8710: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
8720: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
8730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8740: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
8750: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
8760: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
8770: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
8780: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
8790: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
87a0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
87b0: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
87c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
87d0: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
87e0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
87f0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
8800: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
8810: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
8820: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
8830: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
8840: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
8850: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
8860: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
8870: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
8880: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
8890: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
88a0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
88b0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
88c0: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
88d0: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
88e0: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
88f0: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
8900: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
8910: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
8920: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
8930: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
8940: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
8950: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
8960: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
8970: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
8980: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
8990: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
89a0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
89b0: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
89c0: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
89d0: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
89e0: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
89f0: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
8a00: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
8a10: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
8a20: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
8a30: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
8a40: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
8a50: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
8a60: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
8a70: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
8a80: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
8a90: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
8aa0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
8ab0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
8ac0: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
8ad0: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
8ae0: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
8af0: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
8b00: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
8b10: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
8b20: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
8b30: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
8b40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8b50: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
8b60: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
8b70: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
8b80: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
8b90: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
8ba0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
8bb0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
8bc0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
8bd0: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
8be0: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
8bf0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
8c00: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
8c10: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8c20: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
8c30: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
8c40: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
8c50: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
8c60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8c70: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
8c80: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
8c90: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
8ca0: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
8cb0: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
8cc0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
8cd0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
8ce0: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
8cf0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
8d00: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
8d10: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
8d20: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
8d30: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
8d40: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
8d50: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
8d60: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
8d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8d80: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
8d90: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
8da0: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
8db0: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
8dc0: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
8dd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8de0: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
8df0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
8e00: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
8e10: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
8e20: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
8e30: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
8e40: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
8e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
8e60: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
8e70: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p[i];.    }.    
8e80: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
8e90: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
8ea0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8eb0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
8ec0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
8ed0: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
8ee0: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
8f10: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
8f20: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
8f30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
8f40: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
8f50: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
8f60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
8f70: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
8f80: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8f90: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
8fa0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
8fb0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8fc0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8fd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8fe0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
8ff0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9000: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9010: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9020: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9030: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
9040: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
9050: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
9060: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
9070: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
9080: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
9090: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
90a0: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
90b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
90c0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
90d0: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
90e0: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
90f0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
9100: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
9110: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
9120: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
9130: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
9140: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
9150: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
9160: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
9170: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
9180: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
9190: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
91a0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
91b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
91c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
91d0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
91e0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
91f0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
9200: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
9210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
9220: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
9230: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
9240: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
9250: 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20   nByte, 1) ){.  
9260: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
9270: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
9280: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
9290: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
92a0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
92b0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
92c0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
92d0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
92e0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
92f0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
9300: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
9310: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9320: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9330: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
9340: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
9350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
9370: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
9380: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
9390: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
93a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
93b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
93c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
93d0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
93f0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
9400: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9410: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
9420: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
9430: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
9440: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
9450: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
9480: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9490: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
94a0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
94b0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
94c0: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
94d0: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
94e0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
94f0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
9500: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9520: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
9530: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9540: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
9550: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
9560: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
9570: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a  , pMem->z, 32);.
9580: 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d      if( z!=pMem-
9590: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
95a0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
95b0: 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pMem, z, -1, SQ
95c0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
95d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95e0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
95f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
9600: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
9610: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
9620: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
9630: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
9640: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74     }.    pMem->t
9650: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9660: 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  T;.    pMem++;..
9670: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
9680: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
9690: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
96a0: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30  mGrow(pMem, 4, 0
96b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
96c0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
96d0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
96e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
96f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
9700: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
9710: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
9720: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
9730: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
9740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9750: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
9760: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
9770: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
9780: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
9790: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
97a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
97b0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
97c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
97d0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
97e0: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
97f0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
9800: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
9810: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
9820: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
9830: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
9840: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
9850: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
9860: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
9870: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
9880: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
9890: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
98a0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
98b0: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d  TE_TEXT;.      }
98c0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
98d0: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    {.        pMem
98e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
98f0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
9900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
9910: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
9920: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9930: 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_NULL;.      
9940: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  }.    }..    p->
9950: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
9960: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
9970: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
9980: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
9990: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
99a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
99b0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
99c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
99d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
99e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
99f0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
9a00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
9a10: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
9a20: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
9a30: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
9a40: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
9a50: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
9a60: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9a70: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
9a80: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
9a90: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
9aa0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
9ab0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
9ac0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
9ad0: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
9ae0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  .z!=0 ){.    con
9af0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70  st char *z = pOp
9b00: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c  ->p4.z;.    whil
9b10: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
9b20: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
9b30: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
9b40: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  s]\n", z);.  }.}
9b50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
9b60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9b70: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
9b80: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9b90: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
9ba0: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
9bb0: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
9bc0: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
9bd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9be0: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
9bf0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
9c00: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
9c10: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
9c20: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
9c30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
9c40: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
9c50: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
9c60: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
9c70: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63  >opcode==OP_Trac
9c80: 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  e && pOp->p4.z!=
9c90: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
9ca0: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
9cb0: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
9cc0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
9cd0: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
9ce0: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
9cf0: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
9d00: 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b  space(z[i]); i++
9d10: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
9d20: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
9d30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
9d40: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20  space(z[i]) ){. 
9d50: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
9d60: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
9d70: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
9d80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9da0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
9db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9dc0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
9dd0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
9de0: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
9df0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
9e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
9e10: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
9e20: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LE_IOTRACE */../
9e30: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70  *.** Allocate sp
9e40: 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64  ace from a fixed
9e50: 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64   size buffer and
9e60: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
9e70: 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61  r to.** that spa
9e80: 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63  ce.  If insuffic
9e90: 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76  ient space is av
9ea0: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
9eb0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
9ec0: 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69  pBuf parameter i
9ed0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
9ee0: 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  lue of a pointer
9ef0: 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72   which will.** r
9f00: 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d  eceive the new m
9f10: 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20  emory.  pBuf is 
9f20: 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20  normally NULL.  
9f30: 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  If pBuf is not.*
9f40: 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  * NULL, it means
9f50: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61   that memory spa
9f60: 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ce has already b
9f70: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
9f80: 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72  d that.** this r
9f90: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
9fa0: 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e  t allocate any n
9fb0: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ew memory.  When
9fc0: 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20   pBuf is not.** 
9fd0: 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75  NULL simply retu
9fe0: 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61  rn pBuf.  Only a
9ff0: 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f  llocate new memo
a000: 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42  ry space when pB
a010: 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a  uf.** is NULL..*
a020: 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68  *.** nByte is th
a030: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
a040: 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65  s of space neede
a050: 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d  d..**.** *ppFrom
a060: 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c   points to avail
a070: 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70  able space and p
a080: 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  End points to th
a090: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
a0a0: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e  available space.
a0b0: 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20    When space is 
a0c0: 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72  allocated, *ppFr
a0d0: 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70  om is advanced p
a0e0: 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  ast.** the end o
a0f0: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  f the allocated 
a100: 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  space..**.** *pn
a110: 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65  Byte is a counte
a120: 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  r of the number 
a130: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
a140: 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c  e that have fail
a150: 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  ed.** to allocat
a160: 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
a170: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
a180: 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f  ce in *ppFrom to
a190: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
a1a0: 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e  request, then in
a1b0: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
a1c0: 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  by the amount of
a1d0: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f   the request..*/
a1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
a1f0: 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64  locSpace(.  void
a200: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
a210: 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e   /* Where return
a220: 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65   pointer will be
a230: 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74   stored */.  int
a240: 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
a250: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
a260: 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
a270: 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f   */.  u8 **ppFro
a280: 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  m,         /* IN
a290: 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66  /OUT: Allocate f
a2a0: 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20  rom *ppFrom */. 
a2b0: 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20   u8 *pEnd,      
a2c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a2d0: 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20   to 1 byte past 
a2e0: 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72  the end of *ppFr
a2f0: 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  om buffer */.  i
a300: 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20  nt *pnByte      
a310: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61      /* If alloca
a320: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d  tion cannot be m
a330: 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a  ade, increment *
a340: 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61  pnByte */.){.  a
a350: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
a360: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46  E_ALIGNMENT(*ppF
a370: 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42  rom) );.  if( pB
a380: 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66  uf ) return pBuf
a390: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
a3a0: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  D8(nByte);.  if(
a3b0: 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74   &(*ppFrom)[nByt
a3c0: 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20  e] <= pEnd ){.  
a3d0: 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29    pBuf = (void*)
a3e0: 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70  *ppFrom;.    *pp
a3f0: 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  From += nByte;. 
a400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42   }else{.    *pnB
a410: 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  yte += nByte;.  
a420: 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  }.  return pBuf;
a430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
a440: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
a450: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
a460: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
a470: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
a480: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a490: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
a4a0: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
a4b0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
a4c0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
a4d0: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
a4e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
a4f0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
a500: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
a510: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
a520: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
a530: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
a540: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
a550: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
a560: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
a570: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
a580: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
a590: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
a5a0: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
a5b0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
a5c0: 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20  IC_RUN;..#ifdef 
a5d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
a5e0: 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=1; i<p->nMe
a5f0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; i++){.    ass
a600: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
a610: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
a620: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20  .#endif.  p->pc 
a630: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
a640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
a650: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
a660: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67  _Abort;.  p->mag
a670: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
a680: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
a690: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
a6a0: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
a6b0: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
a6c0: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
a6d0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
a6e0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
a6f0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
a700: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28  E_PROFILE.  for(
a710: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
a720: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  ++){.    p->aOp[
a730: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
a740: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
a750: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
a760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
a770: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
a780: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
a790: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
a7a0: 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72  time after.** cr
a7b0: 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75  eating the virtu
a7c0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69  al machine.  Thi
a7d0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
a7e0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
a7f0: 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70  ocating stack sp
a800: 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ace and initiali
a810: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
a820: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
a830: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
a840: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
a850: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
a860: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
a870: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
a880: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
a890: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
a8a0: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
a8b0: 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61   exact once on a
a8c0: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61   each virtual ma
a8d0: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20  chine..** After 
a8e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a8f0: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61  called the VM ha
a900: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64  s been "packaged
a910: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a  " and is ready.*
a920: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72  * to run.  After
a930: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a940: 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65 72 20   called, futher 
a950: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
a960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
a970: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
a980: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
a990: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
a9a0: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
a9b0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
a9c0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
a9d0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
a9e0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
a9f0: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
aa00: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
aa10: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
aa20: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
aa30: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
aa40: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
aa50: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
aa60: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
aa70: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
aa80: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
aa90: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
aaa0: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
aab0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
aac0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
aad0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
aae0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
aaf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ab00: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
ab10: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
ab30: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ab40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
ab50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab60: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
ab70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
ab80: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
abb0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
abc0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abe0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
abf0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
ac00: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
ac10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac30: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
ac40: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ac70: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
ac80: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
ac90: 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20   int nOnce;     
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f  /* Number of OP_
acc0: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
acd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ad00: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
ad10: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
ad20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
ad30: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
ad40: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
ad50: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
ad80: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
ad90: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
ada0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
adb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
adc0: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
add0: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
ade0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
adf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
ae00: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
ae10: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
ae20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
ae30: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
ae40: 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  IT );.  db = p->
ae50: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
ae60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
ae70: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
ae80: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
ae90: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
aea0: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
aeb0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
aec0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
aed0: 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d  axArg;.  nOnce =
aee0: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a   pParse->nOnce;.
aef0: 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29    if( nOnce==0 )
af00: 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45   nOnce = 1; /* E
af10: 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f  nsure at least o
af20: 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f  ne byte in p->aO
af30: 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a  nceFlag[] */.  .
af40: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
af50: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
af60: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
af70: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
af80: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
af90: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
afa0: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
afb0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
afc0: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
afd0: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
afe0: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
aff0: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
b000: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
b010: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
b020: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
b030: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
b040: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
b050: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
b060: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
b070: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
b080: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
b090: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
b0a0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
b0b0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
b0c0: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
b0d0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
b0e0: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
b0f0: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
b100: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
b110: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
b120: 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
b130: 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20   registers, SQL 
b140: 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20  variables, VDBE 
b150: 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a  cursors and .  *
b160: 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * an array to ma
b170: 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69  rshal SQL functi
b180: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e  on arguments in.
b190: 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28  .  */.  zCsr = (
b1a0: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  u8*)&p->aOp[p->n
b1b0: 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  Op];       /* Me
b1c0: 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66  mory avaliable f
b1d0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
b1e0: 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26  .  zEnd = (u8*)&
b1f0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c  p->aOp[p->nOpAll
b200: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
b210: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
b220: 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73  zCsr[] */..  res
b230: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
b240: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
b250: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
b260: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
b270: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
b280: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
b290: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
b2a0: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
b2b0: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
b2c0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a  ;.  }.  memset(z
b2d0: 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73  Csr, 0, zEnd-zCs
b2e0: 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a  r);.  zCsr += (z
b2f0: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
b300: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
b310: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
b320: 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78  zCsr) );.  p->ex
b330: 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 70 2d  pired = 0;..  p-
b340: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20  >expired = 0;.  
b350: 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
b360: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
b370: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
b380: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
b390: 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61  d in two.  ** pa
b3a0: 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
b3b0: 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
b3c0: 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
b3d0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20   space at the . 
b3e0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
b3f0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
b400: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
b410: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
b420: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
b430: 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e  ements by reusin
b440: 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  g the opcode arr
b450: 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68  ay tail, then th
b460: 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61  e second.  ** pa
b470: 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20  ss will fill in 
b480: 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61  the rest using a
b490: 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f   fresh allocatio
b4a0: 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
b4b0: 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
b4c0: 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
b4d0: 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
b4e0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
b4f0: 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
b500: 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65  ver space at the
b510: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
b520: 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67  de array can sig
b530: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
b540: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
b550: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
b560: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
b570: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
b580: 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20   do {.    nByte 
b590: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  = 0;.    p->aMem
b5a0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b5b0: 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
b5c0: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
b5d0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b5e0: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
b5f0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c  ocSpace(p->aVar,
b600: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
b610: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b620: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b630: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
b640: 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  ce(p->apArg, nAr
b650: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
b660: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b670: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56  yte);.    p->azV
b680: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
b690: 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73  p->azVar, nVar*s
b6a0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a  izeof(char*), &z
b6b0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b6c0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  e);.    p->apCsr
b6d0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b6e0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
b6f0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
b700: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b720: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
b730: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63  te);.    p->aOnc
b740: 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61  eFlag = allocSpa
b750: 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  ce(p->aOnceFlag,
b760: 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a   nOnce, &zCsr, z
b770: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b780: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
b790: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
b7a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
b7b0: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
b7c0: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
b7d0: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a   p->pFree;.    z
b7e0: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
b7f0: 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42  e];.  }while( nB
b800: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
b810: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
b820: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36  ->nCursor = (u16
b830: 29 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e  )nCursor;.  p->n
b840: 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65  OnceFlag = nOnce
b850: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20  ;.  if( p->aVar 
b860: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
b870: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
b880: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
b890: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; n++){.      p
b8a0: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
b8b0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
b8c0: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
b8d0: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
b8e0: 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29    if( p->azVar )
b8f0: 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d  {.    p->nzVar =
b900: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a   pParse->nzVar;.
b910: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a      memcpy(p->az
b920: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  Var, pParse->azV
b930: 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a  ar, p->nzVar*siz
b940: 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29  eof(p->azVar[0])
b950: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
b960: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20  arse->azVar, 0, 
b970: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69  pParse->nzVar*si
b980: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56  zeof(pParse->azV
b990: 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  ar[0]));.  }.  i
b9a0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
b9b0: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
b9e0: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
b9f0: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e  .    p->nMem = n
ba00: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
ba10: 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f       /*       no
ba20: 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31  t from 0..nMem-1
ba30: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b   */.    for(n=1;
ba40: 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a   n<=nMem; n++){.
ba50: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
ba60: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76  .flags = MEM_Inv
ba70: 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  alid;.      p->a
ba80: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
ba90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65      }.  }.  p->e
baa0: 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d  xplain = pParse-
bab0: 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69  >explain;.  sqli
bac0: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
bad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
bae0: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
baf0: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
bb00: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
bb10: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
bb20: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
bb30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bb40: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
bb50: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
bb60: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
bb70: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
bb80: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
bb90: 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28  VdbeSorterClose(
bba0: 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69  p->db, pCx);.  i
bbb0: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
bbc0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
bbd0: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
bbe0: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
bbf0: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
bc00: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
bc10: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
bc20: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
bc30: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
bc40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
bc50: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
bc60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
bc70: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
bc80: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
bc90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
bca0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
bcb0: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
bcc0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
bcd0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
bce0: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
bcf0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
bd00: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
bd10: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
bd20: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
bd30: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
bd40: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d  thod = 1;.    pM
bd50: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
bd60: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  tabCursor);.    
bd70: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
bd80: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
bd90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
bda0: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
bdb0: 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
bdc0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
bdd0: 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
bde0: 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
bdf0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
be00: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
be10: 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
be20: 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
be30: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
be40: 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
be50: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
be60: 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
be70: 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
be80: 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
be90: 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    v->aOnceFlag =
bea0: 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c   pFrame->aOnceFl
beb0: 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c  ag;.  v->nOnceFl
bec0: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e  ag = pFrame->nOn
bed0: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70  ceFlag;.  v->aOp
bee0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
bef0: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
bf00: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
bf10: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
bf20: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
bf30: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
bf40: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
bf50: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
bf60: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
bf70: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
bf80: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
bf90: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
bfa0: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
bfb0: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
bfc0: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
bfd0: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
bfe0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
bff0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
c000: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
c010: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
c020: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
c030: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
c040: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
c050: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
c060: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
c070: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
c080: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
c090: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
c0a0: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
c0b0: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
c0c0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
c0d0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
c0e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
c0f0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
c100: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
c110: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
c120: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
c130: 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
c140: 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
c150: 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
c160: 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
c170: 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
c180: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
c190: 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  (pFrame);.  }.  
c1a0: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
c1b0: 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a   p->nFrame = 0;.
c1c0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
c1d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
c1e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c1f0: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
c200: 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20       VdbeCursor 
c210: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
c220: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20  ];.      if( pC 
c230: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c240: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
c250: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20  (p, pC);.       
c260: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
c270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c280: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
c290: 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
c2a0: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
c2b0: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  m[1], p->nMem);.
c2c0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
c2d0: 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20  pDelFrame ){.   
c2e0: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c   VdbeFrame *pDel
c2f0: 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b   = p->pDelFrame;
c300: 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d  .    p->pDelFram
c310: 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e  e = pDel->pParen
c320: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
c330: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44  beFrameDelete(pD
c340: 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  el);.  }.}../*.*
c350: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
c360: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
c370: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
c380: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
c390: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
c3a0: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
c3b0: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
c3c0: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
c3d0: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
c3e0: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
c3f0: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
c400: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
c410: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
c420: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
c430: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
c440: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
c450: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
c460: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
c470: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
c480: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
c490: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
c4a0: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
c4b0: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
c4c0: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
c4d0: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
c4e0: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
c4f0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
c500: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
c510: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
c520: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
c530: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
c540: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
c550: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
c560: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
c570: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
c580: 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20 29 3b 0a  =MEM_Invalid );.
c590: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
c5a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c5b0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
c5c0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
c5d0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
c5e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
c5f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c600: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
c610: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
c620: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
c630: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
c640: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
c650: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
c660: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
c670: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
c680: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
c690: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
c6a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
c6b0: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
c6c0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
c6d0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
c6e0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
c6f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c700: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
c710: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
c720: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
c730: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
c740: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c750: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
c760: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
c770: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
c780: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
c790: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c7a0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
c7b0: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
c7c0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
c7d0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
c7e0: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
c7f0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
c800: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
c810: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
c820: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
c830: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
c840: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
c850: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
c860: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
c870: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
c880: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
c890: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
c8a0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
c8b0: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
c8c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
c8d0: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
c8e0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
c8f0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
c900: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
c910: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
c920: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
c930: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
c940: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
c950: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
c960: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
c970: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
c980: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
c990: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
c9a0: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
c9b0: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
c9c0: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
c9d0: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
c9e0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
c9f0: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
ca00: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
ca10: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
ca20: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
ca30: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
ca40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
ca50: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
ca60: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
ca70: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
ca80: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
ca90: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cab0: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
cac0: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
cad0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
caf0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
cb00: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
cb10: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
cb40: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
cb50: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
cb60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb80: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
cb90: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
cba0: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
cbb0: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
cbc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
cbd0: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
cbe0: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
cbf0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
cc00: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
cc10: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
cc20: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
cc30: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
cc40: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
cc50: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
cc60: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
cc70: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
cc80: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
cc90: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
cca0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ccb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ccc0: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
ccd0: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
cce0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
ccf0: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
cd00: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
cd10: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
cd20: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
cd30: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
cd40: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
cd50: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
cd60: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
cd70: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
cd80: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
cd90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
cda0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
cdb0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
cdc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
cdd0: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
cde0: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
cdf0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
ce00: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
ce10: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
ce20: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
ce30: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
ce40: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
ce50: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
ce60: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
ce70: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
ce80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
ce90: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
cea0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
ceb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
cec0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
ced0: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
cee0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
cef0: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
cf00: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
cf10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
cf20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
cf30: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
cf40: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
cf50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cf60: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
cf70: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
cf80: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
cf90: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
cfa0: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
cfb0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
cfc0: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
cfd0: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
cfe0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
cff0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
d000: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
d010: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
d020: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
d030: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
d040: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
d050: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
d060: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
d070: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
d080: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
d090: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
d0a0: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
d0b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
d0c0: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
d0d0: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
d0e0: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
d0f0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
d100: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
d110: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
d120: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
d130: 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45  bSync(db, &p->zE
d140: 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  rrMsg);..  /* Th
d150: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
d160: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
d170: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
d180: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
d190: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
d1a0: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
d1b0: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
d1c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
d1d0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
d1e0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
d1f0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
d200: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
d210: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
d220: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
d230: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
d240: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
d250: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
d260: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
d270: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
d280: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
d290: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
d2a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d2b0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
d2c0: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
d2d0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d2e0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
d2f0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
d300: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
d310: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
d320: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
d330: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
d340: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
d350: 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
d360: 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  k(sqlite3BtreePa
d370: 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  ger(pBt));.    }
d380: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
d390: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d3a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
d3b0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
d3c0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
d3d0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
d3e0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
d3f0: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
d400: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
d410: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
d420: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
d430: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
d440: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
d450: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
d460: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d470: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
d480: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
d490: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
d4a0: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
d4b0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
d4c0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
d4d0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
d4e0: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
d4f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
d500: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
d510: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
d520: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d530: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
d540: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
d550: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
d560: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
d570: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
d580: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
d590: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
d5a0: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
d5b0: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
d5c0: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
d5d0: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
d5e0: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
d5f0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
d600: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
d610: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
d620: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
d630: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
d640: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
d650: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
d660: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
d670: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
d680: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
d690: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d6a0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
d6b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
d6c0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
d6d0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
d6e0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
d6f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d700: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
d710: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
d720: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
d730: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
d740: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
d750: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
d760: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
d770: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
d780: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
d790: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
d7a0: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
d7b0: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
d7c0: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
d7d0: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
d7e0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
d7f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
d800: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
d810: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
d820: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
d830: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
d840: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
d850: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
d860: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
d870: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d880: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d890: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
d8a0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d8b0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
d8c0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
d8d0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d8e0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
d8f0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
d900: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
d910: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d920: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
d930: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
d940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
d950: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
d960: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
d970: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
d980: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
d990: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
d9a0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d9b0: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
d9c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d9d0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
d9e0: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
d9f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
da00: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
da10: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
da20: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
da30: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
da40: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
da50: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
da60: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
da70: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
da80: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
da90: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
daa0: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
dab0: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
dac0: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
dad0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
dae0: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
daf0: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
db00: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
db10: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
db20: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
db30: 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
db40: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
db50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
db60: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
db70: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
db80: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
db90: 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
dba0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
dbb0: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
dbc0: 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
dbd0: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
dbe0: 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
dbf0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
dc00: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
dc10: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
dc20: 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
dc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
dc40: 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
dc50: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
dc60: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
dc70: 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
dc80: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
dc90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dca0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
dcb0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
dcc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dcd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dce0: 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
dcf0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
dd00: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
dd10: 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
dd20: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
dd30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dd40: 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
dd50: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
dd60: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
dd70: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
dd80: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
dd90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
dda0: 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
ddb0: 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
ddc0: 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
ddf0: 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
de00: 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
de10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
de20: 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
de30: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
de40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
de50: 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
de60: 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
de70: 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
de80: 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
de90: 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
dea0: 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
deb0: 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
dec0: 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
ded0: 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
dee0: 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
def0: 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
df00: 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
df10: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
df20: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
df30: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
df40: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
df50: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
df60: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
df70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
df80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
df90: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
dfa0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
dfb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dfc0: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
dfd0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
dfe0: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
dff0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
e000: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
e010: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
e020: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
e030: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
e040: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
e050: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
e060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e070: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e090: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e0a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e0b0: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
e0c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
e0d0: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
e0e0: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
e0f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
e100: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
e110: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e120: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
e130: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
e140: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
e150: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
e160: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e170: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
e180: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
e190: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
e1a0: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
e1b0: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
e1c0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
e1d0: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
e1e0: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
e1f0: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
e200: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
e210: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
e220: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
e230: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
e240: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e250: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e260: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
e270: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
e280: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
e290: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
e2a0: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
e2b0: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
e2c0: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
e2d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
e2e0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
e2f0: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
e300: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
e310: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
e320: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
e330: 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
e340: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
e350: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
e360: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
e370: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
e380: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
e390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e3a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
e3b0: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
e3c0: 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
e3d0: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
e3e0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
e3f0: 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
e400: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
e410: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
e420: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e430: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e440: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
e450: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
e460: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
e470: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
e480: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
e490: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e4a0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
e4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e4d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
e4e0: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
e4f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
e500: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
e510: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
e520: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
e530: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
e540: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
e550: 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
e560: 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
e570: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
e580: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
e590: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
e5a0: 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
e5b0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
e5c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
e5d0: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
e5e0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
e5f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
e600: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
e610: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
e620: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e630: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
e640: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e650: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e660: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e670: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
e680: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
e690: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
e6a0: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
e6b0: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
e6c0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
e6d0: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
e6e0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
e6f0: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
e700: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
e710: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
e720: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
e730: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
e740: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
e750: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
e760: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
e770: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
e780: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
e790: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
e7a0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
e7b0: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
e7c0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
e7d0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
e7e0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
e7f0: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
e800: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
e810: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
e820: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
e830: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
e840: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
e850: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
e860: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
e870: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
e880: 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
e890: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
e8a0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
e8b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
e8c0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
e8d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e8e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
e8f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e900: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
e910: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
e920: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
e930: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
e940: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
e950: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
e960: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
e970: 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
e980: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e9a0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e9b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e9c0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
e9d0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
e9e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e9f0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
ea00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
ea10: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
ea20: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
ea30: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
ea40: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
ea50: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
ea60: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
ea70: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
ea80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
ea90: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
eaa0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
eab0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
eac0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
ead0: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
eae0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
eaf0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
eb00: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
eb10: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
eb20: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
eb30: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
eb40: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
eb50: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
eb60: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
eb70: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
eb80: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
eb90: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
eba0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
ebb0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
ebc0: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
ebd0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
ebe0: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
ebf0: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
ec00: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
ec10: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
ec20: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
ec30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ec40: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
ec50: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
ec60: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
ec70: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
ec80: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
ec90: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
eca0: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
ecb0: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
ecc0: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
ecd0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
ece0: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
ecf0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
ed00: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
ed10: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
ed20: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
ed30: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
ed40: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
ed50: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
ed60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
ed70: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
ed80: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
ed90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
eda0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
edb0: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
edc0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
edd0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
ede0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
edf0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
ee00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
ee10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
ee20: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
ee30: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
ee40: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
ee50: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
ee60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
ee70: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
ee80: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
ee90: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
eea0: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
eeb0: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
eec0: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
eed0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
eee0: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
eef0: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
ef00: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
ef10: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
ef20: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
ef30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
ef40: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
ef50: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
ef60: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
ef70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
ef80: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
ef90: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
efa0: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
efb0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
efc0: 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ite = 0;.  p = d
efd0: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
efe0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
eff0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
f000: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
f010: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
f020: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
f030: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
f040: 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a  nWrite++;.    }.
f050: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
f060: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f070: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
f080: 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65  dbeCnt );.  asse
f090: 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
f0a0: 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a  writeVdbeCnt );.
f0b0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
f0c0: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
f0d0: 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
f0e0: 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74  .** For every Bt
f0f0: 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61  ree that in data
f100: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
f110: 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  db which .** has
f120: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
f130: 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69  "trip" or invali
f140: 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72  date each cursor
f150: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65   in.** that Btre
f160: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
f170: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  n modified so th
f180: 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
f190: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73   can never be us
f1a0: 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20  ed again.  This 
f1b0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72  happens when a r
f1c0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75  ollback.*** occu
f1d0: 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  rs.  We have to 
f1e0: 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68  trip all the oth
f1f0: 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e  er cursors, even
f200: 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20  .** cursor from 
f210: 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66  other VMs in dif
f220: 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  ferent database 
f230: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20  connections,.** 
f240: 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  so that none of 
f250: 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20  them try to use 
f260: 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63  the data at whic
f270: 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70  h they.** were p
f280: 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63  ointing and whic
f290: 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62  h now may have b
f2a0: 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a  een changed due.
f2b0: 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  ** to the rollba
f2c0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62  ck..**.** Rememb
f2d0: 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61  er that a rollba
f2e0: 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61  ck can delete ta
f2f0: 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e  bles complete an
f300: 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f  d.** reorder roo
f310: 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69  tpages.  So it i
f320: 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
f330: 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a   just to save.**
f340: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
f350: 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61  e cursor.  We ha
f360: 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ve to invalidate
f370: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73   the cursor.** s
f380: 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
f390: 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a  er used again..*
f3a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
f3b0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
f3c0: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
f3d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
f3e0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
f3f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
f400: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
f410: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f420: 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73  ;.    if( p && s
f430: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
f440: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
f450: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
f460: 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53  pAllCursors(p, S
f470: 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20  QLITE_ABORT);.  
f480: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
f490: 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
f4a0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
f4b0: 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
f4c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
f4d0: 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
f4e0: 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
f4f0: 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
f500: 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
f510: 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
f520: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f530: 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
f540: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
f550: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
f560: 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
f570: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
f580: 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
f590: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
f5a0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
f5b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f5c0: 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a  n is commtted..*
f5d0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
f5e0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
f5f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
f600: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
f610: 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
f620: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
f630: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
f640: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
f650: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
f660: 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
f670: 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
f680: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
f690: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
f6a0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
f6b0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
f6c0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
f6d0: 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
f6e0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
f6f0: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
f700: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
f710: 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
f720: 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
f730: 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
f740: 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65   may have occure
f750: 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d  d, causing an em
f760: 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
f770: 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63  ..  ** In this c
f780: 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d  ase (db->nStatem
f790: 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65  ent==0), and the
f7a0: 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
f7b0: 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   do..  */.  if( 
f7c0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26  db->nStatement &
f7d0: 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  & p->iStatement 
f7e0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
f7f0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
f800: 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
f810: 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61  tement-1;..    a
f820: 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
f830: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
f840: 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
f850: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61  _RELEASE);.    a
f860: 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
f870: 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61  ement>0 );.    a
f880: 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
f890: 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
f8a0: 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
f8b0: 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f  oint) );..    fo
f8c0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f8d0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
f8e0: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
f8f0: 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  OK;.      Btree 
f900: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
f910: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
f920: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
f930: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
f940: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
f950: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
f960: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
f970: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
f980: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
f990: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
f9a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
f9b0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
f9c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
f9d0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
f9e0: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
f9f0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
fa00: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
fa10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fa20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fa30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
fa40: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20  c = rc2;.       
fa50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fa60: 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  .    db->nStatem
fa70: 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53  ent--;.    p->iS
fa80: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20  tatement = 0;.. 
fa90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
faa0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
fab0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
fac0: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
fad0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fae0: 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
faf0: 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
fb00: 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
fb10: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
fb20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fb30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
fb40: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
fb50: 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
fb60: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
fb70: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
fb80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
fb90: 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
fba0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
fbb0: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
fbc0: 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
fbd0: 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  re the .    ** d
fbe0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
fbf0: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
fc00: 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74  int counter to t
fc10: 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20  he value it had 
fc20: 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  when .    ** the
fc30: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
fc40: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
fc50: 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  d.  */.    if( e
fc60: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
fc70: 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
fc80: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
fc90: 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43  s = p->nStmtDefC
fca0: 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
fcb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fcc0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
fcd0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
fce0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
fcf0: 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
fd00: 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
fd10: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
fd20: 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
fd30: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
fd40: 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
fd50: 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
fd60: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
fd70: 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
fd80: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
fd90: 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
fda0: 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
fdb0: 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
fdc0: 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
fdd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
fde0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
fdf0: 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
fe00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
fe10: 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
fe20: 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
fe30: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
fe40: 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
fe50: 54 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65  TRAINT and write
fe60: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  .** an error mes
fe70: 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
fe80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
fe90: 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
fea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
feb0: 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
fec0: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
fed0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
fee0: 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
fef0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
ff00: 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
ff10: 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43  & db->nDeferredC
ff20: 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65  ons>0) || (!defe
ff30: 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
ff40: 6e 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20  nstraint>0) ){. 
ff50: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
ff60: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ff70: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
ff80: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
ff90: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
ffa0: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
ffb0: 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  b, "foreign key 
ffc0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ffd0: 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
ffe0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
fff0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
10000 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
10010 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10020 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
10030 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
10040 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
10050 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
10060 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
10070 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
10080 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
10090 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
100a0 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
100b0 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
100c0 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
100d0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
100e0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
100f0 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
10100 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
10110 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
10120 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
10130 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
10140 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
10150 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
10160 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
10170 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
10180 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
10190 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
101a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
101b0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
101c0 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
101d0 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
101e0 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
101f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
10200 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
10210 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
10220 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
10230 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
10240 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
10250 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
10260 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
10270 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
10280 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
102b0 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
102c0 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
102d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
102e0 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
102f0 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
10300 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
10310 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
10320 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
10330 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
10340 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
10350 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
10360 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
10370 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
10380 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
10390 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
103a0 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
103b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
103c0 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
103d0 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
103e0 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
103f0 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
10400 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
10410 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
10420 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
10430 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
10440 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
10450 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
10460 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
10470 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
10480 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
10490 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
104a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
104b0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
104c0 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
104d0 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
104e0 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
104f0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
10500 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
10510 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
10520 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
10530 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
10540 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
10550 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d  p->aOnceFlag ) m
10560 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c  emset(p->aOnceFl
10570 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46  ag, 0, p->nOnceF
10580 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c  lag);.  closeAll
10590 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66  Cursors(p);.  if
105a0 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
105b0 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20  _MAGIC_RUN ){.  
105c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
105d0 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41  OK;.  }.  checkA
105e0 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
105f0 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
10600 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
10610 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
10620 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
10630 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  d */.  if( p->pc
10640 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  >=0 ){.    int m
10650 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
10660 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
10670 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
10680 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
10690 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
106a0 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
106b0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
106c0 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
106d0 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
106e0 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
106f0 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
10700 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
10710 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
10720 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ter(p);..    /* 
10730 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66  Check for one of
10740 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
10750 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d  ors */.    mrc =
10760 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20   p->rc & 0xff;. 
10770 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
10780 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
10790 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68  LOCKED );  /* Th
107a0 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67  is error no long
107b0 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  er exists */.   
107c0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
107d0 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
107e0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
107f0 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
10810 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
10820 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
10830 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
10840 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
10850 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
10860 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
10870 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
10880 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
10890 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
108a0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
108b0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
108c0 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
108d0 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
108e0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
108f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
10900 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
10910 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
10920 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
10930 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
10940 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
10950 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
10960 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
10970 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
10980 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
10990 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
109a0 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
109b0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
109c0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
109d0 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
109e0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64        ** occured
109f0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
10a00 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
10a10 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
10a20 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
10a30 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
10a40 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
10a50 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
10a60 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
10a70 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
10a80 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
10a90 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
10aa0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
10ab0 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
10ac0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
10ad0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
10ae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10af0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
10b00 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
10b10 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
10b20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
10b30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
10b40 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
10b50 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
10b60 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
10b70 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10b80 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
10b90 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
10ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10bb0 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
10bc0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
10bd0 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
10be0 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
10bf0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
10c00 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
10c10 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
10c20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
10c30 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
10c40 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
10c50 20 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64           invalid
10c60 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
10c70 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
10c80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10c90 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10cb0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
10cc0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
10cd0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
10ce0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
10cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10d00 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
10d10 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
10d20 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
10d30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
10d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10d60 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
10d70 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
10d80 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
10d90 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
10da0 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
10db0 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
10dc0 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
10dd0 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
10de0 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
10df0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
10e00 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
10e10 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
10e20 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
10e30 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
10e40 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
10e50 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
10e60 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
10e70 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
10e80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
10e90 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
10ea0 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
10eb0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
10ec0 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64    && db->writeVd
10ed0 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f  beCnt==(p->readO
10ee0 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
10ef0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
10f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
10f10 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10f20 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
10f30 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
10f40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10f50 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
10f60 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
10f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
10f90 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
10fa0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
10fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
10fc0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
10fd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10fe0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
10ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
11000 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
11010 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  AINT;.        }e
11020 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
11030 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
11040 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
11050 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
11060 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
11070 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
11080 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
11090 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
110a0 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
110b0 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
110c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
110d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
110e0 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
110f0 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
11100 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
11110 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
11120 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
11130 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
11140 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
11150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
11160 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
11170 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
11180 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
11190 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
111a0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
111b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
111c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
111d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
111e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
111f0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
11200 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
11210 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
11220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11230 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
11240 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  redCons = 0;.   
11250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
11260 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
11270 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
11280 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
11290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
112a0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
112b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
112c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
112d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
112e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
112f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
11300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
11310 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
11320 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
11330 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
11340 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
11350 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
11360 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
11370 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
11380 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
11390 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
113a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
113b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113c0 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
113d0 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
113e0 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
113f0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11400 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
11410 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
11420 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
11430 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
11440 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
11450 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
11460 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
11470 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
11480 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
11490 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
114a0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
114b0 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
114c0 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
114d0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
114e0 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
114f0 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
11500 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
11510 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
11520 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
11530 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
11540 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
11550 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
11560 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
11570 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
11580 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
11590 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
115a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
115b0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
115c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
115d0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
115e0 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
115f0 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
11600 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
11610 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11620 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
11630 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11640 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
11650 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
11660 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11670 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
11680 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
11690 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
116a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
116b0 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
116c0 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
116d0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  s(db);.        s
116e0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
116f0 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  l(db);.        s
11700 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
11710 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
11720 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11730 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
11740 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
11750 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
11760 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
11770 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
11780 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11790 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
117a0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
117b0 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
117c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
117d0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
117e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
117f0 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
11800 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
11810 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
11820 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
11830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11840 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
11850 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
11860 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
11880 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
11890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
118a0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
118b0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
118c0 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  Rollback or comm
118d0 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68  it any schema ch
118e0 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  anges that occur
118f0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
11900 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
11910 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51   && db->flags&SQ
11920 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
11930 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
11940 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
11950 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a  Schema(db, -1);.
11960 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
11970 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
11980 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
11990 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
119a0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
119b0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
119c0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
119d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
119e0 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
119f0 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
11a00 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
11a10 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
11a20 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
11a30 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
11a40 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20  eVdbeCnt--;.    
11a50 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
11a60 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72   ){.      db->wr
11a70 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iteVdbeCnt--;.  
11a80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
11a90 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
11aa0 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  t>=db->writeVdbe
11ab0 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Cnt );.  }.  p->
11ac0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
11ad0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
11ae0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
11af0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
11b00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11b10 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
11b20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
11b30 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
11b40 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
11b50 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
11b60 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
11b70 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
11b80 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
11b90 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
11ba0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
11bb0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
11bc0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
11bd0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
11be0 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
11bf0 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
11c00 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
11c10 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
11c20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
11c30 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
11c40 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
11c50 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
11c60 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
11c70 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
11c80 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
11c90 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
11ca0 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
11cb0 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
11cc0 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
11cd0 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
11ce0 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
11cf0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
11d00 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
11d10 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
11d20 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
11d30 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
11d40 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
11d50 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
11d60 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
11d70 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
11d80 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
11d90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
11da0 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
11db0 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
11dc0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
11dd0 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
11de0 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
11df0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
11e00 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11e10 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
11e20 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
11e30 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
11e40 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
11e50 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
11e60 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
11e70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
11e80 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
11e90 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
11ea0 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
11eb0 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
11ec0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11ed0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
11ee0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
11ef0 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
11f00 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11f10 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
11f20 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
11f30 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
11f40 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c     u8 mallocFail
11f50 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
11f60 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74  ailed;.    sqlit
11f70 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
11f80 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
11f90 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
11fa0 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
11fb0 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
11fc0 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
11fd0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
11fe0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
11ff0 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61  oc();.    db->ma
12000 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
12010 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64  locFailed;.    d
12020 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
12030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
12040 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
12050 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  c, 0);.  }.  ret
12060 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12070 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
12080 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
12090 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
120a0 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
120b0 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
120c0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
120d0 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
120e0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
120f0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
12100 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
12110 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
12120 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
12130 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
12140 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
12150 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
12160 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
12170 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
12180 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
12190 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
121a0 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
121b0 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
121c0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
121d0 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
121e0 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
121f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
12200 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
12210 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
12220 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
12230 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
12240 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
12250 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
12260 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
12270 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
12280 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
12290 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
122a0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
122b0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
122c0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
122d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
122e0 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
122f0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
12300 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
12310 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
12320 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
12330 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
12340 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
12350 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
12360 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
12370 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
12380 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
12390 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
123a0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
123b0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
123c0 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
123d0 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
123e0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
123f0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
12400 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
12410 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  >pc>=0 ){.    sq
12420 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
12430 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73  rError(p);.    s
12440 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12450 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
12460 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
12470 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e  ;.    if( p->run
12480 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78  OnlyOnce ) p->ex
12490 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  pired = 1;.  }el
124a0 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
124b0 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
124c0 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
124d0 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
124e0 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
124f0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
12500 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
12510 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
12520 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
12530 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
12540 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
12550 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
12560 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
12570 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
12580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
12590 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
125a0 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
125b0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
125c0 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
125d0 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
125e0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
125f0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
12600 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12610 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
12620 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
12630 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
12640 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
12650 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
12660 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
12670 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
12680 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
12690 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
126a0 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
126b0 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
126c0 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
126d0 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
126e0 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
126f0 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
12700 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
12710 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
12720 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
12730 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12740 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
12750 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
12760 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
12770 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
12780 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
12790 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
127a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
127b0 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
127c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
127d0 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
127e0 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
127f0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
12800 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
12810 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
12820 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
12830 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
12840 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
12850 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
12860 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
12870 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
12880 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
12890 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
128a0 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
128b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
128c0 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
128d0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
128e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
128f0 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
12900 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
12910 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
12920 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
12930 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
12940 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12950 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
12960 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
12970 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
12980 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
12990 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
129a0 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
129b0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
129c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
129d0 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
129e0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
129f0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
12a00 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
12a10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
12a20 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
12a30 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
12a40 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
12a50 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
12a60 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
12a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12a80 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  ./*.** Call the 
12a90 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65  destructor for e
12aa0 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72  ach auxdata entr
12ab0 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66  y in pVdbeFunc f
12ac0 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20  or which.** the 
12ad0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
12ae0 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65  t in mask is cle
12af0 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74  ar.  Auxdata ent
12b00 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a  ries beyond 31.*
12b10 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73  * are always des
12b20 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74  troyed.  To dest
12b30 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20  roy all auxdata 
12b40 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68  entries, call th
12b50 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  is.** routine wi
12b60 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76  th mask==0..*/.v
12b70 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
12b80 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
12b90 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
12ba0 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69  , int mask){.  i
12bb0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
12bc0 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41   i<pVdbeFunc->nA
12bd0 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ux; i++){.    st
12be0 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41  ruct AuxData *pA
12bf0 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d  ux = &pVdbeFunc-
12c00 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69  >apAux[i];.    i
12c10 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61  f( (i>31 || !(ma
12c20 73 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29  sk&(((u32)1)<<i)
12c30 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78  )) && pAux->pAux
12c40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
12c50 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
12c60 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
12c70 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
12c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12c90 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a  pAux->pAux = 0;.
12ca0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12cb0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
12cc0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
12cd0 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
12ce0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
12cf0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68   argument..** Th
12d00 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
12d10 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
12d20 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  on and sqlite3Vd
12d30 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68  beDelete() is th
12d40 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65  at.** VdbeDelete
12d50 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20  () also unlinks 
12d60 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
12d70 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73  e list of VMs as
12d80 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
12d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
12da0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
12db0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
12dc0 65 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  eteObject(sqlite
12dd0 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
12de0 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
12df0 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Sub, *pNext;.  i
12e00 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
12e10 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
12e20 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
12e30 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
12e40 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
12e50 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
12e60 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
12e70 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
12e80 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
12e90 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
12ea0 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
12eb0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
12ec0 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
12ed0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
12ee0 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
12ef0 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
12f00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12f10 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  pSub);.  }.  for
12f20 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69  (i=p->nzVar-1; i
12f30 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65  >=0; i--) sqlite
12f40 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12f50 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65  zVar[i]);.  vdbe
12f60 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
12f70 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
12f80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12f90 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  (db, p->aLabel);
12fa0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12fb0 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
12fc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12fd0 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
12fe0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12ff0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
13000 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
13010 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
13020 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65  XPLAIN).  sqlite
13030 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
13040 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69  Explain);.  sqli
13050 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13060 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64  >pExplain);.#end
13070 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
13080 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
13090 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
130a0 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
130b0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
130c0 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
130d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
130e0 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
130f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
13100 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
13110 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
13120 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
13130 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
13140 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
13150 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
13160 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
13170 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
13180 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
13190 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
131a0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
131b0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
131c0 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
131d0 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
131e0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
131f0 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  teObject(db, p);
13200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
13210 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ure the cursor p
13220 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61   is ready to rea
13230 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72  d or write the r
13240 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a  ow to which it.*
13250 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74  * was last posit
13260 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ioned.  Return a
13270 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
13280 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20  an OOM fault or 
13290 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65  I/O error.** pre
132a0 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f  vents us from po
132b0 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75  sitioning the cu
132c0 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72  rsor to its corr
132d0 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ect position..**
132e0 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
132f0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
13300 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
13310 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
13320 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
13330 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76   now.  If no mov
13340 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68  e is pending, ch
13350 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
13360 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a  e row has been.*
13370 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  * deleted out fr
13380 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
13390 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61  sor and if it ha
133a0 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20  s, mark the row 
133b0 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77  as.** a NULL row
133c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
133d0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
133e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
133f0 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64   correct row and
13400 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a   that row has.**
13410 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65   not been delete
13420 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
13430 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65   the cursor, the
13440 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
13450 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
13460 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
13470 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  sorMoveto(VdbeCu
13480 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
13490 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
134a0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
134b0 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
134c0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74  ITE_TEST.    ext
134d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
134e0 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
134f0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
13500 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
13510 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13520 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
13530 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
13540 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
13550 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
13560 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13570 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74   rc;.    p->last
13580 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74  Rowid = p->movet
13590 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28  oTarget;.    if(
135a0 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
135b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
135c0 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  BKPT;.    p->row
135d0 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23  idIsValid = 1;.#
135e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
135f0 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
13600 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
13610 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65  ndif.    p->defe
13620 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
13630 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
13640 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
13650 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c  ;.  }else if( AL
13660 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29  WAYS(p->pCursor)
13670 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d   ){.    int hasM
13680 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  oved;.    int rc
13690 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
136a0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
136b0 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f  >pCursor, &hasMo
136c0 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ved);.    if( rc
136d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
136e0 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29    if( hasMoved )
136f0 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65  {.      p->cache
13700 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
13710 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  TALE;.      p->n
13720 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ullRow = 1;.    
13730 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
13740 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13750 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
13760 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
13770 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
13780 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
13790 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
137a0 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
137b0 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
137c0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
137d0 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
137e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
137f0 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
13800 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
13810 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
13820 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
13830 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
13840 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
13850 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
13860 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
13870 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
13880 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
13890 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
138a0 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
138b0 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
138c0 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
138d0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
138e0 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
138f0 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
13900 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
13910 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
13920 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
13930 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
13940 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
13950 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
13960 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
13970 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
13980 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
13990 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
139a0 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
139b0 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
139c0 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
139d0 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
139e0 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
139f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
13a00 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
13a10 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
13a20 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a  lob seperately..
13a30 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
13a40 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
13a50 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
13a60 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
13a70 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
13a80 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
13a90 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
13aa0 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
13ab0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
13ac0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
13ad0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
13ae0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
13af0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
13b00 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13b10 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
13b20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13b30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
13b40 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13b50 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
13b80 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13b90 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
13ba0 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
13bb0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13bc0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
13bf0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13c00 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
13c20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13c30 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13c40 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
13c50 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
13c60 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13c70 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
13ca0 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
13cb0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
13cc0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
13cd0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
13ce0 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
13cf0 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
13d00 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13d10 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
13d20 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
13d30 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
13d60 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
13d70 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
13d80 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
13d90 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
13da0 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
13db0 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
13dc0 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
13dd0 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
13de0 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
13df0 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
13e00 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
13e10 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
13e20 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
13e30 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
13e40 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
13e50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
13e60 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
13e70 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
13e80 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
13e90 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13ea0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
13eb0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
13ec0 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
13ed0 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
13ee0 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  nt n;..  if( fla
13ef0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
13f00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13f10 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
13f20 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
13f30 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
13f40 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
13f50 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
13f60 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
13f70 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
13f80 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
13f90 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
13fa0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
13fb0 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69  64 u;.    if( fi
13fc0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20  le_format>=4 && 
13fd0 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20  (i&1)==i ){.    
13fe0 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
13ff0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
14000 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66   i<0 ){.      if
14010 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29  ( i<(-MAX_6BYTE)
14020 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20   ) return 6;.   
14030 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
14040 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75  est prevents:  u
14050 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36   = -(-9223372036
14060 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20  854775808) */.  
14070 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20      u = -i;.    
14080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
14090 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
140a0 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
140b0 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
140c0 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
140d0 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
140e0 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
140f0 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
14100 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
14110 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
14120 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
14130 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
14140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
14150 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
14160 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
14170 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
14180 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14190 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
141a0 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
141b0 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
141c0 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
141d0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
141e0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
141f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
14200 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
14210 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
14220 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
14230 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
14240 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
14250 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
14260 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
14270 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
14280 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
14290 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
142a0 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
142b0 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
142c0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
142d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
142e0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
142f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
14300 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
14310 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
14320 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
14330 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
14340 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
14350 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
14360 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
14370 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
14380 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
14390 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
143a0 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
143b0 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
143c0 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
143d0 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
143e0 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
143f0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
14400 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
14410 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
14420 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
14430 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
14440 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
14450 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
14460 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
14470 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
14480 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
14490 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
144a0 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
144b0 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
144c0 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
144d0 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
144e0 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
144f0 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
14500 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
14510 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
14520 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
14530 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
14540 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
14550 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
14560 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
14570 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
14580 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
14590 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
145a0 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
145b0 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
145c0 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
145d0 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
145e0 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
145f0 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
14600 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
14610 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
14620 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
14630 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
14640 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
14650 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
14660 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
14670 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
14680 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
14690 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
146a0 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
146b0 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
146c0 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
146d0 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
146e0 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
146f0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
14700 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
14710 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
14720 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
14730 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
14740 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
14750 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
14760 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
14770 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
14780 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
14790 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
147a0 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
147b0 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
147c0 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
147d0 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
147e0 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
147f0 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
14800 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
14810 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
14820 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
14830 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
14840 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
14850 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
14860 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
14870 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
14880 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
14890 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
148a0 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
148b0 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
148c0 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
148d0 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
148e0 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
148f0 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
14900 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
14910 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
14920 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
14930 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
14940 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
14950 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
14960 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
14970 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
14980 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
14990 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
149a0 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
149b0 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
149c0 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
149d0 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
149e0 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
149f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
14a00 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
14a10 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
14a20 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
14a30 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
14a40 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
14a50 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
14a60 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
14a70 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
14a80 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
14a90 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
14aa0 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
14ab0 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
14ac0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14ad0 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
14ae0 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
14af0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
14b00 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
14b10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
14b20 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
14b30 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
14b40 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
14b50 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
14b60 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
14b70 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
14b80 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
14b90 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
14ba0 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
14bb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
14bc0 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
14bd0 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
14be0 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
14bf0 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42  ft in buf[].  nB
14c00 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  uf must always b
14c10 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67  e.** large enoug
14c20 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  h to hold the en
14c30 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63  tire field.  Exc
14c40 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c  ept, if the fiel
14c50 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77  d is.** a blob w
14c60 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  ith a zero-fille
14c70 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66  d tail, then buf
14c80 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74  [] might be just
14c90 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69   the right.** si
14ca0 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79  ze to hold every
14cb0 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72  thing except for
14cc0 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
14cd0 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d   tail.  If buf[]
14ce0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20  .** is only big 
14cf0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
14d00 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66  he non-zero pref
14d10 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ix, then only wr
14d20 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ite that.** pref
14d30 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  ix into buf[].  
14d40 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20  But if buf[] is 
14d50 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
14d60 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a  hold both the.**
14d70 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20   prefix and the 
14d80 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20  tail then write 
14d90 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
14da0 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61  et the tail to a
14db0 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a  ll.** zeros..**.
14dc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14dd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
14de0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
14df0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
14e00 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
14e10 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
14e20 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
14e30 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
14e40 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
14e50 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
14e60 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
14e70 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
14e80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14e90 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e  lPut(u8 *buf, in
14ea0 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  t nBuf, Mem *pMe
14eb0 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
14ec0 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  at){.  u32 seria
14ed0 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
14ee0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
14ef0 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Mem, file_format
14f00 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  );.  u32 len;.. 
14f10 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
14f20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
14f30 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
14f40 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
14f50 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
14f60 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
14f70 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
14f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14f90 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
14fa0 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
14fb0 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
14fc0 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
14fd0 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
14fe0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
14ff0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15000 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
15010 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
15020 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
15030 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
15040 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
15050 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28    assert( len<=(
15060 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  u32)nBuf );.    
15070 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
15080 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38      buf[i] = (u8
15090 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
150a0 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
150b0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
150c0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
150d0 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
150e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
150f0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
15100 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
15110 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
15120 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
15130 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
15140 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
15150 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15160 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
15170 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15180 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b  pMem->n<=nBuf );
15190 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
151a0 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
151b0 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
151c0 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  );.    if( pMem-
151d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
151e0 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b  o ){.      len +
151f0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
15200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
15210 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  Buf>=0 );.      
15220 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e  if( len > (u32)n
15230 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
15240 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a  en = (u32)nBuf;.
15250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
15260 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
15270 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
15280 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
15290 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
152a0 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
152b0 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
152c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
152d0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
152e0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
152f0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
15300 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
15310 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
15320 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
15330 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
15340 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
15350 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
15360 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
15370 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
15380 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
15390 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
153a0 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
153b0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
153c0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
153d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
153e0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
153f0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
15400 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
15430 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
15440 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
15450 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
15460 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
15470 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
15480 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
15490 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
154a0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
154b0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
154c0 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
154d0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
154e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
154f0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
15500 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15510 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
15520 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
15530 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
15540 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
15550 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
15560 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15570 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
15580 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
15590 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
155a0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
155b0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
155c0 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
155d0 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
155e0 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
155f0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15600 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
15610 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
15620 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
15630 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
15640 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
15650 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
15660 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
15670 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
15680 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
15690 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
156a0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
156b0 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
156c0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
156d0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
156e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
156f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
15700 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
15710 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
15720 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
15730 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
15740 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15750 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
15760 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
15770 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
15780 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15790 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
157a0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
157b0 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
157c0 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
157d0 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
157e0 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
157f0 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
15800 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
15810 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
15820 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
15830 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
15840 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15850 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
15860 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
15870 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
15880 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15890 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
158a0 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
158b0 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
158c0 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
158d0 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
158e0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
158f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15900 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15910 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
15920 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
15930 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
15940 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
15950 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
15960 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
15970 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
15980 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
15990 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
159a0 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
159b0 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
159c0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
159d0 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
159e0 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
159f0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
15a00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
15a10 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
15a20 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
15a30 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
15a40 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
15a50 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
15a60 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
15a70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15a80 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
15a90 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
15aa0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
15ab0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
15ac0 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
15ad0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
15ae0 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
15af0 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
15b00 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
15b10 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
15b20 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
15b30 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
15b40 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
15b50 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
15b60 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
15b70 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
15b80 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
15b90 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
15ba0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
15bb0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15bc0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
15bd0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
15be0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
15bf0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
15c00 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
15c10 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
15c20 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
15c30 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
15c40 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
15c50 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
15c60 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
15c70 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
15c80 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
15c90 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
15ca0 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
15cb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
15cc0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
15cd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
15ce0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
15cf0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
15d00 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
15d10 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
15d20 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
15d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15d40 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
15d50 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c  t: {.      u32 l
15d60 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
15d70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
15d80 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
15d90 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
15da0 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
15db0 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
15dc0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
15dd0 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
15de0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
15df0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
15e00 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
15e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15e20 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15e30 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
15e40 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
15e50 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
15e60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15e70 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
15e80 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
15e90 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
15ea0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
15eb0 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
15ec0 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
15ed0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
15ee0 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
15ef0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
15f00 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
15f10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
15f20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
15f30 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
15f40 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
15f50 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
15f60 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
15f70 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
15f80 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
15f90 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
15fa0 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
15fb0 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
15fc0 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
15fd0 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
15fe0 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
15ff0 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
16000 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
16010 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
16020 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
16030 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
16040 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
16050 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
16060 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
16070 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
16080 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
16090 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
160a0 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
160b0 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
160c0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
160d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
160e0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
160f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
16100 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
16110 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
16120 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
16130 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
16140 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
16150 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
16160 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
16170 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
16180 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
16190 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
161a0 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65       /* Unaligne
161b0 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  d space availabl
161c0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  e */.  int szSpa
161d0 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
161e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
161f0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
16200 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  tes */.  char **
16210 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20  ppFree          
16220 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16230 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66   Caller should f
16240 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ree this pointer
16250 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
16260 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
16270 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
16280 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
16290 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
162a0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
162b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
162c0 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62  crement pSpace b
162d0 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20  y nOff to align 
162e0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  it */.  int nByt
162f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16300 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16310 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
16320 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20  red for *p */.. 
16330 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   /* We want to s
16340 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
16350 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
16360 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
16370 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
16380 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
16390 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
163a0 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
163b0 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
163c0 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
163d0 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
163e0 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
163f0 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
16400 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
16410 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
16420 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
16430 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
16440 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  & 7;.  nByte = R
16450 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
16460 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20  ackedRecord)) + 
16470 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
16480 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29  yInfo->nField+1)
16490 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
164a0 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20  Space+nOff ){.  
164b0 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
164c0 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
164d0 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
164e0 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
164f0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28  .    *ppFree = (
16500 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66  char *)p;.    if
16510 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
16520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
16530 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
16540 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d  d*)&pSpace[nOff]
16550 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
16560 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65  0;.  }..  p->aMe
16570 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61  m = (Mem*)&((cha
16580 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)[ROUND8(siz
16590 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
165a0 72 64 29 29 5d 3b 0a 20 20 70 2d 3e 70 4b 65 79  rd))];.  p->pKey
165b0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
165c0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
165d0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
165e0 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
165f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
16600 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
16610 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
16620 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
16630 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
16640 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
16650 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
16660 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
16670 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
16680 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
16690 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
166a0 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
166b0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
166c0 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
166d0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
166e0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
166f0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
16700 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
16710 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
16720 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
16730 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
16740 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
16750 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
16760 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
16770 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
16780 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
16790 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
167a0 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
167b0 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
167c0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
167d0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
167e0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
167f0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
16800 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
16830 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
16840 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
16850 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16870 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
16880 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
16890 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
168a0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
168b0 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  p->flags = 0;.  
168c0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
168d0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
168e0 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
168f0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
16900 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
16910 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
16920 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
16930 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
16940 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
16950 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16960 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
16970 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
16980 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
16990 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
169a0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
169b0 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
169c0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
169d0 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
169e0 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
169f0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
16a00 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
16a10 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
16a20 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
16a30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
16a40 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16a50 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
16a60 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
16a70 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
16a80 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
16a90 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
16aa0 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
16ab0 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
16ac0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16ad0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
16ae0 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
16af0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
16b00 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
16b10 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
16b20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
16b30 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
16b40 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
16b50 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
16b60 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
16b70 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
16b80 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
16b90 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
16ba0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
16bb0 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
16bc0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
16bd0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
16be0 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
16bf0 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
16c00 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
16c10 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
16c20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
16c30 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
16c40 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
16c50 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
16c60 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
16c70 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
16c80 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
16c90 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
16ca0 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
16cb0 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
16cc0 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
16cd0 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
16ce0 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
16cf0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
16d00 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
16d10 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
16d20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
16d30 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
16d40 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
16d50 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
16d60 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
16d70 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
16d80 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
16d90 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
16da0 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
16db0 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
16dc0 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
16dd0 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
16de0 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
16df0 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
16e00 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
16e10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
16e20 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
16e30 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
16e40 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
16e50 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
16e60 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
16e70 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
16e80 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69  ht key */.){.  i
16e90 6e 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  nt d1;          
16ea0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
16eb0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
16ec0 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
16ed0 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
16ee0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
16ef0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
16f00 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
16f10 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
16f20 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
16f30 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
16f40 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
16f50 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69  i = 0;.  int nFi
16f60 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  eld;.  int rc = 
16f70 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
16f80 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
16f90 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
16fa0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
16fb0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16fc0 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
16fd0 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
16fe0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
16ff0 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
17000 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
17010 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
17020 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
17030 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
17040 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
17050 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
17060 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
17070 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
17080 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  1.zMalloc = 0; )
17090 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
170a0 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
170b0 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
170c0 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
170d0 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
170e0 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
170f0 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
17100 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
17110 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
17120 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
17130 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
17140 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
17150 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
17160 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
17170 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
17180 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
17190 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
171a0 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
171b0 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
171c0 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
171d0 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
171e0 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
171f0 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
17200 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
17210 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
17220 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
17230 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
17240 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
17250 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
17260 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
17270 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
17280 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
17290 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
172a0 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
172b0 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
172c0 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
172d0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
172e0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
172f0 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
17300 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
17310 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
17320 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
17330 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
17340 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
17350 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
17360 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
17370 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
17380 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
17390 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
173a0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
173b0 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
173c0 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
173d0 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
173e0 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
173f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17400 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
17410 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
17420 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
17430 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
17440 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
17450 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
17460 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17470 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
17480 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
17490 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
174a0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
174b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
174c0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
174d0 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
174e0 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
174f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17500 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
17510 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
17520 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
17530 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
17540 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
17550 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
17560 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
17570 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
17580 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
17590 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
175a0 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
175b0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
175c0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
175d0 26 26 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70  && i<nField && p
175e0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
175f0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
17600 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
17610 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f    }.    .      /
17620 2a 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f  * If the PREFIX_
17630 53 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73  SEARCH flag is s
17640 65 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64  et and all field
17650 73 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e  s except the fin
17660 61 6c 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  al.      ** rowi
17670 64 20 66 69 65 6c 64 20 77 65 72 65 20 65 71 75  d field were equ
17680 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74  al, then clear t
17690 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48  he PREFIX_SEARCH
176a0 20 66 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20   flag and set . 
176b0 20 20 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e       ** pPKey2->
176c0 72 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c  rowid to the val
176d0 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ue of the rowid 
176e0 66 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c  field in (pKey1,
176f0 20 6e 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a   nKey1)..      *
17700 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
17710 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
17720 65 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20  e opcode..      
17730 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  */.      if( (pP
17740 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
17750 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
17760 41 52 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b  ARCH) && i==(pPK
17770 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29  ey2->nField-1) )
17780 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17790 28 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26  ( idx1==szHdr1 &
177a0 26 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20  & rc );.        
177b0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61  assert( mem1.fla
177c0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
177d0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
177e0 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b  flags &= ~UNPACK
177f0 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
17800 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79 32  ;.        pPKey2
17810 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75  ->rowid = mem1.u
17820 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
17830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
17850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  .  }..  /* No me
17860 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
17870 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
17880 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
17890 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
178a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
178b0 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
178c0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
178d0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
178e0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
178f0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
17900 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
17910 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
17920 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
17930 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
17940 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
17950 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
17960 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
17970 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
17980 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
17990 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
179a0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
179b0 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  l. If the UNPACK
179c0 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20  ED_INCRKEY.  ** 
179d0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
179e0 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
179f0 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
17a00 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a   as larger..  **
17a10 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
17a20 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
17a30 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
17a40 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
17a50 70 72 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72  prefixes.  ** ar
17a60 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
17a70 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72  be equal.  Other
17a80 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72  wise, the longer
17a90 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a   key is the .  *
17aa0 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74  * larger.  As it
17ab0 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50   happens, the pP
17ac0 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73  Key2 will always
17ad0 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20   be the longer. 
17ae0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20   ** if there is 
17af0 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  a difference..  
17b00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  */.  assert( rc=
17b10 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65  =0 );.  if( pPKe
17b20 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
17b30 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a  CKED_INCRKEY ){.
17b40 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d      rc = -1;.  }
17b50 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
17b60 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
17b70 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29  D_PREFIX_MATCH )
17b80 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72  {.    /* Leave r
17b90 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  c==0 */.  }else 
17ba0 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
17bb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
17bc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17bd0 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  }. ../*.** pCur 
17be0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
17bf0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
17c00 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
17c10 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
17c20 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
17c30 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
17c40 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
17c50 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
17c60 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
17c70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
17c80 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
17c90 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
17ca0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
17cb0 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
17cc0 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
17cd0 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
17ce0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
17cf0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
17d00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
17d10 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
17d20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
17d30 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
17d40 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
17d50 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
17d60 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
17d70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
17d80 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
17d90 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
17da0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
17db0 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
17dc0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
17dd0 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
17de0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
17df0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
17e00 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
17e10 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
17e20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
17e30 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
17e40 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
17e50 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a  METER(db);..  /*
17e60 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
17e70 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
17e80 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
17e90 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
17ea0 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
17eb0 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
17ec0 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
17ed0 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
17ee0 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
17ef0 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
17f00 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
17f10 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
17f20 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
17f30 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
17f40 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
17f50 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
17f60 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
17f70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
17f80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17f90 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
17fa0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
17fb0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
17fc0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
17fd0 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
17fe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17ff0 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
18000 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
18010 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
18020 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
18030 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
18040 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
18050 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
18060 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
18070 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
18080 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
18090 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73   entry */.  mems
180a0 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
180b0 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
180c0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
180d0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69  tree(pCur, 0, (i
180e0 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
180f0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
18100 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
18110 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
18120 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
18130 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
18140 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
18150 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
18160 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
18170 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
18180 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
18190 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
181a0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
181b0 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
181c0 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
181d0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
181e0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
181f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
18200 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
18210 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
18220 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
18230 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
18240 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
18250 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
18260 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
18270 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
18280 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
18290 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
182a0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
182b0 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
182c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
182d0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
182e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
182f0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
18300 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
18310 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18320 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
18330 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18340 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
18350 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18360 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
18370 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
18380 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
18390 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
183a0 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
183b0 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
183c0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
183d0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
183e0 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
183f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
18400 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
18410 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
18420 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
18430 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
18440 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
18450 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
18460 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
18470 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
18480 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
18490 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
184a0 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
184b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
184c0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
184d0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
184e0 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
184f0 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
18500 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
18510 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
18520 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
18530 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
18540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
18550 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
18560 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18570 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
18580 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
18590 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
185a0 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
185b0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
185c0 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
185d0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
185e0 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
185f0 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29  ( m.zMalloc!=0 )
18600 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
18610 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
18620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18630 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
18640 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
18650 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
18660 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
18670 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
18680 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
18690 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
186a0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
186b0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
186c0 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
186d0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
186e0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
186f0 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
18700 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
18710 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
18720 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
18730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
18740 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
18750 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
18760 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
18770 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
18780 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
18790 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
187a0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
187b0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
187c0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
187d0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
187e0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
187f0 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
18800 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
18810 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
18820 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
18830 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
18840 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
18850 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
18860 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
18870 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
18880 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73  pare(.  VdbeCurs
18890 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
188a0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
188b0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
188c0 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
188d0 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
188e0 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ked,  /* Unpacke
188f0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
18900 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
18910 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  nst */.  int *re
18920 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
18930 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18940 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
18950 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
18960 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
18970 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
18980 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
18990 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
189a0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
189b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
189c0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
189d0 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
189e0 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
189f0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
18a00 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
18a10 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
18a20 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
18a30 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
18a40 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
18a50 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
18a60 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
18a70 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
18a80 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
18a90 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
18aa0 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
18ab0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
18ac0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
18ad0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
18ae0 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
18af0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
18b00 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
18b10 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
18b20 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
18b30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18b40 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
18b50 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
18b60 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
18b70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
18b80 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
18b90 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
18ba0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
18bb0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
18bc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
18bd0 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
18be0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
18bf0 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
18c00 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
18c10 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
18c20 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
18c30 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
18c40 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18c50 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18c70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18c80 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
18c90 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
18ca0 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
18cb0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
18cc0 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
18cd0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
18ce0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
18cf0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
18d00 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
18d10 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
18d20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
18d30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18d40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18d50 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
18d60 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
18d70 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
18d80 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
18d90 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
18da0 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
18db0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
18dc0 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
18dd0 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
18de0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
18df0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
18e00 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
18e10 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
18e20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
18e30 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
18e40 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
18e50 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
18e60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18e70 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
18e80 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
18e90 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
18ea0 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
18eb0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
18ec0 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
18ed0 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
18ee0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
18ef0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
18f00 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
18f10 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
18f20 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
18f30 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
18f40 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
18f50 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
18f60 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
18f70 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
18f80 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
18f90 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
18fa0 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
18fb0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
18fc0 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
18fd0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
18fe0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
18ff0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
19000 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
19010 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
19020 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
19030 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
19040 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
19050 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
19060 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
19070 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
19080 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
19090 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
190a0 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
190b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
190c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
190d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
190e0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
190f0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
19100 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
19110 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
19120 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
19130 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
19140 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
19150 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
19160 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
19170 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
19180 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
19190 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
191a0 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
191b0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
191c0 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
191d0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
191e0 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
191f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
19200 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
19210 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
19220 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
19230 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64  3VdbeGetValue(Vd
19240 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
19250 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
19260 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
19270 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
19280 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
19290 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
192a0 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
192b0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
192c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
192d0 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
192e0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
192f0 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
19300 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
19310 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
19320 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
19330 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
19340 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
19350 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
19360 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
19370 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19380 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
19390 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
193a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
193b0 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
193c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
193d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
193e0 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
193f0 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
19400 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
19410 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
19420 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
19430 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
19440 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
19450 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
19460 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
19470 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
19480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19490 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
194a0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
194b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
194c0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
194d0 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
194e0 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
194f0 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
19500 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
19510 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
19520 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a              -1));.  }.}.