/ Hex Artifact Content
Login

Artifact e97565fb2fea822a2e853370c440b493ef09d7e7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f60: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0f70: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0f90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0fa0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0fb0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0fc0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0fd0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0fe0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0ff0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
1000: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1030: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1050: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1060: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1070: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1080: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1090: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
10a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
10c0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
10e0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
10f0: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1100: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1110: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1120: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1130: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1140: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1150: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1160: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1180: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11a0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
11b0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
11c0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
11d0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
11e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1210: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1230: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1240: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1250: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1260: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1270: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1280: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1290: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
12b0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
12c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
12d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
12f0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1310: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1340: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1350: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1360: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1380: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1390: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
13a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
13b0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
13c0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13e0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
13f0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1410: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1420: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1430: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1440: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1460: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1470: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1490: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
14a0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
14b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
14c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
14d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
14e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1500: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1510: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1520: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1540: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1550: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1560: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1570: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1580: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1590: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
15a0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
15b0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
15c0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
15d0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
15e0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
15f0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1600: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1610: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1620: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1630: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1640: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1650: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1660: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1670: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1680: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1690: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
16a0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
16b0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
16c0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
16d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
16e0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
16f0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1700: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1710: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1720: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1730: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1740: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1750: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1760: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1770: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1780: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1790: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
17a0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17c0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
17d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
17e0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
17f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1800: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1810: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1820: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1830: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1840: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1850: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1870: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1880: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
18c0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
18d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
18e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18f0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1900: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1910: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1920: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1930: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1940: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1950: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1960: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1970: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1980: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1990: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
19a0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
19b0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
19c0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
19d0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
19e0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
19f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1a00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1a20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1a30: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1a40: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1a80: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1a90: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1aa0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1ab0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ac0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1ad0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1ae0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1af0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1b00: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1b10: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1b20: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1b30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1b40: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1b60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1b70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1b90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1ba0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1bb0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1bc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1bd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1be0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1bf0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1c00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1c10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1c20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1c30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1c40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1c50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1c70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1c80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1c90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1ca0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1cb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ce0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1cf0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1d00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1d10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1d20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1d30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1d40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1d50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1d60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1d80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1d90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1da0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1db0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1dc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1dd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1de0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1df0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1e00: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1e10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1e20: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1e30: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1e60: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1e70: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1e80: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1e90: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1ea0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1eb0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1ee0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1ef0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1f00: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1f10: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
1f20: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
1f30: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
1f40: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
1f50: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
1f60: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
1f70: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
1f80: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
1f90: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
1fa0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
1fb0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
1fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
1fd0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
1fe0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
1ff0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2000: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2010: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2020: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2030: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2040: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2050: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2060: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2070: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2080: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2090: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
20a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
20b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
20c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
20d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
20e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
20f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2100: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2110: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2120: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2140: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2150: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2170: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2190: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
21a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
21b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
21c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
21d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
21e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
21f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2210: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2220: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2230: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2250: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2270: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2280: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
22b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
22c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
22d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
22f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2300: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2310: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2320: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2330: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2340: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2350: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2380: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2390: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
23c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
23d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
23f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2400: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2410: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2420: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2430: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2440: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2450: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2460: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2470: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2480: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2490: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
24a0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
24b0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
24c0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
24d0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
24e0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
24f0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2500: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2520: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2540: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2550: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2560: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2570: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2580: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2590: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
25a0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
25b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
25c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
25d0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
25e0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
25f0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2600: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2610: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2620: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2630: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2640: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2650: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2660: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2670: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2680: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2690: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
26a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
26b0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
26c0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
26d0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
26e0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
26f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2700: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2710: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2720: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2730: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2740: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2750: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2760: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2770: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2780: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2790: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
27a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
27b0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
27c0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
27d0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
27e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2800: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2810: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2820: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2830: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2840: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2850: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2860: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2870: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2880: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2890: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
28a0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
28b0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
28c0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
28d0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
28e0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
28f0: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2900: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2910: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2920: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2930: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2940: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2950: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2970: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2980: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
29a0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
29b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
29c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
29d0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
29e0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
29f0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2a00: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2a10: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2a20: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2a30: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2a40: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2a50: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2a60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2a70: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2a80: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2a90: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2aa0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ab0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2ac0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ad0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2ae0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2af0: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2b00: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2b10: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2b20: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2b30: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2b40: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2b50: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2b60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2b70: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2b80: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2b90: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2ba0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2bb0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2bc0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2c20: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2c30: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2c40: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2c50: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2c60: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2c70: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2c80: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2c90: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2ca0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2cb0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2cc0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2cd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ce0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2cf0: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d10: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2d20: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2d40: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2d50: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2d60: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2d70: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61   (opcode==OP_Tra
2d80: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d  nsaction && pOp-
2d90: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64  >p2!=0) || opcod
2da0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a  e==OP_Vacuum ){.
2db0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
2dc0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
2dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2de0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
2df0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2e00: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  _VUpdate ){.    
2e10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
2e20: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2e30: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
2e40: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
2e50: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
2e60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2e80: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
2e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
2ea0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
2eb0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
2ec0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
2ee0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2ef0: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
2f00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
2f10: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
2f20: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
2f30: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
2f40: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
2f50: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
2f60: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
2f70: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
2f80: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
2f90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
2fa0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
2fb0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
2fc0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
2fd0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ff0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3000: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3010: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
3020: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3030: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3040: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3050: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3060: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3070: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3080: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3090: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
30a0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
30b0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
30c0: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
30d0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
30e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
30f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
3100: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
3110: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3120: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
3130: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
3140: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3150: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3160: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3170: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3180: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
3190: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
31a0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
31b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
31c0: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
31d0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
31e0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
31f0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
3200: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
3210: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
3220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3230: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
3240: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3250: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3260: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3270: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3280: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3290: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
32a0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
32b0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
32c0: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
32d0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
32e0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
32f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3300: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
3310: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
3320: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
3330: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
3340: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3350: 72 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d  rt( p->aMutex.nM
3360: 75 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  utex==0 );..  re
3370: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3380: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3390: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
33a0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
33b0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
33c0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
33d0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
33e0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
33f0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3400: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
3410: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
3420: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
3430: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3440: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
3450: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
3460: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3470: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3480: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3490: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
34a0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
34b0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
34c0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
34d0: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
34e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
34f0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3500: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
3510: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
3520: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
3530: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
3540: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
3550: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
3560: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3570: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3580: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3590: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
35a0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
35b0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
35c0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
35d0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
35e0: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
35f0: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3600: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
3610: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
3620: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
3630: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3640: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3660: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3680: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3690: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
36a0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
36b0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
36c0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
36d0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
36e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36f0: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3700: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
3710: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
3720: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3740: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3750: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
3760: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3770: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3780: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
37a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
37b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
37c0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
37d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
37e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
37f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3800: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3810: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3820: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3830: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3850: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3860: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3870: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3880: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
38a0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
38b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
38c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
38d0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
38e0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
38f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3900: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3910: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
3920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3930: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3940: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
3950: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3960: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3980: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
3990: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
39a0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
39b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
39c0: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
39d0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
39e0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
39f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
3a00: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3a10: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  nOp>addr ){.    
3a20: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3a30: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3a40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3a50: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3a60: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3a70: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3a80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3a90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3aa0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3ab0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3ac0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3ad0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3ae0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3af0: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3b00: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
3b10: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3b20: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3b30: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
3b40: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
3b50: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
3b60: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
3b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b80: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
3b90: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
3ba0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
3bb0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
3bc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3bd0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
3be0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
3bf0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3c00: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
3c10: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
3c20: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
3c30: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
3c40: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
3c50: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3c60: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
3c70: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3c80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3c90: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3ca0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 64  r){.  assert( ad
3cb0: 64 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  dr>=0 );.  sqlit
3cc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
3cd0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
3ce0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
3cf0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
3d00: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
3d10: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
3d20: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
3d30: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
3d40: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
3d50: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
3d60: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
3d70: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
3d80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
3d90: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
3da0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
3db0: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
3dc0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
3dd0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
3de0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3df0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
3e00: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
3e10: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
3e20: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
3e30: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
3e40: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
3e50: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
3e60: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
3e70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3e80: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
3e90: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
3ea0: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b     assert( db );
3eb0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
3ec0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
3ed0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
3ee0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
3ef0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
3f00: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
3f10: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
3f20: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
3f30: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
3f40: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
3f50: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
3f60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f70: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
3f80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3f90: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
3fa0: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
3fb0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
3fc0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
3fd0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
3fe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3ff0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
4000: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
4010: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
4020: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
4030: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
4040: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4050: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
4060: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
4070: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4080: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4090: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
40a0: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
40b0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
40c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40d0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
40e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4100: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
4110: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4120: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4130: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4150: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4160: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4170: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4180: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
41a0: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
41b0: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
41c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
41d0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
41e0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
41f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4200: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
4210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4220: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4230: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4250: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4260: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4270: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4280: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
4290: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
42a0: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
42b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
42c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
42d0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
42e0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
42f0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
4300: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
4310: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4320: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4330: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4340: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4350: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4360: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4370: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4380: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4390: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
43a0: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
43b0: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
43c0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
43d0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
43e0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
43f0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
4400: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4410: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4420: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4430: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4440: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4450: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4460: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4470: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4480: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4490: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
44a0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
44b0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
44c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
44d0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
44e0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
44f0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
4500: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
4510: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4520: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4530: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4540: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4550: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4560: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4570: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4580: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4590: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
45a0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
45b0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
45c0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
45d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
45e0: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
45f0: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
4600: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4610: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
4620: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
4630: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
4640: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
4650: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
4660: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
4670: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4680: 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65  p->db;.    while
4690: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66  ( N-- ){.      f
46a0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
46b0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
46c0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
46d0: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
46e0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70  Op[0]));.      p
46f0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
4700: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b  Noop;.      pOp+
4710: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
4720: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4730: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
4740: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4750: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4760: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
4770: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
4780: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
4790: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
47a0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
47b0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
47c0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
47d0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
47e0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
47f0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
4800: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
4810: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
4820: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
4830: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
4840: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
4850: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
4860: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
4870: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4880: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4890: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
48a0: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
48b0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
48c0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
48d0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
48e0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
48f0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
4900: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
4910: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
4920: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
4930: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
4940: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
4950: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
4960: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
4970: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
4980: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
4990: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
49a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
49b0: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
49c0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
49d0: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
49e0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
49f0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
4a00: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
4a10: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4a20: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
4a30: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
4a40: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
4a50: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4a60: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
4a70: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
4a80: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
4a90: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
4aa0: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
4ab0: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
4ac0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
4ad0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
4ae0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
4af0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
4b00: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
4b10: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
4b20: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
4b30: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
4b40: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
4b50: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
4b60: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
4b70: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
4b80: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
4b90: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
4ba0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
4bb0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
4bc0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4bd0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
4be0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4c00: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
4c10: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
4c20: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
4c30: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
4c40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
4c50: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
4c60: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
4c70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4c80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4c90: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
4ca0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
4cb0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
4cc0: 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n!=P4_KEYINFO 
4cd0: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  && n!=P4_VTAB ) 
4ce0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
4cf0: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
4d00: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
4d10: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
4d20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
4d30: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
4d40: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
4d50: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
4d60: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
4d70: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
4d80: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
4d90: 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c  r];.  freeP4(db,
4da0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4db0: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
4dc0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28  >p4.p = 0;.  if(
4dd0: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
4de0: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
4df0: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
4e00: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
4e10: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
4e20: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
4e30: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
4e40: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
4e50: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
4e60: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
4e70: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
4e80: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4e90: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
4ea0: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a  e if( zP4==0 ){.
4eb0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
4ec0: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  0;.    pOp->p4ty
4ed0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4ee0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
4ef0: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
4f00: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
4f10: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  nfo;.    int nFi
4f20: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20  eld, nByte;..   
4f30: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49   nField = ((KeyI
4f40: 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c  nfo*)zP4)->nFiel
4f50: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  d;.    nByte = s
4f60: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
4f70: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69   + (nField-1)*si
4f80: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  zeof(pKeyInfo->a
4f90: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c  Coll[0]) + nFiel
4fa0: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  d;.    pKeyInfo 
4fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4fc0: 63 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a  cRaw(0, nByte);.
4fd0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
4fe0: 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
4ff0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66  .    if( pKeyInf
5000: 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  o ){.      u8 *a
5010: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
5020: 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70   memcpy((char*)p
5030: 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42  KeyInfo, zP4, nB
5040: 79 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20  yte - nField);. 
5050: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
5060: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
5070: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
5080: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
5090: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
50a0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
50b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
50c0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
50d0: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
50e0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
50f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
5100: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
5110: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5120: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5130: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  4_KEYINFO;.    }
5140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
5150: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5160: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
5170: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5180: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
5190: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
51a0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
51b0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
51c0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
51d0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
51e0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
51f0: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42  e if( n==P4_VTAB
5200: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5210: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5220: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5230: 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73  = P4_VTAB;.    s
5240: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
5250: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20  VTable *)zP4);. 
5260: 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61     assert( ((VTa
5270: 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d  ble *)zP4)->db==
5280: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65  p->db );.  }else
5290: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
52a0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
52b0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
52c0: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
52d0: 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73  d char)n;.  }els
52e0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
52f0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
5300: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
5310: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
5320: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
5330: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
5340: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5350: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
5360: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
5370: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5380: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
5390: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
53a0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
53b0: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
53c0: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
53d0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
53e0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
53f0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
5400: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
5410: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
5420: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
5430: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
5440: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
5450: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
5460: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5470: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
5480: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5490: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
54a0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
54b0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
54c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
54d0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
54e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
54f0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
5500: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
5510: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
5520: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5530: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5540: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
5550: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
5560: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
5570: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5580: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
5590: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
55a0: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  b, *pz);.    *pz
55b0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
55c0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
55d0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
55e0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
55f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
5600: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
5610: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5620: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5630: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5640: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
5650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5660: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
5670: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5680: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
5690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
56a0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
56b0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
56c0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
56d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
56e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
56f0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
5700: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
5710: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
5720: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5730: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
5740: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5750: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d   *pz);.    *pz =
5760: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5770: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5780: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5790: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
57a0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
57b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
57c0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
57d0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
57e0: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
57f0: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
5800: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
5810: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
5820: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
5830: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
5840: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
5850: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
5860: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
5870: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
5880: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
5890: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
58a0: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
58b0: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
58c0: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
58d0: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
58e0: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
58f0: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
5900: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
5910: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
5920: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
5930: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
5940: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
5950: 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20  .** after a OOM 
5960: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
5970: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
5980: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
5990: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
59a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
59b0: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
59c0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
59d0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
59e0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
59f0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
5a00: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
5a10: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
5a20: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
5a30: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
5a40: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20  Valgrind..**.** 
5a50: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66  About the #ifdef
5a60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5a70: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  CE:  Normally, t
5a80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
5a90: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75  ever called.** u
5aa0: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20  nless p->nOp>0. 
5ab0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
5ac0: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20   in the absense 
5ad0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  of SQLITE_OMIT_T
5ae0: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54  RACE,.** an OP_T
5af0: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  race instruction
5b00: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72   is always inser
5b10: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  ted by sqlite3Vd
5b20: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20  beGet() as soon 
5b30: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45  as.** a new VDBE
5b40: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f   is created.  So
5b50: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
5b60: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e  set addr to p->n
5b70: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20  Op-1 without.** 
5b80: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65  having to double
5b90: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73  -check to make s
5ba0: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73  ure that the res
5bb0: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  ult is non-negat
5bc0: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53  ive. But.** if S
5bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5be0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
5bf0: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69   OP_Trace is omi
5c00: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e  tted and we do n
5c10: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  eed to.** check 
5c20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
5c30: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e  nOp-1 before con
5c40: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65  tinuing..*/.Vdbe
5c50: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
5c60: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
5c70: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
5c80: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
5c90: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
5ca0: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
5cb0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
5cc0: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
5cd0: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
5ce0: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
5cf0: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
5d00: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
5d10: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
5d20: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
5d30: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
5d40: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
5d50: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
5d60: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5d70: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5d80: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5d90: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
5da0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
5db0: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20  if( p->nOp==0 ) 
5dc0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
5dd0: 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20  &dummy;.#endif. 
5de0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5df0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
5e00: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
5e10: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
5e20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5e30: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5e40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
5e60: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
5e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5e80: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
5e90: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  ];.  }.}..#if !d
5ea0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5eb0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
5ec0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
5ed0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
5ee0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
5ef0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
5f00: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
5f10: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
5f20: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
5f30: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
5f40: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
5f50: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
5f60: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
5f70: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
5f80: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
5f90: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
5fa0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
5fb0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
5fc0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
5fd0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
5fe0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
5ff0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
6000: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6010: 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
6020: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  :.    case P4_KE
6030: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6040: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
6050: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
6060: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
6070: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
6080: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6090: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  p, zTemp, "keyin
60a0: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
60b0: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
60c0: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
60d0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20  en30(zTemp);.   
60e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
60f0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
6100: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
6110: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
6120: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
6130: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
6140: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
6150: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
6160: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d  3Strlen30(pColl-
6170: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
6180: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
6190: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
61a0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
61b0: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
61c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
61d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
61e0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
61f0: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ] = ',';.       
6200: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
6210: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70  >aSortOrder && p
6220: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6230: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6240: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6250: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6260: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
6270: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
6280: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
6290: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
62a0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
62b0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
62c0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
62d0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
62e0: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
62f0: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
6300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6310: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6320: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
6330: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
6340: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
6350: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
6360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6370: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
6380: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6390: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
63a0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
63b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
63c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
63d0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
63e0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
63f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6400: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
6410: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
6420: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
6430: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
6440: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6450: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6460: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
6470: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
6480: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6490: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
64a0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
64b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
64c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
64d0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
64e0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
64f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6500: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
6510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6520: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6530: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
6540: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
6550: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6560: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
6570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6580: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6590: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
65a0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
65b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
65c0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
65d0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
65e0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
65f0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
6600: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
6610: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a  MEM_Null)==0 );.
6620: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
6630: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
6640: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
6650: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
6660: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
6670: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
6680: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6690: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
66a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
66b0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
66c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
66d0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
66e0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
66f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6700: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6710: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29  %.16g", pMem->r)
6720: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6730: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6740: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
6750: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
6760: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
6770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6780: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
67a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
67b0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
67c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
67d0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
67e0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
67f0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
6800: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6810: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
6820: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
6830: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
6840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6850: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
6860: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
6870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6880: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6890: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
68a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
68b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
68c0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
68d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
68e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
68f0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
6900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6910: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6920: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
6930: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
6940: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
6950: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
6960: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
6970: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
6980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6990: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
69a0: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
69b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
69c0: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
69d0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
69e0: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
69f0: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
6a00: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
6a10: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 74 6f  statement has to
6a20: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
6a30: 20 77 68 69 63 68 20 42 74 72 65 65 20 6f 62 6a   which Btree obj
6a40: 65 63 74 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ects.** will be 
6a50: 75 73 65 64 20 73 6f 20 74 68 61 74 20 69 74 20  used so that it 
6a60: 63 61 6e 20 61 63 71 75 69 72 65 20 6d 75 74 65  can acquire mute
6a70: 78 65 73 20 6f 6e 20 74 68 65 6d 20 61 6c 6c 20  xes on them all 
6a80: 69 6e 20 73 6f 72 74 65 64 0a 2a 2a 20 6f 72 64  in sorted.** ord
6a90: 65 72 20 28 76 69 61 20 73 71 6c 69 74 65 33 56  er (via sqlite3V
6aa0: 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  dbeMutexArrayEnt
6ab0: 65 72 28 29 2e 20 20 4d 75 74 65 78 65 73 20 61  er().  Mutexes a
6ac0: 72 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 69  re acquired.** i
6ad0: 6e 20 6f 72 64 65 72 20 28 61 6e 64 20 72 65 6c  n order (and rel
6ae0: 65 61 73 65 64 20 69 6e 20 72 65 76 65 72 73 65  eased in reverse
6af0: 20 6f 72 64 65 72 29 20 74 6f 20 61 76 6f 69 64   order) to avoid
6b00: 20 64 65 61 64 6c 6f 63 6b 73 2e 0a 2a 2f 0a 76   deadlocks..*/.v
6b10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
6b20: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
6b30: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 74 41 74 74  , int i){.  tAtt
6b40: 61 63 68 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20  achMask mask;.  
6b50: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
6b60: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
6b70: 69 3c 73 69 7a 65 6f 66 28 74 41 74 74 61 63 68  i<sizeof(tAttach
6b80: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
6b90: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
6ba0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
6bb0: 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 28  *8 );.  mask = (
6bc0: 28 75 33 32 29 31 29 3c 3c 69 3b 0a 20 20 69 66  (u32)1)<<i;.  if
6bd0: 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
6be0: 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
6bf0: 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c    p->btreeMask |
6c00: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69  = mask;.    sqli
6c10: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
6c20: 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75  ayInsert(&p->aMu
6c30: 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b  tex, p->db->aDb[
6c40: 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  i].pBt);.  }.}..
6c50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
6c60: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
6c70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
6c80: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
6c90: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
6ca0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
6cb0: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
6cc0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
6cd0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
6ce0: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
6cf0: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
6d00: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b  p){.  char *zP4;
6d10: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
6d20: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
6d30: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
6d40: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
6d50: 20 25 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e   %4d %4d %-4s %.
6d60: 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  2X %s\n";.  if( 
6d70: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
6d80: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d   stdout;.  zP4 =
6d90: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
6da0: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
6db0: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
6dc0: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
6dd0: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
6de0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
6df0: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
6e00: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
6e10: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
6e20: 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5,.#ifdef SQLITE
6e30: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70  _DEBUG.      pOp
6e40: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70  ->zComment ? pOp
6e50: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a  ->zComment : "".
6e60: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23  #else.      "".#
6e70: 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c  endif.  );.  ffl
6e80: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
6e90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
6ea0: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
6eb0: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
6ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
6ed0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
6ee0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
6ef0: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
6f00: 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20   Mem *pEnd;.    
6f10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
6f20: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
6f30: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
6f40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
6f50: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
6f60: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
6f70: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
6f80: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
6f90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
6fa0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
6fb0: 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oc);.      }.   
6fc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
6fd0: 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70  .    for(pEnd=&p
6fe0: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
6ff0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
7000: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
7010: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
7020: 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  db );..      /* 
7030: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
7040: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
7050: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
7060: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
7070: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
7080: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
7090: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
70a0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
70b0: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
70c0: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
70d0: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
70e0: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
70f0: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
7100: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
7110: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
7120: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
7130: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
7140: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
7150: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
7160: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
7170: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
7180: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
7190: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
71a0: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
71b0: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
71c0: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
71d0: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
71e0: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
71f0: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
7200: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
7210: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
7220: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
7230: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
7240: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
7250: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
7260: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
7270: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
7280: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
7290: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
72a0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
72b0: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
72c0: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
72d0: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
72e0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
72f0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
7300: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
7310: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
7320: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
7330: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
7340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
7350: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
7360: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
7370: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
7380: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7390: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
73a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d  );.        p->zM
73b0: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
73c0: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
73d0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
73e0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
73f0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
7400: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
7410: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
7420: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7430: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
7440: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
7450: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
7460: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
7470: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
7480: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
7490: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
74a0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
74b0: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
74c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
74d0: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
74e0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
74f0: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7500: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7510: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7520: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7530: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
7540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
7550: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7560: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
7570: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7580: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
7590: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
75a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
75b0: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
75c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
75d0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
75e0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
75f0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
7600: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7610: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
7620: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
7630: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
7640: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
7650: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
7660: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
7670: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
7680: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
7690: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
76a0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
76b0: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
76c0: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
76d0: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
76e0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
76f0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
7700: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
7710: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
7720: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
7730: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
7740: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
7750: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
7760: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
7770: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
7780: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
7790: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
77a0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
77b0: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
77c0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
77d0: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
77e0: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
77f0: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
7800: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
7810: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
7820: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
7830: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7840: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
7870: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
78a0: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
78b0: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
78c0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
78d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
78e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
78f0: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
7900: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
7910: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
7920: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
7930: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
7940: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
7950: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
7980: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
7990: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
79a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
79b0: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
79c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
79d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
79e0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7a10: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
7a20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7a30: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
7a40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7a50: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
7a60: 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74  Mem = p->pResult
7a70: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
7a80: 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d  ];  /* First Mem
7a90: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
7aa0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
7ab0: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
7ac0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
7ad0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
7ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
7af0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
7b00: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
7b10: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
7b20: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
7b30: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
7b40: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
7b50: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
7b60: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
7b70: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
7b80: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
7b90: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
7ba0: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
7bb0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
7bc0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
7bd0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
7be0: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
7bf0: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
7c00: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
7c10: 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20 69 66 28 20  Mem, 8);..  if( 
7c20: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
7c30: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
7c40: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
7c50: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
7c60: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
7c70: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
7c80: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
7c90: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
7ca0: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
7cb0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
7cc0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
7cd0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
7ce0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
7cf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
7d00: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
7d10: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
7d20: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
7d30: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
7d40: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
7d50: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
7d60: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
7d70: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
7d80: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
7d90: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
7da0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
7db0: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
7dc0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
7dd0: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
7de0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
7df0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
7e00: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
7e10: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
7e20: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
7e30: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
7e40: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
7e50: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
7e60: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
7e70: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
7e80: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
7e90: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
7ea0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
7eb0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
7ec0: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
7ed0: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
7ee0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
7ef0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
7f00: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
7f10: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
7f20: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
7f30: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
7f40: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
7f50: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
7f60: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
7f70: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
7f80: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
7f90: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
7fa0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
7fb0: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
7fc0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
7fd0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
7fe0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
7ff0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
8000: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8010: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
8020: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
8030: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
8040: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
8050: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
8060: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
8070: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
8080: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
8090: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
80a0: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
80b0: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
80c0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
80d0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
80e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
80f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
8100: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
8110: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
8120: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
8130: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
8140: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
8150: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
8160: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
8170: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
8180: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
8190: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
81a0: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
81b0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
81c0: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
81d0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
81e0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
81f0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
8200: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8210: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
8220: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
8230: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
8240: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
8250: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
8260: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8270: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
8280: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
8290: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
82a0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
82b0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
82c0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
82d0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
82e0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
82f0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
8300: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
8310: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
8320: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
8330: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
8340: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
8350: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
8360: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
8370: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
8380: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
8390: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
83a0: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
83b0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
83c0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
83d0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
83e0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
83f0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
8400: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
8410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8420: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8430: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8440: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8450: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8460: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8470: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
8480: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
84b0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
84c0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
84d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
84e0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
84f0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8500: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
8510: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
8520: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8530: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
8540: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8550: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8560: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8570: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8580: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
8590: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
85a0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
85b0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
85c0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
85d0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
85e0: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
85f0: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
8600: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
8610: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
8620: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
8630: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
8640: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
8650: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
8660: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
8670: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
8680: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
8690: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
86a0: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
86b0: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
86c0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
86d0: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
86e0: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
86f0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
8700: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
8710: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
8720: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
8730: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
8740: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
8750: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
8760: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
8770: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
8780: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
8790: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
87a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
87b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
87c0: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
87d0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
87e0: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
87f0: 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20  te, 1) ){.      
8800: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
8810: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
8820: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
8830: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
8840: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
8850: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
8860: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
8870: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
8880: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
8890: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
88a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
88b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
88c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
88d0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
88e0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
8910: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8920: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8930: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
8940: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8950: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
8960: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
8970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
8990: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
89a0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
89b0: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
89c0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
89d0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
89e0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
89f0: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a10: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P3 */.    pMem
8a20: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8a30: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
8a40: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
8a50: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
8a60: 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b  (pMem, 32, 0) ){
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8a80: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
8a90: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
8aa0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
8ab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8ac0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
8ad0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8ae0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
8af0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
8b00: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
8b10: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
8b20: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
8b30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8b40: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
8b50: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
8b60: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
8b70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
8b80: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8b90: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8ba0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8bb0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
8bc0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
8bd0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
8be0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
8bf0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
8c00: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
8c10: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
8c20: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
8c30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
8c40: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
8c50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8c60: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
8c70: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
8c80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8c90: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
8ca0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8cb0: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
8cc0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
8cd0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
8ce0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8cf0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
8d00: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
8d10: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
8d20: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8d30: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
8d40: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
8d50: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
8d60: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
8d70: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8d80: 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  G.      if( pOp-
8d90: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
8da0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
8db0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
8dc0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
8dd0: 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d  m->z = pOp->zCom
8de0: 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  ment;.        pM
8df0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
8e00: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
8e10: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
8e20: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
8e30: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  8;.        pMem-
8e40: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
8e50: 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  EXT;.      }else
8e60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
8e70: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
8e80: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
8eb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   */.        pMem
8ec0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8ed0: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
8ee0: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
8ef0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
8f00: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
8f10: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
8f20: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
8f30: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
8f40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
8f50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8f60: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
8f70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8f80: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
8f90: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
8fa0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
8fb0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
8fc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8fd0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
8fe0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
8ff0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
9000: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
9010: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
9020: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
9030: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
9040: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
9050: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
9060: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
9070: 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
9080: 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  z;.    while( sq
9090: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
90a0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
90b0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
90c0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
90d0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
90e0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
90f0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
9100: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
9110: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
9120: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
9130: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
9140: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
9150: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
9160: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
9170: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
9180: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
9190: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
91a0: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
91b0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
91c0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
91d0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
91e0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
91f0: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
9200: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
9210: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
9220: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
9230: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
9250: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
9260: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
9270: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
9280: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
9290: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
92a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
92b0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
92c0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
92d0: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
92e0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
92f0: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
9300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9310: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
9320: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
9330: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
9340: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
9350: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
9360: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
9370: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9380: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
9390: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
93a0: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
93b0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
93c0: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
93d0: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
93e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
93f0: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
9400: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
9410: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
9420: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
9430: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
9440: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
9450: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
9460: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
9470: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
9480: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
9490: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
94a0: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
94b0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
94c0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
94d0: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
94e0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
94f0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
9500: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
9510: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
9520: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
9530: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
9540: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
9550: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
9560: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
9570: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
9580: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
9590: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
95a0: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
95b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
95c0: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
95d0: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
95e0: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
95f0: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
9600: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
9610: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
9620: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
9630: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
9640: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
9650: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
9660: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
9670: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
9680: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
9690: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
96a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
96b0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
96c0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
96d0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
96e0: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
96f0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
9700: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
9710: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
9720: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
9730: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
9740: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
9750: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
9760: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
9770: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
9780: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
9790: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
97a0: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
97b0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
97c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
97d0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
97e0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
97f0: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
9800: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
9810: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
9820: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
9830: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
9840: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
9850: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
9860: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
9870: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
9880: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
9890: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
98a0: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
98b0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
98c0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
98d0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
98e0: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
98f0: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
9900: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
9910: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
9920: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
9930: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
9940: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
9950: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
9960: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
9970: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
9980: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
9990: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
99a0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
99b0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
99c0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
99d0: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
99e0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
99f0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
9a00: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
9a10: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
9a20: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
9a30: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
9a40: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
9a50: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
9a60: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
9a70: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
9a80: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
9a90: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
9aa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
9ab0: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
9ac0: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
9ad0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
9ae0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
9af0: 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _RUN..**.** This
9b00: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
9b10: 20 63 61 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61   called more tha
9b20: 6e 20 6f 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67  n once on a sing
9b30: 6c 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  le virtual machi
9b40: 6e 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ne..** The first
9b50: 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 20 77 68   call is made wh
9b60: 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  ile compiling th
9b70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
9b80: 20 53 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63   Subsequent.** c
9b90: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 20 61 73  alls are made as
9ba0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f   part of the pro
9bb0: 63 65 73 73 20 6f 66 20 72 65 73 65 74 74 69 6e  cess of resettin
9bc0: 67 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  g a statement to
9bd0: 20 62 65 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74   be.** re-execut
9be0: 65 64 20 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20  ed (from a call 
9bf0: 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  to sqlite3_reset
9c00: 28 29 29 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e  ()). The nVar, n
9c10: 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a  Mem, nCursor .**
9c20: 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 70   and isExplain p
9c30: 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6f 6e  arameters are on
9c40: 6c 79 20 70 61 73 73 65 64 20 63 6f 72 72 65 63  ly passed correc
9c50: 74 20 76 61 6c 75 65 73 20 74 68 65 20 66 69 72  t values the fir
9c60: 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66  st time.** the f
9c70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
9c80: 64 2e 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74  d. On subsequent
9c90: 20 63 61 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c   calls, from sql
9ca0: 69 74 65 33 5f 72 65 73 65 74 28 29 2c 20 6e 56  ite3_reset(), nV
9cb0: 61 72 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  ar.** is passed 
9cc0: 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75  -1 and nMem, nCu
9cd0: 72 73 6f 72 20 61 6e 64 20 69 73 45 78 70 6c 61  rsor and isExpla
9ce0: 69 6e 20 61 72 65 20 61 6c 6c 20 70 61 73 73 65  in are all passe
9cf0: 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  d zero..*/.void 
9d00: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
9d10: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
9d40: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  BE */.  int nVar
9d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9d60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9d70: 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74   of '?' see in t
9d80: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
9d90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20   */.  int nMem, 
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9dc0: 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
9dd0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
9de0: 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20  int nCursor,    
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
9e10: 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ors to allocate 
9e20: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
9e50: 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 69 6e  umber of args in
9e60: 20 53 75 62 50 72 6f 67 72 61 6d 73 20 2a 2f 0a   SubPrograms */.
9e70: 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 2c    int isExplain,
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
9ea0: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73  EXPLAIN keywords
9eb0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
9ec0: 20 69 6e 74 20 75 73 65 73 53 74 6d 74 4a 6f 75   int usesStmtJou
9ed0: 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20 20  rnal            
9ee0: 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 56  /* True to set V
9ef0: 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72  dbe.usesStmtJour
9f00: 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nal */.){.  int 
9f10: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
9f20: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73   = p->db;..  ass
9f30: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
9f40: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9f50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
9f60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
9f70: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
9f80: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
9f90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9fa0: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
9fb0: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
9fc0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
9fd0: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
9fe0: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
9ff0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
a000: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20  AGIC_RUN;..  /* 
a010: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
a020: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
a030: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
a040: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
a050: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
a060: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
a070: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
a080: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
a090: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
a0a0: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
a0b0: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
a0c0: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
a0d0: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
a0e0: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
a0f0: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
a100: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
a110: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
a120: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
a130: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
a140: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
a150: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
a160: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
a170: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
a180: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
a190: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
a1a0: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
a1b0: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
a1c0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
a1d0: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
a1e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
a1f0: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
a200: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
a210: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
a220: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
a230: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
a240: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
a250: 67 75 6d 65 6e 74 73 20 69 6e 2e 20 54 68 69 73  guments in. This
a260: 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 74 68   is only done th
a270: 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 69 6d  e.  ** first tim
a280: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
a290: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  is called for a 
a2a0: 67 69 76 65 6e 20 56 44 42 45 2c 20 6e 6f 74 20  given VDBE, not 
a2b0: 77 68 65 6e 20 69 74 20 69 73 0a 20 20 2a 2a 20  when it is.  ** 
a2c0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
a2d0: 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  m sqlite3_reset(
a2e0: 29 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 76  ) to reset the v
a2f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
a300: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56 61 72 3e    */.  if( nVar>
a310: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 64 62 2d  =0 && ALWAYS(db-
a320: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
a330: 29 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 73  ) ){.    u8 *zCs
a340: 72 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f  r = (u8 *)&p->aO
a350: 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20  p[p->nOp];      
a360: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69   /* Memory avali
a370: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 61 74 69  able for alloati
a380: 6f 6e 20 2a 2f 0a 20 20 20 20 75 38 20 2a 7a 45  on */.    u8 *zE
a390: 6e 64 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61  nd = (u8 *)&p->a
a3a0: 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  Op[p->nOpAlloc];
a3b0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
a3c0: 70 61 73 74 20 61 76 61 69 6c 61 62 6c 65 20 6d  past available m
a3d0: 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  em */.    int nB
a3e0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
a410: 74 72 61 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65  tra memory neede
a420: 64 20 2a 2f 0a 0a 20 20 20 20 72 65 73 6f 6c 76  d */..    resolv
a430: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
a440: 72 67 29 3b 0a 20 20 20 20 70 2d 3e 75 73 65 73  rg);.    p->uses
a450: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
a460: 38 29 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  8)usesStmtJourna
a470: 6c 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78 70  l;.    if( isExp
a480: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
a490: 29 7b 0a 20 20 20 20 20 20 6e 4d 65 6d 20 3d 20  ){.      nMem = 
a4a0: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  10;.    }.    me
a4b0: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
a4c0: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 20 20 7a 43  nd-zCsr);.    zC
a4d0: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
a4e0: 38 2a 29 30 29 26 37 3b 0a 20 20 20 20 61 73 73  8*)0)&7;.    ass
a4f0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
a500: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
a510: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 65 6d 6f 72  );..    /* Memor
a520: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
a530: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
a540: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
a550: 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20  ocated in two.  
a560: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
a570: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
a580: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
a590: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
a5a0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 65 6e 64   the .    ** end
a5b0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
a5c0: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
a5d0: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
a5e0: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
a5f0: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
a600: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
a610: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
a620: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
a630: 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 61 73 73 20  ond.    ** pass 
a640: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
a650: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
a660: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
a670: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
a680: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
a690: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
a6a0: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
a6b0: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
a6c0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  om.    ** the le
a6d0: 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20  ftover space at 
a6e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
a6f0: 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20  pcode array can 
a700: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
a710: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
a720: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
a730: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
a740: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
a750: 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
a760: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a       nByte = 0;.
a770: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20        p->aMem = 
a780: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
a790: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
a7a0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
a7b0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a7c0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
a7d0: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
a7e0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
a7f0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
a800: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d  nByte);.      p-
a810: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
a820: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
a830: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
a840: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a850: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
a860: 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  azVar = allocSpa
a870: 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  ce(p->azVar, nVa
a880: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
a890: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a8a0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
a8b0: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
a8c0: 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  ce(p->apCsr, nCu
a8d0: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
a8e0: 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20  Cursor*),.      
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e        &zCsr, zEn
a910: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a920: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
a930: 20 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20         p->pFree 
a940: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a950: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
a960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a970: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b  zCsr = p->pFree;
a980: 0a 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a  .      zEnd = &z
a990: 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 20 20  Csr[nByte];.    
a9a0: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
a9b0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
a9c0: 65 64 20 29 3b 0a 0a 20 20 20 20 70 2d 3e 6e 43  ed );..    p->nC
a9d0: 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75  ursor = (u16)nCu
a9e0: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rsor;.    if( p-
a9f0: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70  >aVar ){.      p
aa00: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
aa10: 6e 56 61 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  nVar;.      for(
aa20: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
aa30: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  ){.        p->aV
aa40: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
aa50: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
aa60: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20  p->aVar[n].db = 
aa70: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
aa80: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65  }.    if( p->aMe
aa90: 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  m ){.      p->aM
aaa0: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
aab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
aac0: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
aad0: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  ..nMem */.      
aae0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
ab10: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
ab20: 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c       for(n=1; n<
ab30: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
ab40: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
ab50: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
ab60: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  ;.        p->aMe
ab70: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
ab80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ab90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
aba0: 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  BUG.  for(n=1; n
abb0: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
abc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
abd0: 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b  Mem[n].db==db );
abe0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
abf0: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
ac00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ac10: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
ac20: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
ac30: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
ac40: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
ac50: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
ac60: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
ac70: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
ac80: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
ac90: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
aca0: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
acb0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
acc0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
acd0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
ace0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
acf0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ad00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
ad10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i++){.      p->a
ad20: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
ad30: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
ad40: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d  ycles = 0;.    }
ad50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
ad60: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
ad70: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
ad80: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
ad90: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
ada0: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
adb0: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
adc0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
add0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
ade0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
adf0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
ae00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
ae10: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
ae20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
ae30: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
ae40: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
ae50: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
ae60: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
ae70: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
ae80: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
ae90: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
aea0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
aeb0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
aec0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
aed0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
aee0: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
aef0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
af00: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
af10: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
af20: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
af30: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
af40: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
af50: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
af60: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
af70: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
af80: 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64  dule = pCx->pMod
af90: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
afa0: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
afb0: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
afc0: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
afd0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
afe0: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
aff0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  dif.}../*.** Cop
b000: 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
b010: 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
b020: 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
b030: 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
b040: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
b050: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
b060: 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
b070: 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
b080: 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
b090: 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
b0a0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
b0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
b0c0: 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
b0d0: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
b0e0: 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
b0f0: 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  >v;.  v->aOp = p
b100: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
b110: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
b120: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
b130: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
b140: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
b150: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
b160: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
b170: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
b180: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
b190: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
b1a0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
b1b0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
b1c0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
b1d0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65  e->nChange;.  re
b1e0: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
b1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
b200: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
b210: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
b220: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
b230: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
b240: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
b250: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
b260: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
b270: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
b280: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
b290: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
b2a0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
b2b0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
b2c0: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
b2d0: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
b2e0: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
b2f0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
b300: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
b310: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
b320: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
b330: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
b340: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
b350: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
b360: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
b370: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
b380: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
b390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b3a0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
b3b0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
b3c0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
b3d0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
b3e0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
b3f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
b400: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
b410: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
b420: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
b430: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
b440: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
b450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b460: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
b470: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
b480: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
b490: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b4a0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
b4b0: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
b4c0: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
b4d0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
b4e0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
b4f0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
b500: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
b510: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
b520: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
b530: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
b540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
b550: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
b560: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
b570: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
b580: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
b590: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b5a0: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
b5b0: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
b5c0: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
b5d0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
b5e0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
b5f0: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
b600: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
b610: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
b620: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
b630: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
b640: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
b650: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
b660: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
b670: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b680: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
b690: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
b6a0: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
b6b0: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
b6c0: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
b6d0: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
b6e0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b6f0: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
b700: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   */.  int i;.  f
b710: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
b720: 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
b730: 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c  t( p->apCsr==0 |
b740: 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  | p->apCsr[i]==0
b750: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
b760: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  <=p->nMem; i++) 
b770: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d  assert( p->aMem=
b780: 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d  =0 || p->aMem[i]
b790: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c  .flags==MEM_Null
b7a0: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   );.#endif..  sq
b7b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b7c0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
b7d0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
b7e0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
b7f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
b800: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b810: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
b820: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
b830: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
b840: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
b850: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
b860: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
b870: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
b880: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
b890: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
b8a0: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
b8b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
b8c0: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
b8d0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
b8e0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
b8f0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
b900: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b910: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
b920: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
b930: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
b940: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
b950: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b960: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
b970: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
b980: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
b990: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
b9a0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
b9b0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
b9c0: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
b9d0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
b9e0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
b9f0: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
ba00: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
ba10: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
ba20: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
ba30: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
ba40: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
ba50: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
ba60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
ba70: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
ba80: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
ba90: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
baa0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
bab0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
bac0: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
bad0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
bae0: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
baf0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
bb00: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
bb10: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
bb20: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
bb30: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
bb40: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
bb50: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
bb60: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
bb70: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
bb80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
bb90: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
bba0: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
bbb0: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
bbc0: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
bbd0: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
bbe0: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
bbf0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
bc00: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
bc10: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
bc20: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
bc30: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
bc40: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
bc50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
bc60: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
bc70: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
bc80: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
bc90: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
bca0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bcc0: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
bcd0: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
bce0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd00: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
bd10: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
bd20: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
bd50: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
bd60: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
bd70: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd90: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
bda0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
bdb0: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
bdc0: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
bdd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
bde0: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
bdf0: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
be00: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
be10: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
be20: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
be30: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
be40: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
be50: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
be60: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
be70: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
be80: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
be90: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
bea0: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
beb0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
bec0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
bed0: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
bee0: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
bef0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
bf00: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
bf10: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
bf20: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
bf30: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
bf40: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
bf50: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
bf60: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
bf70: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
bf80: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
bf90: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
bfa0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
bfb0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
bfc0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
bfd0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
bfe0: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
bff0: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
c000: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
c010: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
c020: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
c030: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
c040: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
c050: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
c060: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
c070: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
c080: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
c090: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
c0a0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
c0b0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
c0c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
c0d0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
c0e0: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
c0f0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
c100: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
c110: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
c120: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
c130: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c140: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
c150: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
c160: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c170: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
c180: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
c190: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
c1a0: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
c1b0: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
c1c0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
c1d0: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
c1e0: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
c1f0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
c200: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
c210: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
c220: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
c230: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
c240: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
c250: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
c260: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
c270: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
c280: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
c290: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
c2a0: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
c2b0: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
c2c0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
c2d0: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
c2e0: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
c2f0: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
c300: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
c310: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
c320: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
c330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
c340: 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45  bSync(db, &p->zE
c350: 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  rrMsg);..  /* Th
c360: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
c370: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
c380: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
c390: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
c3a0: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
c3b0: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
c3c0: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
c3d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
c3e0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
c3f0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
c400: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
c410: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
c420: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
c430: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
c440: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
c450: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
c460: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
c470: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
c480: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
c490: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
c4a0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
c4b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c4c0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
c4d0: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
c4e0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
c4f0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
c500: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
c510: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
c520: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
c530: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
c540: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
c550: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
c560: 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
c570: 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  k(sqlite3BtreePa
c580: 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  ger(pBt));.    }
c590: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
c5a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c5b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
c5c0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
c5d0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
c5e0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
c5f0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
c600: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
c610: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
c620: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
c630: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
c640: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
c650: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
c660: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
c670: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c680: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c690: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
c6a0: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
c6b0: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
c6c0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
c6d0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
c6e0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
c6f0: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
c700: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
c710: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
c720: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
c730: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
c740: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
c750: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
c760: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
c770: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
c780: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
c790: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
c7a0: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
c7b0: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
c7c0: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
c7d0: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
c7e0: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
c7f0: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
c800: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
c810: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
c820: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
c830: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
c840: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
c850: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
c860: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
c870: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
c880: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
c890: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
c8a0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
c8b0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
c8c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
c8d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
c8e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
c8f0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
c900: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
c910: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
c920: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
c930: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
c940: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
c950: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
c960: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
c970: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
c980: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
c990: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
c9a0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
c9b0: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
c9c0: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
c9d0: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
c9e0: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
c9f0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
ca00: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
ca10: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
ca20: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
ca30: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
ca40: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
ca50: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
ca60: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
ca70: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
ca80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ca90: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
caa0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
cab0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
cac0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
cad0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
cae0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
caf0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
cb00: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
cb10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
cb20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cb30: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
cb40: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
cb50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
cb60: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
cb70: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
cb80: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
cb90: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
cba0: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
cbb0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
cbc0: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
cbd0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
cbe0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
cbf0: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
cc00: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
cc10: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
cc20: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
cc30: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
cc40: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
cc50: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
cc60: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
cc70: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
cc80: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
cc90: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
cca0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
ccb0: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
ccc0: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
ccd0: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
cce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
ccf0: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
cd00: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
cd10: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
cd20: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
cd30: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
cd40: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
cd50: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
cd60: 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
cd70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
cd80: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
cd90: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
cda0: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
cdb0: 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
cdc0: 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20  ;.      zMaster 
cdd0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
cde0: 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22  (db, "%s-mj%08X"
cdf0: 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61  , zMainFile, iRa
ce00: 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29  ndom&0x7fffffff)
ce10: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
ce20: 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ster ){.        
ce30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ce40: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
ce50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ce60: 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
ce70: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
ce80: 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
ce90: 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
cea0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ceb0: 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
cec0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ced0: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
cee0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cef0: 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
cf00: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
cf10: 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
cf20: 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
cf30: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
cf40: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
cf50: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
cf60: 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
cf70: 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
cf80: 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
cf90: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
cfa0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
cfb0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cfc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
cfd0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
cfe0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
cff0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d000: 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
d010: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
d020: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
d030: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
d040: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
d050: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
d060: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
d070: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
d080: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
d090: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
d0a0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
d0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
d0c0: 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
d0d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
d0e0: 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
d0f0: 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
d100: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
d110: 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
d120: 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
d130: 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
d140: 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
d150: 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
d160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
d170: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d180: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d190: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d1a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d1b0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
d1c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
d1d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
d1e0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
d1f0: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
d200: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
d210: 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
d220: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
d230: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
d240: 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
d250: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
d260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
d270: 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
d280: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d290: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
d2a0: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
d2b0: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
d2c0: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
d2d0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
d2e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d2f0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
d300: 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
d310: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
d320: 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
d330: 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
d340: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d350: 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
d360: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d370: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d380: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
d390: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
d3a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d3b0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
d3c0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
d3d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
d3e0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
d3f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
d400: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
d410: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
d420: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
d430: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d440: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
d450: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
d460: 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
d470: 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
d480: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
d490: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
d4a0: 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30  dSync .     && 0
d4b0: 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
d4c0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
d4d0: 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
d4e0: 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
d4f0: 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
d500: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d510: 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
d520: 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
d530: 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
d540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
d550: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
d560: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d570: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
d580: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
d590: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d5a0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
d5b0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d5c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
d5d0: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
d5e0: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
d5f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
d600: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
d610: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
d620: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
d630: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
d640: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
d650: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
d660: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
d670: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
d680: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d690: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
d6a0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
d6b0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
d6c0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
d6d0: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
d6e0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d6f0: 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
d700: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
d710: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
d720: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d730: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
d740: 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
d750: 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
d760: 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
d770: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d780: 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
d790: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
d7a0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
d7b0: 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
d7c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
d7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
d7e0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
d7f0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
d800: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
d810: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
d820: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
d830: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
d840: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d850: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
d860: 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
d870: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d880: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
d890: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
d8a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
d8b0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
d8c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d8d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
d8e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d8f0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
d900: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d910: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
d920: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d930: 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
d940: 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
d950: 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
d960: 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
d970: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
d980: 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
d990: 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
d9a0: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
d9b0: 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
d9c0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
d9d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d9e0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
d9f0: 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
da00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
da10: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
da20: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
da30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
da40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
da50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
da60: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
da70: 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
da80: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
da90: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
daa0: 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
dab0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
dac0: 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
dad0: 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
dae0: 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
daf0: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
db00: 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
db10: 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
db20: 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
db30: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
db40: 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
db50: 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
db60: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
db70: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
db80: 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
db90: 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
dba0: 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
dbb0: 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
dbc0: 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
dbd0: 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
dbe0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
dbf0: 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
dc00: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
dc10: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
dc20: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
dc30: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
dc40: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
dc50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
dc60: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
dc70: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
dc80: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
dc90: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
dca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
dcb0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
dcc0: 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
dcd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
dce0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
dcf0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
dd00: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
dd10: 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
dd20: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
dd30: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
dd40: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
dd50: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
dd60: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
dd70: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63  t the sqlite3.ac
dd80: 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e  tiveVdbeCnt coun
dd90: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
dda0: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
ddb0: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
ddc0: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
ddd0: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
dde0: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
ddf0: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
de00: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
de10: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
de20: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
de30: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
de40: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
de50: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
de60: 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
de70: 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
de80: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
de90: 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
dea0: 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
deb0: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
dec0: 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
ded0: 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
dee0: 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
def0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
df00: 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b   int nWrite = 0;
df10: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
df20: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
df30: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
df40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
df50: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
df60: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
df70: 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e     if( p->readOn
df80: 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b  ly==0 ) nWrite++
df90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
dfa0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
dfb0: 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
dfc0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
dfd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69  ;.  assert( nWri
dfe0: 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62  te==db->writeVdb
dff0: 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  eCnt );.}.#else.
e000: 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
e010: 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
e020: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ndif../*.** For 
e030: 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74  every Btree that
e040: 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e   in database con
e050: 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68  nection db which
e060: 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f   .** has been mo
e070: 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f  dified, "trip" o
e080: 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63  r invalidate eac
e090: 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74  h cursor in.** t
e0a0: 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20  hat Btree might 
e0b0: 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
e0c0: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ed so that the c
e0d0: 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76  ursor.** can nev
e0e0: 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  er be used again
e0f0: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  .  This happens 
e100: 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  when a rollback.
e110: 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20  *** occurs.  We 
e120: 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c  have to trip all
e130: 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f   the other curso
e140: 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73  rs, even.** curs
e150: 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d  or from other VM
e160: 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64  s in different d
e170: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e180: 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ons,.** so that 
e190: 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79  none of them try
e1a0: 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61   to use the data
e1b0: 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a   at which they.*
e1c0: 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20  * were pointing 
e1d0: 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61  and which now ma
e1e0: 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e  y have been chan
e1f0: 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68  ged due.** to th
e200: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
e210: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20  * Remember that 
e220: 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64  a rollback can d
e230: 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d  elete tables com
e240: 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f  plete and.** reo
e250: 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20  rder rootpages. 
e260: 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   So it is not su
e270: 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f  fficient just to
e280: 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61   save.** the sta
e290: 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
e2a0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
e2b0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72  validate the cur
e2c0: 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  sor.** so that i
e2d0: 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  t is never used 
e2e0: 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  again..*/.static
e2f0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
e300: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
e310: 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20  dBtrees(sqlite3 
e320: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
e330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
e340: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
e350: 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44  tree *p = db->aD
e360: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
e370: 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74  ( p && sqlite3Bt
e380: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
e390: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e3a0: 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
e3b0: 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42  ors(p, SQLITE_AB
e3c0: 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ORT);.    }.  }.
e3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
e3e0: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
e3f0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
e400: 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
e410: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
e420: 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
e430: 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
e440: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
e450: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
e460: 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
e470: 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
e480: 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
e490: 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
e4a0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
e4b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
e4c0: 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
e4d0: 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
e4e0: 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
e4f0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
e500: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
e510: 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  mtted..**.** If 
e520: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
e530: 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  rs, an SQLITE_IO
e540: 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
e550: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
e560: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51  .** Otherwise SQ
e570: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
e580: 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
e590: 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
e5a0: 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73  p, int eOp){.  s
e5b0: 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62  qlite3 *const db
e5c0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
e5d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e5e0: 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61  .  /* If p->iSta
e5f0: 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65  tement is greate
e600: 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
e610: 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e  n this Vdbe open
e620: 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65  ed a .  ** state
e630: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
e640: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
e650: 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65  closed here. The
e660: 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a   only exception.
e670: 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20    ** is that an 
e680: 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76  IO error may hav
e690: 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69  e occured, causi
e6a0: 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
e6b0: 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
e6c0: 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
e6d0: 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
e6e0: 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
e6f0: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
e700: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
e710: 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
e720: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
e730: 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
e740: 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
e750: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
e760: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
e770: 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
e780: 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
e790: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
e7a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
e7b0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
e7c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e7d0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
e7e0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
e7f0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
e800: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
e810: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
e820: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
e830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
e840: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e850: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e860: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
e870: 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
e880: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
e890: 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
e8a0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
e8b0: 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
e8c0: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
e8d0: 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
e8e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e8f0: 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
e900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e910: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
e920: 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
e930: 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
e940: 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
e950: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
e960: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
e970: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e980: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
e990: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e9a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
e9b0: 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
e9c0: 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
e9d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
e9e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
e9f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
ea00: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
ea10: 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
ea20: 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
ea30: 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
ea40: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
ea50: 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
ea60: 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
ea70: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
ea80: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
ea90: 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
eaa0: 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
eab0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
eac0: 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
ead0: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
eae0: 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
eaf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
eb00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
eb10: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
eb20: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
eb30: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
eb40: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
eb50: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
eb60: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
eb70: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
eb80: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
eb90: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
eba0: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
ebb0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
ebc0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
ebd0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
ebe0: 6f 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73 65  oing so it.** se
ebf0: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
ec00: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
ec10: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
ec20: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
ec30: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
ec40: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
ec50: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
ec60: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
ec70: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
ec80: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
ec90: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
eca0: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
ecb0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
ecc0: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
ecd0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69 73  reeEnterAll() is
ece0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
ecf0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
ed00: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
ed10: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
ed20: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
ed30: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
ed40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
ed50: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
ed60: 68 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f 75  h the VM. Of cou
ed70: 72 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73 65  rse only a subse
ed80: 74 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  t of these struc
ed90: 74 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65  tures.** will be
eda0: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
edb0: 20 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75 6c   VM, and we coul
edc0: 64 20 75 73 65 20 56 64 62 65 2e 62 74 72 65 65  d use Vdbe.btree
edd0: 4d 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a 2a  Mask to figure.*
ede0: 2a 20 74 68 61 74 20 73 75 62 73 65 74 20 6f 75  * that subset ou
edf0: 74 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20  t, but there is 
ee00: 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  no advantage to 
ee10: 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20  doing so..**.** 
ee20: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
ee30: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
ee40: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
ee50: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
ee60: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
ee70: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
ee80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
ee90: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
eea0: 41 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74 65  ACHE.void sqlite
eeb0: 33 56 64 62 65 4d 75 74 65 78 41 72 72 61 79 45  3VdbeMutexArrayE
eec0: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 23  nter(Vdbe *p){.#
eed0: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
eee0: 53 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42 74  SAFE.  sqlite3Bt
eef0: 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74  reeMutexArrayEnt
ef00: 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  er(&p->aMutex);.
ef10: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 42  #else.  sqlite3B
ef20: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d 3e  treeEnterAll(p->
ef30: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65  db);.#endif.}.#e
ef40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
ef50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
ef60: 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
ef70: 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
ef80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
ef90: 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
efa0: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
efb0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
efc0: 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
efd0: 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
efe0: 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
eff0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
f000: 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
f010: 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
f020: 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
f030: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
f040: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
f050: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
f060: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
f070: 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
f080: 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
f090: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
f0a0: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
f0b0: 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
f0c0: 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
f0d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
f0e0: 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72  d write.** an er
f0f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
f100: 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
f110: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
f120: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f130: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
f140: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
f150: 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
f160: 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
f170: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f180: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
f190: 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65  erred && db->nDe
f1a0: 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c  ferredCons>0) ||
f1b0: 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
f1c0: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
f1d0: 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  0) ){.    p->rc 
f1e0: 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
f1f0: 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  INT;.    p->erro
f200: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
f210: 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rt;.    sqlite3S
f220: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
f230: 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69  rMsg, db, "forei
f240: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
f250: 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
f260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
f270: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
f280: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
f290: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
f2a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f2b0: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
f2c0: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
f2d0: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
f2e0: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
f2f0: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
f300: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
f310: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
f320: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
f330: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
f340: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
f350: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
f360: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f370: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
f380: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
f390: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
f3a0: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
f3b0: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
f3c0: 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
f3d0: 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
f3e0: 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
f3f0: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
f400: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
f410: 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
f420: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f430: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
f440: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
f450: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
f460: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
f470: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
f480: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
f490: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
f4a0: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
f4b0: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
f4c0: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
f4d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
f4e0: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
f4f0: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
f500: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
f530: 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
f540: 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
f550: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
f560: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
f570: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
f580: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
f590: 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
f5a0: 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
f5b0: 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
f5c0: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
f5d0: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
f5e0: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
f5f0: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
f600: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
f610: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
f620: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
f630: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
f640: 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
f650: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
f660: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
f670: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
f680: 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
f690: 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
f6a0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
f6b0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
f6c0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
f6d0: 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
f6e0: 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
f6f0: 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
f700: 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
f710: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
f720: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f730: 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
f740: 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
f750: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
f760: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
f770: 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
f780: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
f790: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
f7a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f7b0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
f7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f7d0: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
f7e0: 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
f7f0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
f800: 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
f810: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f820: 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
f830: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
f840: 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
f850: 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
f860: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
f870: 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
f880: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
f890: 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
f8a0: 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
f8b0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
f8c0: 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
f8d0: 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
f8e0: 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
f8f0: 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
f900: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
f910: 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
f920: 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
f930: 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
f940: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
f950: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
f960: 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41 72  lite3VdbeMutexAr
f970: 72 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  rayEnter(p);..  
f980: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
f990: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
f9a0: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
f9b0: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
f9c0: 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ff;.    assert( 
f9d0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  p->rc!=SQLITE_IO
f9e0: 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20  ERR_BLOCKED );  
f9f0: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f  /* This error no
fa00: 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a   longer exists *
fa10: 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  /.    isSpecialE
fa20: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
fa30: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
fa40: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
fa70: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
fa80: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
fa90: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
faa0: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
fab0: 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
fac0: 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
fad0: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
fae0: 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
faf0: 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
fb00: 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
fb10: 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
fb20: 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
fb30: 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
fb40: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
fb50: 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
fb60: 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
fb70: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
fb80: 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
fb90: 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
fba0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
fbb0: 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
fbc0: 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
fbd0: 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
fbe0: 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
fbf0: 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
fc00: 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
fc10: 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
fc20: 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
fc30: 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
fc40: 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  cured while writ
fc50: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
fc60: 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
fc70: 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
fc80: 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
fc90: 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
fca0: 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
fcb0: 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
fcc0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
fcd0: 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
fce0: 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
fcf0: 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
fd00: 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
fd10: 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
fd20: 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
fd30: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
fd40: 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
fd50: 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
fd60: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
fd70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
fd80: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
fd90: 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
fda0: 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
fdb0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
fdc0: 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
fdd0: 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
fde0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
fdf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fe00: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
fe10: 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
fe20: 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
fe30: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
fe40: 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
fe50: 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
fe60: 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
fe70: 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
fe80: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
fe90: 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
fea0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
feb0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
fec0: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
fed0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
fee0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
fef0: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
ff00: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
ff10: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
ff20: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
ff30: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
ff40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ff50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
ff60: 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
ff70: 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
ff80: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
ff90: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
ffa0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ffb0: 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
ffc0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
ffd0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
ffe0: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
fff0: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
10000 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
10010 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
10020 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
10030 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
10040 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
10050 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
10060 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
10070 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
10080 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
10090 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
100a0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
100b0 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
100c0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
100d0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
100e0 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
100f0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
10100 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
10110 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72   .     && db->wr
10120 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e  iteVdbeCnt==(p->
10130 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
10140 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
10150 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10160 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
10170 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
10180 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
10190 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
101a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
101b0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
101c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
101d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
101e0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
101f0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
10200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
10210 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61  reeMutexArrayLea
10220 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  ve(&p->aMutex);.
10230 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
10240 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
10250 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10260 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
10270 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
10280 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
10290 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
102a0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
102b0 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
102c0 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
102d0 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
102e0 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
102f0 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
10300 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
10310 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
10320 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
10330 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
10340 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
10350 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10360 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
10370 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
10380 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
10390 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
103a0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
103b0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
103c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
103d0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
103e0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
103f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
10400 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
10410 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
10420 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10430 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
10440 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10460 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
10470 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
10480 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10490 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
104a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
104b0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
104c0 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
104d0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
104e0 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
104f0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
10500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10510 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
10520 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
10530 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
10540 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
10550 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
10560 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
10570 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
10580 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
10590 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
105a0 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
105b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
105c0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
105d0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
105e0 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
105f0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
10600 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
10610 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
10620 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
10630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
10640 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
10650 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
10660 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10670 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
10680 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
10690 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
106a0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
106b0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
106c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
106d0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
106e0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
106f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
10700 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
10710 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
10720 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
10730 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
10740 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
10750 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
10760 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
10770 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
10780 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
10790 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
107a0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
107b0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
107c0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
107d0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
107e0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
107f0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
10800 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
10810 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
10820 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
10830 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  te that sqlite3V
10840 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
10850 74 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66 61 69  t() can only fai
10860 6c 20 69 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  l if eStatementO
10870 70 0a 20 20 20 20 2a 2a 20 69 73 20 53 41 56 45  p.    ** is SAVE
10880 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2e 20  POINT_ROLLBACK. 
10890 20 42 75 74 20 69 66 20 70 2d 3e 72 63 3d 3d 53   But if p->rc==S
108a0 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 65 53  QLITE_OK then eS
108b0 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a  tatementOp.    *
108c0 2a 20 6d 75 73 74 20 62 65 20 53 41 56 45 50 4f  * must be SAVEPO
108d0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 20 48 65  INT_RELEASE.  He
108e0 6e 63 65 20 74 68 65 20 4e 45 56 45 52 28 70 2d  nce the NEVER(p-
108f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  >rc==SQLITE_OK) 
10900 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  in .    ** the f
10910 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 2e 0a 20  ollowing code.. 
10920 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
10930 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
10940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10950 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
10960 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
10970 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
10980 63 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  c ){.        ass
10990 65 72 74 28 20 65 53 74 61 74 65 6d 65 6e 74 4f  ert( eStatementO
109a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
109b0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  LBACK );.       
109c0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 63   if( NEVER(p->rc
109d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20  ==SQLITE_OK) || 
109e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
109f0 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
10a00 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
10a10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10a20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10a30 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
10a40 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
10a50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
10a60 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
10a70 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
10a80 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
10a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10aa0 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
10ac0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
10ad0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
10ae0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
10af0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
10b00 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
10b10 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
10b20 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
10b30 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
10b40 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
10b50 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
10b60 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
10b70 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
10b80 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
10b90 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
10ba0 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
10bb0 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
10bc0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
10bd0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
10be0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
10bf0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
10c00 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
10c10 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
10c20 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
10c30 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
10c40 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
10c50 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
10c60 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
10c70 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
10c80 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
10c90 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
10ca0 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
10cb0 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
10cc0 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
10cd0 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
10ce0 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
10cf0 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
10d00 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
10d10 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 64 62 2d  , -1);.      db-
10d20 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
10d30 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
10d40 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
10d50 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
10d60 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
10d70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10d80 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
10d90 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d  &p->aMutex);.  }
10da0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
10db0 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
10dc0 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
10dd0 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
10de0 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
10df0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
10e00 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
10e10 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  Cnt--;.    if( !
10e20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
10e30 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64       db->writeVd
10e40 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  beCnt--;.    }. 
10e50 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
10e60 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62  ctiveVdbeCnt>=db
10e70 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
10e80 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
10e90 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
10ea0 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
10eb0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
10ec0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
10ed0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
10ee0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
10ef0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
10f00 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
10f10 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
10f20 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
10f30 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
10f40 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
10f50 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
10f60 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
10f70 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
10f80 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
10f90 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
10fa0 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
10fb0 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
10fc0 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
10fd0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
10fe0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
10ff0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11000 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
11010 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74   assert( db->act
11020 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20  iveVdbeCnt>0 || 
11030 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
11040 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
11050 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
11060 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
11070 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
11080 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
11090 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
110a0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
110b0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
110c0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
110d0 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
110e0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
110f0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
11100 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
11110 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
11120 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11130 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
11140 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
11150 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11160 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
11170 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
11180 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
11190 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
111a0 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
111b0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
111c0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
111d0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
111e0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
111f0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
11200 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
11210 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
11220 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
11230 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
11240 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
11250 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
11260 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
11270 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
11280 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
11290 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
112a0 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
112b0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
112c0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
112d0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
112e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
112f0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
11300 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
11310 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
11320 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
11330 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
11340 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
11350 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
11360 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
11370 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
11380 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
11390 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
113a0 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
113b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
113c0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
113d0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
113e0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
113f0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
11400 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
11410 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
11420 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
11430 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
11440 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11450 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
11460 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
11470 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
11480 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
11490 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
114a0 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
114b0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
114c0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
114d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
114e0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
114f0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
11500 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
11510 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
11520 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
11530 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11540 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
11550 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
11560 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
11570 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
11580 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
11590 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
115a0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
115b0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64  alloc();.      d
115c0 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
115d0 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
115e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
115f0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70  ErrMsg);.      p
11600 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
11610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
11620 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
11630 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
11640 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
11650 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
11660 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
11670 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
11680 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
11690 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
116a0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
116b0 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
116c0 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
116d0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
116e0 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
116f0 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
11700 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
11710 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
11720 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
11730 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
11740 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
11750 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
11760 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
11770 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
11780 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
11790 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
117a0 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
117b0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
117c0 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
117d0 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
117e0 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
117f0 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
11800 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
11810 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11820 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
11830 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
11840 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
11850 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
11860 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
11870 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
11880 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
11890 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
118a0 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
118b0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
118c0 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
118d0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
118e0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
118f0 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
11900 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
11910 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
11920 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
11930 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
11940 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
11950 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11960 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
11970 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
11980 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
11990 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
119a0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
119b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
119c0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
119d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
119e0 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
119f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
11a00 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
11a10 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
11a20 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
11a30 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
11a40 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
11a50 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
11a60 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
11a70 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
11a80 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
11a90 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
11aa0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
11ab0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
11ac0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11ad0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
11ae0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
11af0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
11b00 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
11b10 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
11b20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
11b30 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
11b40 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
11b50 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
11b60 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
11b70 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
11b80 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
11b90 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
11ba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11bb0 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
11bc0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
11bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
11be0 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
11bf0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
11c00 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
11c10 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
11c20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
11c30 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
11c40 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
11c50 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
11c60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11c70 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
11c80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11c90 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
11ca0 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
11cb0 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
11cc0 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
11cd0 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
11ce0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
11cf0 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
11d00 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
11d10 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
11d20 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
11d30 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
11d40 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
11d50 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
11d60 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
11d70 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
11d80 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
11d90 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
11da0 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
11db0 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
11dc0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
11dd0 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
11de0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
11df0 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
11e00 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
11e10 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
11e20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
11e30 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20  (((u32)1)<<i))) 
11e40 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
11e50 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
11e60 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
11e70 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
11e80 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
11e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
11ea0 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
11eb0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11ec0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
11ed0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11ee0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
11ef0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
11f00 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64  gument..** The d
11f10 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
11f20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
11f30 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
11f40 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
11f50 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
11f60 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
11f70 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
11f80 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
11f90 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
11fa0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11fb0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
11fc0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
11fd0 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
11fe0 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
11ff0 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
12000 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  , *pNext;.  asse
12010 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
12020 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
12030 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12040 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
12050 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
12060 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
12070 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
12080 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
12090 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
120a0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
120b0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
120c0 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
120d0 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
120e0 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
120f0 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
12100 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12110 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
12120 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
12130 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
12140 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
12150 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
12160 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  bel);.  sqlite3D
12170 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
12180 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
12190 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
121a0 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
121b0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
121c0 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ee);.  sqlite3Db
121d0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
121e0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
121f0 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
12200 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
12210 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
12220 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
12230 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
12240 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
12250 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
12260 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
12270 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
12280 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12290 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
122a0 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
122b0 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
122c0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
122d0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
122e0 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
122f0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
12300 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
12310 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
12320 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b  AD;.  p->db = 0;
12330 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
12340 6c 65 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70  leteObject(db, p
12350 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
12360 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
12370 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
12380 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
12390 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
123a0 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
123b0 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
123c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
123d0 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
123e0 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
123f0 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
12400 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
12410 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
12420 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
12430 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
12440 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
12450 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
12460 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
12470 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
12480 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
12490 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
124a0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
124b0 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
124c0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
124d0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
124e0 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
124f0 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
12500 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
12510 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
12520 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
12530 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
12540 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
12550 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
12560 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
12570 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
12580 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
12590 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
125a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
125b0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
125c0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
125d0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
125e0 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
125f0 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
12600 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
12610 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
12620 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
12630 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
12640 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
12650 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
12660 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12670 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
12680 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
12690 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
126a0 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
126b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
126c0 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61  rn rc;.    p->la
126d0 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76  stRowid = p->mov
126e0 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69  etoTarget;.    i
126f0 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
12700 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12710 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72  T_BKPT;.    p->r
12720 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b  owidIsValid = 1;
12730 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
12740 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
12750 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
12760 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
12770 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
12780 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
12790 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
127a0 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
127b0 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f  ALWAYS(p->pCurso
127c0 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  r) ){.    int ha
127d0 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
127e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
127f0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
12800 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
12810 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
12820 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12830 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
12840 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
12850 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
12860 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
12870 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
12880 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
128a0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
128b0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
128c0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
128d0 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
128e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
128f0 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
12900 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
12910 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
12920 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
12930 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12940 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
12950 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
12960 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
12970 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
12980 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
12990 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
129a0 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
129b0 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
129c0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
129d0 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
129e0 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
129f0 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
12a00 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
12a10 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
12a20 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
12a30 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
12a40 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
12a50 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
12a60 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
12a70 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
12a80 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
12a90 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
12aa0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
12ab0 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
12ac0 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
12ad0 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
12ae0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
12af0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
12b00 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
12b10 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
12b20 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
12b30 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
12b40 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
12b50 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
12b60 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
12b70 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
12b80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
12b90 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
12ba0 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
12bb0 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
12bc0 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
12bd0 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
12be0 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
12bf0 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
12c00 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
12c10 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
12c20 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
12c40 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
12c50 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
12c60 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
12c70 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12c80 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
12c90 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
12ca0 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
12cd0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
12ce0 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
12d00 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
12d10 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
12d20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
12d30 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
12d40 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
12d50 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
12d80 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
12d90 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
12da0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
12db0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
12dc0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
12df0 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
12e00 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
12e10 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
12e20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
12e30 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
12e40 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
12e50 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
12e60 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
12e70 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
12e80 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ea0 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
12eb0 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
12ec0 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
12ed0 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
12ee0 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
12ef0 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
12f00 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
12f10 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
12f20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
12f30 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
12f40 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
12f50 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
12f60 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
12f70 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
12f80 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
12f90 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
12fa0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12fb0 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
12fc0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
12fd0 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
12fe0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12ff0 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
13000 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
13010 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
13020 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
13030 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
13040 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
13050 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13060 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
13070 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
13080 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
13090 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
130a0 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
130b0 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
130c0 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
130d0 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
130e0 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
130f0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
13100 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
13110 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26  file_format>=4 &
13120 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20  & (i&1)==i ){.  
13130 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
13140 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  2)i;.    }.    i
13150 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
13160 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54  if( i<(-MAX_6BYT
13170 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20  E) ) return 6;. 
13180 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
13190 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20   test prevents: 
131a0 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30   u = -(-92233720
131b0 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a  36854775808) */.
131c0 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20        u = -i;.  
131d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
131e0 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
131f0 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
13200 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
13210 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
13220 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
13230 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
13240 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
13250 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
13260 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
13270 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
13280 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
13290 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
132a0 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
132b0 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
132c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
132d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
132e0 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
132f0 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
13300 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
13310 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
13320 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
13330 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
13340 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
13350 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
13360 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
13370 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
13380 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
13390 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
133a0 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
133b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
133c0 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
133d0 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
133e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
133f0 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
13400 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
13410 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
13420 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
13430 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
13440 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
13450 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
13460 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
13470 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
13480 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
13490 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
134a0 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
134b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
134c0 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
134d0 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
134e0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
134f0 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
13500 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
13510 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
13520 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
13530 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
13540 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
13550 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
13560 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
13570 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
13580 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
13590 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
135a0 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
135b0 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
135c0 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
135d0 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
135e0 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
135f0 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
13600 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
13610 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
13620 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
13630 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
13640 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
13650 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
13660 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
13670 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
13680 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
13690 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
136a0 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
136b0 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
136c0 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
136d0 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
136e0 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
136f0 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
13700 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
13710 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
13720 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
13730 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
13740 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
13750 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
13760 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
13770 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
13780 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
13790 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
137a0 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
137b0 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
137c0 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
137d0 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
137e0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
137f0 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
13800 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
13810 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
13820 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
13830 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
13840 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
13850 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
13860 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
13870 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
13880 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
13890 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
138a0 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
138b0 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
138c0 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
138d0 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
138e0 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
138f0 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
13900 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
13910 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
13920 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
13930 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
13940 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
13950 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
13960 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
13970 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
13980 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
13990 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
139a0 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
139b0 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
139c0 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
139d0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
139e0 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
139f0 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
13a00 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
13a10 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
13a20 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
13a30 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
13a40 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
13a50 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
13a60 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
13a70 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
13a80 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
13a90 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
13aa0 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
13ab0 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
13ac0 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
13ad0 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
13ae0 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
13af0 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
13b00 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
13b10 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
13b20 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
13b30 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
13b40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
13b50 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
13b60 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
13b70 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
13b80 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
13b90 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
13ba0 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
13bb0 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
13bc0 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
13bd0 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
13be0 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
13bf0 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
13c00 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
13c10 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
13c20 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
13c30 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
13c40 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
13c50 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
13c60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
13c70 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
13c80 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
13c90 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
13ca0 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
13cb0 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
13cc0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
13cd0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
13ce0 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
13cf0 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
13d00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
13d10 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
13d20 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
13d30 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
13d40 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
13d50 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
13d60 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
13d70 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
13d80 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
13d90 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
13da0 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
13db0 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
13dc0 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
13dd0 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
13de0 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
13df0 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
13e00 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
13e10 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
13e20 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
13e30 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
13e40 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
13e50 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
13e60 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
13e70 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
13e80 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
13e90 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
13ea0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
13eb0 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
13ec0 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
13ed0 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
13ee0 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
13ef0 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
13f00 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
13f10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13f20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
13f30 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
13f40 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
13f50 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
13f60 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
13f70 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
13f80 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
13f90 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
13fa0 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
13fb0 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
13fc0 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
13fd0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
13fe0 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
13ff0 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
14000 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
14010 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
14020 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
14030 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14040 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
14050 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
14060 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
14070 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
14080 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
14090 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
140a0 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
140b0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
140c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
140d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
140e0 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
140f0 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
14100 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
14110 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
14120 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
14130 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
14140 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
14150 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
14160 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
14170 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
14180 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14190 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
141a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
141b0 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
141c0 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
141d0 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
141e0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
141f0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
14200 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
14210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
14220 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
14230 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
14240 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
14250 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
14260 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
14270 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
14280 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
14290 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
142a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
142b0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
142c0 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
142d0 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
142e0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
142f0 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
14300 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
14310 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
14320 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
14330 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
14340 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
14350 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
14360 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
14370 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
14380 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
14390 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
143a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
143b0 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
143c0 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
143d0 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
143e0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
143f0 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
14400 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
14410 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
14420 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
14430 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
14440 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
14450 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
14460 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
14470 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
14480 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
14490 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
144a0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
144b0 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
144c0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
144d0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
144e0 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
144f0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
14500 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
14510 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
14520 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
14530 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
14540 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
14550 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
14580 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
14590 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
145a0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
145b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
145c0 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
145d0 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
145e0 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
145f0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
14600 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
14610 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
14620 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
14630 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14640 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
14650 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14660 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
14670 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14680 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
14690 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
146a0 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
146b0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
146c0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
146d0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
146e0 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
146f0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14700 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
14710 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
14720 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
14730 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
14740 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14750 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
14760 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
14770 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
14780 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
14790 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
147a0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
147b0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
147c0 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
147d0 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
147e0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
147f0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
14800 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
14810 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
14820 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
14830 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
14840 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
14850 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
14860 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
14870 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
14880 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
14890 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
148a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
148b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
148c0 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
148d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
148e0 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
148f0 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
14900 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
14910 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
14920 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
14930 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
14940 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
14950 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
14960 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
14970 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
14980 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
14990 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
149a0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
149b0 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
149c0 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
149d0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
149e0 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
149f0 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
14a00 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
14a10 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
14a20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
14a30 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
14a40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14a50 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
14a60 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
14a70 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
14a80 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
14a90 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
14aa0 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
14ab0 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
14ac0 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
14ad0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
14ae0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
14af0 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
14b00 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
14b10 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
14b20 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
14b30 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
14b40 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
14b50 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
14b60 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
14b70 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
14b80 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
14b90 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
14ba0 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
14bb0 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
14bc0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14bd0 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
14be0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
14bf0 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
14c00 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
14c10 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
14c20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
14c30 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
14c40 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
14c50 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
14c60 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
14c70 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
14c80 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
14c90 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
14ca0 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
14cb0 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
14cc0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
14cd0 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
14ce0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
14cf0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
14d00 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14d10 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
14d20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
14d30 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
14d40 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
14d50 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
14d60 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
14d70 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
14d80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
14d90 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
14da0 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
14db0 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
14dc0 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
14dd0 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
14de0 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
14df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
14e00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
14e10 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
14e20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
14e30 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
14e40 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
14e50 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
14e60 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
14e70 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
14e80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
14e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
14ea0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
14eb0 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
14ec0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
14ed0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
14ee0 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
14ef0 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
14f00 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
14f10 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
14f20 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
14f30 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
14f40 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
14f50 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
14f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14f70 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14f80 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
14f90 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
14fa0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
14fb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
14fc0 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  n 0;.}.../*.** G
14fd0 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
14fe0 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
14ff0 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
15000 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20  ], parse the.** 
15010 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e  record into a Un
15020 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
15030 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
15040 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
15050 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a  that structure..
15060 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
15070 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74  g function might
15080 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65   provide szSpace
15090 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
150a0 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70  .** space at pSp
150b0 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65  ace.  This space
150c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
150d0 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
150e0 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52  d.** VDbeParsedR
150f0 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
15100 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65  if it is large e
15110 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73  nough.  If it is
15120 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75  .** not big enou
15130 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74  gh, space is obt
15140 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
15150 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3_malloc()..**.
15160 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
15170 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64  structure should
15180 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20   be closed by a 
15190 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
151a0 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
151b0 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f  ckedRecord()..*/
151c0 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   .UnpackedRecord
151d0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63   *sqlite3VdbeRec
151e0 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
151f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
15200 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
15210 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
15220 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
15230 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
15240 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15250 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
15260 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
15270 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
15280 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
15290 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
152a0 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
152b0 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
152c0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ace available to
152d0 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74   hold the object
152e0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
152f0 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
15300 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
15310 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
15320 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
15330 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
15340 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
15350 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70  ar *)pKey;.  Unp
15360 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
15370 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64   /* The unpacked
15380 20 72 65 63 6f 72 64 20 74 68 61 74 20 77 65 20   record that we 
15390 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20  will return */. 
153a0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
153b0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
153c0 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68  pace needed to h
153d0 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20  old p, in bytes 
153e0 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33  */.  int d;.  u3
153f0 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20  2 idx;.  u16 u; 
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15410 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
15420 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
15430 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
15440 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  m;.  int nOff;  
15450 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
15460 65 61 73 65 20 70 53 70 61 63 65 20 62 79 20 74  ease pSpace by t
15470 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79  his much to 8-by
15480 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  te align it */. 
15490 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77   .  /*.  ** We w
154a0 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65  ant to shift the
154b0 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20   pointer pSpace 
154c0 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20  up such that it 
154d0 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  is 8-byte aligne
154e0 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65  d..  ** Thus, we
154f0 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61   need to calcula
15500 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66  te a value, nOff
15510 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  , between 0 and 
15520 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a  7, to shift .  *
15530 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70  * it by.  If pSp
15540 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38  ace is already 8
15550 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e  -byte aligned, n
15560 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  Off should be ze
15570 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20  ro..  */.  nOff 
15580 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50  = (8 - (SQLITE_P
15590 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65  TR_TO_INT(pSpace
155a0 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70  ) & 7)) & 7;.  p
155b0 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20  Space += nOff;. 
155c0 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66   szSpace -= nOff
155d0 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
155e0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
155f0 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
15600 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
15610 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
15620 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
15630 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  ce ){.    p = sq
15640 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15650 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
15660 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
15670 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
15680 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
15690 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45  NPACKED_NEED_FRE
156a0 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  E | UNPACKED_NEE
156b0 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c  D_DESTROY;.  }el
156c0 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
156d0 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70  ackedRecord*)pSp
156e0 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ace;.    p->flag
156f0 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s = UNPACKED_NEE
15700 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20  D_DESTROY;.  }. 
15710 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
15720 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
15730 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
15740 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70  >nField + 1;.  p
15750 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20  ->aMem = pMem = 
15760 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
15770 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
15780 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
15790 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
157a0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
157b0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
157c0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
157d0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
157e0 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
157f0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
15800 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46  szHdr && u<p->nF
15810 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20  ield && d<=nKey 
15820 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
15830 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
15840 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
15850 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
15860 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
15870 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
15880 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
15890 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
158a0 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ->db;.    pMem->
158b0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  flags = 0;.    p
158c0 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
158d0 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
158e0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
158f0 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
15900 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
15910 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
15920 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
15930 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
15940 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
15950 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72  >nField = u;.  r
15960 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a  eturn (void*)p;.
15970 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15980 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61  utine destroys a
15990 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
159a0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
159b0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
159c0 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
159d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
159e0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
159f0 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73  em *pMem;..  ass
15a00 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
15a10 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 20  ssert( p->flags 
15a20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
15a30 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f 72  DESTROY );.  for
15a40 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d  (i=0, pMem=p->aM
15a50 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b  em; i<p->nField;
15a60 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
15a70 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b     /* The unpack
15a80 65 64 20 72 65 63 6f 72 64 20 69 73 20 61 6c 77  ed record is alw
15a90 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ays constructed 
15aa0 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  by the.    ** sq
15ab0 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63 6b 52  lite3VdbeUnpackR
15ac0 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e  ecord() function
15ad0 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20 6d 61   above, which ma
15ae0 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  kes all.    ** s
15af0 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
15b00 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20 6e 6f   static.  And no
15b10 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e  ne of the elemen
15b20 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 65 76  ts are.    ** ev
15b30 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20  er transformed, 
15b40 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
15b50 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65  r anything to de
15b60 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lete..    */.   
15b70 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65 6d 2d   if( NEVER(pMem-
15b80 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69  >zMalloc) ) sqli
15b90 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
15ba0 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  e(pMem);.  }.  i
15bb0 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e  f( p->flags & UN
15bc0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45  PACKED_NEED_FREE
15bd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
15be0 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66  bFree(p->pKeyInf
15bf0 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  o->db, p);.  }.}
15c00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15c10 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
15c20 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
15c30 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
15c40 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
15c50 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
15c60 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
15c70 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
15c80 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
15c90 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
15ca0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
15cb0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
15cc0 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
15cd0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
15ce0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
15cf0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
15d00 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
15d10 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
15d20 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
15d30 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
15d40 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
15d50 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
15d60 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
15d70 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
15d80 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
15d90 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
15da0 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
15db0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
15dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
15dd0 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77  ds..** The key w
15de0 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73  ith fewer fields
15df0 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70   is usually comp
15e00 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ares less than t
15e10 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65  he .** longer ke
15e20 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74  y.  However if t
15e30 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
15e40 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b  KEY flags in pPK
15e50 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e  ey2 is set.** an
15e60 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
15e70 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c  fixes are equal,
15e80 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65   then key1 is le
15e90 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a  ss than key2..**
15ea0 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43   Or if the UNPAC
15eb0 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58  KED_MATCH_PREFIX
15ec0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
15ed0 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72   the prefixes ar
15ee0 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e  e.** equal, then
15ef0 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f   the keys are co
15f00 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
15f10 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20  qual and.** the 
15f20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65  parts beyond the
15f30 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61   common prefix a
15f40 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  re ignored..**.*
15f50 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  * If the UNPACKE
15f60 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66  D_IGNORE_ROWID f
15f70 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
15f80 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
15f90 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  f.** the header 
15fa0 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f  of pKey1 is igno
15fb0 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  red.  It is assu
15fc0 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69  med that pKey1 i
15fd0 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65  s.** an index ke
15fe0 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73  y, and thus ends
15ff0 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61   with a rowid va
16000 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62  lue.  The last b
16010 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65  yte.** of the he
16020 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66  ader will theref
16030 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61  ore be the seria
16040 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
16050 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31  wid:.** one of 1
16060 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c  , 2, 3, 4, 5, 6,
16070 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69   8, or 9 - the i
16080 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79  nteger serial ty
16090 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69  pes..** The seri
160a0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  al type of the f
160b0 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20  inal rowid will 
160c0 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67  always be a sing
160d0 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69  le byte..** By i
160e0 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73  gnoring this las
160f0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
16100 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74  ader, we force t
16110 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  he comparison.**
16120 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72   to ignore the r
16130 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
16140 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20  of key1..*/.int 
16150 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
16160 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
16170 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
16180 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
16190 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
161a0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
161b0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
161c0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  t key */.){.  in
161d0 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  t d1;           
161e0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
161f0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
16200 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
16210 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
16220 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
16230 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
16240 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
16250 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
16260 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
16270 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
16280 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
16290 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
162a0 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
162b0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
162c0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
162d0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
162e0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
162f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16300 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
16310 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
16320 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
16330 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
16340 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
16350 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
16360 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
16370 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
16380 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
16390 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
163a0 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
163b0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
163c0 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
163d0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
163e0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
163f0 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
16400 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
16410 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
16420 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
16430 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
16440 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
16450 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
16460 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
16470 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
16480 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
16490 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
164a0 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
164b0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
164c0 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  d initialized, a
164d0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
164e0 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
164f0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
16500 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
16510 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
16520 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
16530 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
16540 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
16550 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
16560 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
16570 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
16580 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16590 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
165a0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
165b0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
165c0 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
165d0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
165e0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
165f0 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
16600 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
16610 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
16620 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
16630 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
16640 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
16650 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
16660 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  ORE_ROWID ){.   
16670 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20   szHdr1--;.  }. 
16680 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
16690 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
166a0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
166b0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
166c0 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
166d0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
166e0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
166f0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
16700 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
16710 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
16720 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
16730 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
16740 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
16750 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
16760 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
16770 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16780 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
16790 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
167a0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
167b0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
167c0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
167d0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
167e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
167f0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
16800 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
16810 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
16820 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
16830 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16840 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
16850 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
16860 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
16890 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
168a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
168b0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
168c0 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
168d0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
168e0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  mment below */..
168f0 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20        /* Invert 
16900 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65  the result if we
16910 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20   are using DESC 
16920 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
16930 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
16940 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
16950 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65   i<nField && pKe
16960 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
16970 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
16980 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
16990 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
169a0 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
169b0 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
169c0 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
169d0 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
169e0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
169f0 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c  field were equal
16a00 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
16a10 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
16a20 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20  lag and set .   
16a30 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f     ** pPKey2->ro
16a40 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
16a50 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
16a60 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
16a70 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20  Key1)..      ** 
16a80 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
16a90 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
16aa0 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  opcode..      */
16ab0 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65  .      if( (pPKe
16ac0 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
16ad0 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
16ae0 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79  CH) && i==(pPKey
16af0 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a  2->nField-1) ){.
16b00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16b10 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
16b20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rc );.        as
16b30 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73  sert( mem1.flags
16b40 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
16b50 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c        pPKey2->fl
16b60 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
16b70 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
16b80 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
16b90 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69  rowid = mem1.u.i
16ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
16bb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16bc0 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
16bd0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f   }..  /* No memo
16be0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
16bf0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
16c00 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
16c10 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
16c20 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
16c30 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
16c40 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
16c50 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
16c60 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
16c70 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
16c80 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
16c90 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
16ca0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
16cb0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
16cc0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
16cd0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
16ce0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
16cf0 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
16d00 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
16d10 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
16d20 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
16d30 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
16d40 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c  _INCRKEY.  ** fl
16d50 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
16d60 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
16d70 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
16d80 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49  s larger..  ** I
16d90 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52  f the UPACKED_PR
16da0 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20  EFIX_MATCH flag 
16db0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79  is set, then key
16dc0 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72  s with common pr
16dd0 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20  efixes.  ** are 
16de0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
16df0 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
16e00 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
16e10 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  ey is the .  ** 
16e20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
16e30 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
16e40 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
16e50 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a  e the longer.  *
16e60 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
16e70 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
16e80 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
16e90 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32   );.  if( pPKey2
16ea0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16eb0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
16ec0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c    rc = -1;.  }el
16ed0 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
16ee0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
16ef0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
16f00 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
16f10 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  =0 */.  }else if
16f20 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b  ( idx1<szHdr1 ){
16f30 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
16f40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16f50 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
16f60 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
16f70 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
16f80 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
16f90 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
16fa0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
16fb0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
16fc0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
16fd0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
16fe0 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
16ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17000 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
17010 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
17020 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
17030 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
17040 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
17050 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
17060 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
17070 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
17080 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
17090 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
170a0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
170b0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
170c0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
170d0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
170e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
170f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17100 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
17110 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
17120 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
17130 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
17140 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
17150 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
17160 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
17170 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
17180 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
17190 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
171a0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
171b0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
171c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
171d0 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
171e0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
171f0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
17200 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
17210 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
17220 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
17230 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
17240 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
17250 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
17260 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
17270 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
17280 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
17290 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
172a0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
172b0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
172c0 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
172d0 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
172e0 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
172f0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17300 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17310 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
17320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17330 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
17340 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
17350 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
17360 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
17370 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
17380 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
17390 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
173a0 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
173b0 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
173c0 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
173d0 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
173e0 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
173f0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
17400 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
17410 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
17420 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
17430 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
17440 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
17450 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
17460 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
17470 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
17480 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
17490 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
174a0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
174b0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
174c0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
174d0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
174e0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
174f0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
17500 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
17510 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
17520 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
17530 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
17540 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17550 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17560 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
17570 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
17580 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
17590 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
175a0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
175b0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
175c0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
175d0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
175e0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
175f0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
17600 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
17610 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
17620 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
17630 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17640 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
17650 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
17660 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
17670 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
17680 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
17690 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
176a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
176b0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
176c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
176d0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
176e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
176f0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
17700 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
17710 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
17720 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
17730 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
17740 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17750 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
17760 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
17770 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
17780 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
17790 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
177a0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
177b0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
177c0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
177d0 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
177e0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
177f0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
17800 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
17810 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
17820 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
17830 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
17840 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
17850 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
17860 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
17870 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
17880 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
17890 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
178a0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
178b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
178c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
178d0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
178e0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
178f0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
17900 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
17910 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
17920 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
17930 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
17940 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
17950 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
17960 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
17970 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
17980 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
17990 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
179a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
179b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
179c0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
179d0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
179e0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
179f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
17a00 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
17a10 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
17a20 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
17a30 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
17a40 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
17a50 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
17a60 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
17a70 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
17a80 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
17a90 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
17aa0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
17ab0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
17ac0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
17ad0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
17ae0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
17af0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
17b00 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
17b10 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
17b20 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
17b30 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
17b40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
17b50 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
17b60 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
17b70 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
17b80 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
17b90 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
17ba0 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
17bb0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
17bc0 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
17bd0 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
17be0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
17bf0 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
17c00 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
17c10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
17c20 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
17c30 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
17c40 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
17c50 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70  npacked,  /* Unp
17c60 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
17c70 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
17c80 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
17c90 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
17ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17cb0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
17cc0 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
17cd0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
17ce0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
17cf0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17d00 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
17d10 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
17d20 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
17d30 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
17d40 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  Cur) );.  rc = s
17d50 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
17d60 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
17d70 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
17d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
17d90 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
17da0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
17db0 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
17dc0 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
17dd0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
17de0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
17df0 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
17e00 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20  se of the say.  
17e10 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
17e20 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
17e30 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
17e40 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
17e50 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
17e60 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
17e70 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
17e80 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
17e90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17ea0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17eb0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
17ec0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
17ed0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17ee0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
17ef0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
17f00 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
17f10 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
17f20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17f30 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
17f40 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
17f50 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
17f60 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a  ORE_ROWID );.  *
17f70 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
17f80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
17f90 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
17fa0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
17fb0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
17fc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17fd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17fe0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
17ff0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
18000 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
18010 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
18020 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
18030 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
18040 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
18050 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
18060 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
18070 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
18080 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
18090 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
180a0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
180b0 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
180c0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
180d0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
180e0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
180f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
18100 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
18110 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
18120 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
18130 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
18140 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
18150 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
18160 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
18170 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
18180 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
18190 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
181a0 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
181b0 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
181c0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
181d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
181e0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
181f0 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
18200 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
18210 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
18220 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
18230 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
18240 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
18250 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
18260 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
18270 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
18280 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
18290 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
182a0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
182b0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
182c0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
182d0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
182e0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
182f0 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
18300 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
18310 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
18320 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
18330 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18340 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
18350 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
18360 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
18370 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
18380 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
18390 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
183a0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
183b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
183c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
183d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
183e0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
183f0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
18400 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
18410 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
18420 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
18430 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
18440 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
18450 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
18460 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
18470 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
18480 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
18490 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
184a0 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
184b0 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
184c0 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
184d0 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
184e0 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
184f0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
18500 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
18510 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
18520 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
18530 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
18540 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
18550 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
18560 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
18570 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
18580 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
18590 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
185a0 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  etValue(Vdbe *v,
185b0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
185c0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
185d0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
185e0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
185f0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
18600 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
18610 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
18620 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
18630 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18640 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
18650 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
18660 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
18670 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18680 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
18690 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
186a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
186b0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
186c0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
186d0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
186e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
186f0 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d  emStoreType((Mem
18700 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20   *)pRet);.      
18710 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
18720 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
18730 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18740 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
18750 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
18760 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
18770 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
18780 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
18790 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
187a0 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
187b0 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
187c0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
187d0 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
187e0 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
187f0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
18800 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
18810 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
18820 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
18830 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
18840 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
18850 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
18860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
18870 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
18880 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
18890 20 20 7d 0a 7d 0a                                  }.}.