/ Hex Artifact Content
Login

Artifact 010e4e67a5a577451b0220ea8903c9e279a43248:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 50 61 72    if( op==OP_Par
0f60: 73 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  seSchema ){.    
0f70: 2f 2a 20 41 6e 79 20 70 72 6f 67 72 61 6d 20 74  /* Any program t
0f80: 68 61 74 20 75 73 65 73 20 74 68 65 20 4f 50 5f  hat uses the OP_
0f90: 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f  ParseSchema opco
0fa0: 64 65 20 6e 65 65 64 73 20 74 6f 20 6c 6f 63 6b  de needs to lock
0fb0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 62 74 72 65  .    ** all btre
0fc0: 65 73 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 62 74  es. */.    p->bt
0fd0: 72 65 65 4d 61 73 6b 20 3d 20 7e 28 79 44 62 4d  reeMask = ~(yDbM
0fe0: 61 73 6b 29 30 3b 0a 20 20 7d 0a 23 69 66 64 65  ask)0;.  }.#ifde
0ff0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1000: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d   pOp->zComment =
1010: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
1020: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
1030: 29 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  ) sqlite3VdbePri
1040: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
1050: 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23  Op[i]);.#endif.#
1060: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
1070: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
1080: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
1090: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
10a0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
10b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
10d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
10e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
10f0: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1100: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1110: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1120: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1130: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1140: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1150: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1160: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1170: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1180: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1190: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
11a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
11c0: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
11d0: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
11e0: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
11f0: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1200: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1220: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1230: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1240: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1250: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1270: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1280: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1290: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
12a0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
12b0: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
12c0: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
12d0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
12e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
12f0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1300: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1310: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1320: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1330: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
1340: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
1350: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
1360: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1380: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13a0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
13b0: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
13c0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
13d0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
13e0: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
13f0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1400: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
1410: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1420: 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65  ddOp4Int(.  Vdbe
1430: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1440: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
1450: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
1460: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
1470: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1480: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1490: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
14a0: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
14b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14d0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
14e0: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
14f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1500: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1510: 74 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20  t p4            
1520: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1530: 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65  and as an intege
1540: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  r */.){.  int ad
1550: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1560: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1570: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1590: 28 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45  (p, addr, SQLITE
15a0: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c  _INT_TO_PTR(p4),
15b0: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65   P4_INT32);.  re
15c0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
15d0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
15e0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
15f0: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
1600: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1610: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1620: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1630: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
1640: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
1650: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
1660: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
1670: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
1680: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
1690: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
16a0: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
16b0: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
16c0: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
16d0: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
16e0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
16f0: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
1700: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1710: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1720: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1730: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
1740: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
1750: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
1760: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
1770: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
1780: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
1790: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
17a0: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
17b0: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
17c0: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
17d0: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
17e0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
17f0: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
1800: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1810: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1820: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1830: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
1840: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
1850: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1860: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
1870: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
1880: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1890: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
18a0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
18b0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
18c0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
18d0: 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c   n = p->nLabelAl
18e0: 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 70  loc*2 + 5;.    p
18f0: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1900: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1910: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1920: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69 7a             n*siz
1950: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
1960: 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65  ));.    p->nLabe
1970: 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  lAlloc = sqlite3
1980: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
1990: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f 73  db, p->aLabel)/s
19a0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
19b0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0]);.  }.  if( p
19c0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
19d0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
19e0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
19f0: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
1a00: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1a10: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1a20: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1a30: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
1a40: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
1a50: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
1a60: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1a70: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1a80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
1a90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1aa0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
1ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ac0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
1ad0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
1ae0: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
1af0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1b00: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1b10: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1b20: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1b30: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1b40: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b50: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1b60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
1b70: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
1b80: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
1b90: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
1ba0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1bb0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
1bc0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
1bd0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
1be0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1bf0: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
1c00: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
1c10: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
1c20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1c30: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
1c40: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
1c50: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1c60: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
1c70: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
1c80: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
1c90: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
1ca0: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
1cb0: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
1cc0: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
1cd0: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
1ce0: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
1cf0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
1d00: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
1d10: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
1d20: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
1d30: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
1d40: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
1d50: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
1d80: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
1d90: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
1da0: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
1db0: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
1dc0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
1dd0: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
1de0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
1df0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
1e00: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
1e10: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
1e20: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
1e30: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
1e40: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
1e70: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
1e80: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
1e90: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
1ea0: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
1eb0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
1ec0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ef0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
1f00: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
1f30: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1f40: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
1f50: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
1f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
1f70: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
1f80: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
1f90: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
1fa0: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
1fb0: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
1fc0: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
1fd0: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
1fe0: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
1ff0: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
2000: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
2010: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
2020: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
2030: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
2040: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2050: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
2060: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
2070: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
2080: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
2090: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
20a0: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
20b0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20c0: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
20d0: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
20e0: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
20f0: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
2100: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
2110: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
2120: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
2130: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
2140: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
2150: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
2160: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
2170: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
2180: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
2190: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
21a0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
21b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
21c0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
21d0: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
21e0: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
21f0: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
2200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2210: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
2220: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
2230: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2240: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
2250: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
2260: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2270: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
2280: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
2290: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
22b0: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
22c0: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
22d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
2300: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
2310: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
2320: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
2330: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
2340: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
2350: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
2360: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
2370: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
2380: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
2390: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
23a0: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
23b0: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
23c0: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
23d0: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
23e0: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
23f0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
2400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2410: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
2420: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2430: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2440: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2450: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
2460: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
2470: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
2480: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
2490: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
24a0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
24b0: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
24c0: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
24d0: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
24e0: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
24f0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2500: 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54  straint).**.** T
2510: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
2520: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
2530: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
2540: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
2550: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
2560: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2570: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
2580: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
2590: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
25a0: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
25b0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
25c0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
25d0: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
25e0: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
25f0: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
2600: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
2610: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
2620: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
2630: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
2640: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
2650: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
2660: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
2670: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
2680: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
2690: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
26a0: 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  ort = 0;.  Op *p
26b0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72  Op;.  VdbeOpIter
26c0: 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74   sIter;.  memset
26d0: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
26e0: 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49  of(sIter));.  sI
26f0: 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68  ter.v = v;..  wh
2700: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2710: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21  erNext(&sIter))!
2720: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  =0 ){.    int op
2730: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
2740: 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  de;.    if( opco
2750: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c  de==OP_Destroy |
2760: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  | opcode==OP_VUp
2770: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
2780: 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e  OP_VRename .#ifn
2790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27a0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
27b0: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
27c0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
27d0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
27e0: 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20  p2==1) .#endif. 
27f0: 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d      || ((opcode=
2800: 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f  =OP_Halt || opco
2810: 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  de==OP_HaltIfNul
2820: 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 70 4f  l) .      && (pO
2830: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->p1==SQLITE_CO
2840: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
2850: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a  >p2==OE_Abort)).
2860: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73      ){.      has
2870: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  Abort = 1;.     
2880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2890: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
28a0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
28b0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
28c0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
28d0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
28e0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
28f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a  ailure occured..
2900: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
2910: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
2920: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
2930: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
2940: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
2950: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
2960: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
2970: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
2980: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
2990: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
29a0: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
29b0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
29c0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
29d0: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
29e0: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
29f0: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
2a00: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
2a10: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29  bort==mayAbort )
2a20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2a30: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
2a40: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2a50: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
2a60: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
2a70: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
2a80: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
2a90: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
2aa0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
2ab0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
2ac0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
2ad0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
2ae0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
2af0: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
2b00: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
2b10: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
2b20: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
2b30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2b40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
2b50: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
2b60: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
2b70: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
2b80: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
2b90: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
2ba0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
2bb0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
2bc0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
2bd0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
2be0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
2bf0: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
2c00: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
2c10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
2c20: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
2c30: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
2c40: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
2c50: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
2c60: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
2c70: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
2c80: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
2c90: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
2ca0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
2cb0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
2cc0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
2cd0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
2ce0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
2cf0: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
2d00: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
2d10: 79 20 3d 20 31 3b 0a 20 20 66 6f 72 28 70 4f 70  y = 1;.  for(pOp
2d20: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2d30: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2d40: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  pOp++){.    u8 o
2d50: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2d60: 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f  ode;..    pOp->o
2d70: 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pflags = sqlite3
2d80: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f  OpcodeProperty[o
2d90: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
2da0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
2db0: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
2dc0: 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20 20  P_AggStep ){.   
2dd0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e     if( pOp->p5>n
2de0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
2df0: 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  gs = pOp->p5;.  
2e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 63    }else if( (opc
2e10: 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74  ode==OP_Transact
2e20: 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21 3d  ion && pOp->p2!=
2e30: 30 29 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  0) || opcode==OP
2e40: 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  _Vacuum ){.     
2e50: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
2e60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2e70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e80: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
2e90: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2ea0: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ate ){.      if(
2eb0: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
2ec0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
2ed0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 65 6c 73  Op->p2;.    }els
2ee0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2ef0: 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  _VFilter ){.    
2f00: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61    int n;.      a
2f10: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
2f20: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
2f30: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
2f40: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
2f50: 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  er );.      n = 
2f60: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
2f70: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
2f80: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
2f90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
2fa0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
2fb0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
2fc0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
2fd0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
2fe0: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
2ff0: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
3000: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
3010: 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a  el[-1-pOp->p2];.
3020: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
3030: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
3040: 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70   p->aLabel);.  p
3050: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20  ->aLabel = 0;.. 
3060: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3070: 20 6e 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a   nMaxArgs;.}../*
3080: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
3090: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
30a0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
30b0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
30c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
30d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
30e0: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
30f0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3100: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3110: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3130: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3140: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3150: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
3160: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
3170: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
3180: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3190: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
31a0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
31b0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
31c0: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
31d0: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
31e0: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
31f0: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3200: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3210: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3220: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3230: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3240: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3250: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3260: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
3270: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
3280: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
3290: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
32a0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
32b0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
32c0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
32d0: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
32e0: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
32f0: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3300: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3310: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3320: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3330: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3340: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3350: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3360: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3370: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3380: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3390: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
33a0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
33b0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
33c0: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
33d0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
33e0: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
33f0: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3400: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3410: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3420: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3430: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3440: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3460: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3470: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3480: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3490: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
34a0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
34b0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
34c0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
34d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
34e0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
34f0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3500: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
3510: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
3520: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
3530: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3540: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
3550: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
3560: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
3570: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3580: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
3590: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
35a0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
35b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
35c0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
35d0: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
35e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
35f0: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
3600: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
3610: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
3620: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
3630: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
3640: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
3650: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
3660: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
3670: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
3680: 70 32 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33  p2<0 && (sqlite3
3690: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
36a0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  Out->opcode] & O
36b0: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b  PFLG_JUMP)!=0 ){
36c0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
36d0: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
36e0: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
36f0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
3700: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
3710: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
3720: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
3730: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
3740: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
3750: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
3760: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
3770: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
3780: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
3790: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
37a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
37c0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
37d0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
37e0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
37f0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
3800: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
3810: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
3820: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
3830: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
3840: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3850: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
3860: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
3870: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
3880: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
3890: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
38a0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
38b0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
38c0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
38d0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
38e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
38f0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
3900: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
3910: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
3920: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
3930: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3940: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
3950: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3960: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
3980: 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  r>=0 );.  if( p-
3990: 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20  >nOp>addr ){.   
39a0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
39b0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
39c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
39d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
39e0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
39f0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3a00: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3a10: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3a20: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3a30: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3a50: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3a60: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3a70: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3a80: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
3a90: 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20  t( addr>=0 );.  
3aa0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20  if( p->nOp>addr 
3ab0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3ac0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
3ad0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3ae0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3af0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
3b00: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
3b10: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3b20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3b30: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
3b40: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
3b50: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3b60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
3b70: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
3b80: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
3b90: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3ba0: 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p3 = val;.  }.}.
3bb0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3bc0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
3bd0: 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68  5 operand for th
3be0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a  e most recently.
3bf0: 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69  ** added operati
3c00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3c10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
3c20: 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29  Vdbe *p, u8 val)
3c30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3c40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
3c50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3c60: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
3c70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3c80: 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p5 = val;.  }.}
3c90: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3ca0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
3cb0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
3cc0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
3cd0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
3ce0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
3cf0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
3d00: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
3d10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
3d20: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
3d30: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73  int addr){.  ass
3d40: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
3d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3d60: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
3d70: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
3d80: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
3d90: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
3da0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
3db0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
3dc0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
3dd0: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
3de0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
3df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e00: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3e10: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
3e20: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
3e30: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
3e40: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
3e50: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3e60: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
3e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
3e80: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
3e90: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
3ea0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
3eb0: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
3ec0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
3ed0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
3ee0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
3ef0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3f00: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
3f10: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
3f20: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
3f30: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
3f40: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
3f50: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
3f60: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
3f70: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f80: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
3f90: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
3fa0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
3fb0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
3fc0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20  P4_INTARRAY:.   
3fd0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
3fe0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
3ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4000: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4020: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4030: 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20  4_MPRINTF: {.   
4040: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4050: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4060: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b  qlite3_free(p4);
4070: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4090: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
40a0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
40b0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
40c0: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
40d0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
40e0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
40f0: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
4100: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
4110: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4120: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
4130: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
4140: 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20  pVdbeFunc, 0);. 
4150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4160: 46 72 65 65 28 64 62 2c 20 70 56 64 62 65 46 75  Free(db, pVdbeFu
4170: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nc);.        bre
4180: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4190: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
41a0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
41b0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
41c0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
41d0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
41e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
41f0: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4200: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4210: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4220: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4230: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4240: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4250: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4260: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4270: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
4280: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4290: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
42a0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
42b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
42c0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
42d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
42e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
42f0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4300: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4310: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4320: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4330: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4340: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4350: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4360: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4370: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4380: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4390: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
43a0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
43b0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
43c0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
43d0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
43e0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
43f0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4400: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4420: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4430: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4440: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4450: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4460: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4470: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4480: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4490: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
44a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
44b0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
44c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
44d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44e0: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
44f0: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
4500: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71   .    }.  }.  sq
4510: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4520: 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  aOp);.}../*.** L
4530: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
4540: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
4550: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
4560: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
4570: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
4580: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
4590: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
45a0: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
45b0: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
45c0: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
45d0: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
45e0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
45f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4600: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
4610: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
4620: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
4630: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
4640: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
4650: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
4660: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
4670: 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61  ge N opcodes sta
4680: 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f  rting at addr to
4690: 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64   No-ops..*/.void
46a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
46b0: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
46c0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
46d0: 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70  N){.  if( p->aOp
46e0: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
46f0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
4700: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
4710: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
4720: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
4730: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4740: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4750: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
4760: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
4770: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
4780: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
4790: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
47a0: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
47b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
47c0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
47d0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
47e0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
47f0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4810: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
4820: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
4830: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
4840: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4850: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4860: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4870: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4880: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4890: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
48a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
48b0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
48c0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
48d0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
48e0: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
48f0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
4900: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4920: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
4930: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
4940: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4950: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4960: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4970: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4980: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4990: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
49a0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
49b0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
49c0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
49d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
49e0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
49f0: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
4a00: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
4a10: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
4a20: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4a30: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
4a40: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4a50: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4a60: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4a70: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4a80: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4a90: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4aa0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4ab0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4ac0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4ad0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4ae0: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
4af0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4b00: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
4b10: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
4b20: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
4b30: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
4b40: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4b50: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4b60: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4b70: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4b80: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4b90: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4ba0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4bb0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4bc0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4bd0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4be0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
4bf0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
4c00: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
4c10: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
4c20: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
4c30: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
4c40: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4c50: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4c60: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4c70: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4c80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4c90: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4ca0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4cc0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4cd0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4cf0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4d10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4d20: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4d30: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4d50: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4d60: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4d70: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4d80: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
4d90: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
4da0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
4db0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4dc0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
4dd0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
4de0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
4df0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
4e00: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
4e10: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
4e20: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
4e30: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4e40: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4e50: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
4e60: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
4e70: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
4e80: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
4e90: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
4ea0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
4eb0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
4ec0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
4ed0: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
4ee0: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
4ef0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
4f00: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
4f10: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
4f20: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
4f30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
4f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
4f50: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
4f60: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
4f70: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
4f80: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
4f90: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
4fa0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
4fb0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
4fc0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
4fd0: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
4fe0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
4ff0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
5000: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
5010: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
5020: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
5030: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
5040: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
5050: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
5060: 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  Byte);.    pOp->
5070: 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p4.pKeyInfo = pK
5080: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  eyInfo;.    if( 
5090: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
50a0: 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72    u8 *aSortOrder
50b0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28  ;.      memcpy((
50c0: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
50d0: 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69  zP4, nByte - nFi
50e0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72  eld);.      aSor
50f0: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
5100: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  o->aSortOrder;. 
5110: 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f 72       if( aSortOr
5120: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  der ){.        p
5130: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5140: 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  der = (unsigned 
5150: 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d  char*)&pKeyInfo-
5160: 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a  >aColl[nField];.
5170: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
5180: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
5190: 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c  der, aSortOrder,
51a0: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
51b0: 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74  }.      pOp->p4t
51c0: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
51d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
51e0: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
51f0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5200: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5210: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
5220: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  }.  }else if( n=
5230: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
5240: 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  OFF ){.    pOp->
5250: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5260: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5270: 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b  pe = P4_KEYINFO;
5280: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
5290: 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  P4_VTAB ){.    p
52a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
52b0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
52c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42  p4type = P4_VTAB
52d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
52e0: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  bLock((VTable *)
52f0: 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zP4);.    assert
5300: 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ( ((VTable *)zP4
5310: 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  )->db==p->db );.
5320: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20    }else if( n<0 
5330: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5340: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5350: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5360: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
5370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
5380: 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c  ( n==0 ) n = sql
5390: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34  ite3Strlen30(zP4
53a0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
53b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
53c0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
53d0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
53e0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
53f0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5400: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
5410: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
5420: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
5430: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
5440: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
5450: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
5460: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
5470: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
5480: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
5490: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
54a0: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
54b0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
54c0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
54d0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
54e0: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
54f0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
5500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
5510: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
5520: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5530: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
5540: 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20 29  t ap;.  if( !p )
5550: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
5560: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
5570: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
5580: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
5590: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
55a0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
55b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
55c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
55d0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
55e0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
55f0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
5600: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
5610: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
5620: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5630: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
5640: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
5650: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
5660: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5670: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5680: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5690: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
56a0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
56b0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
56c0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
56d0: 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  p;.  if( !p ) re
56e0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
56f0: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
5700: 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28  Noop);.  assert(
5710: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
5720: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
5730: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
5740: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5750: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
5760: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5770: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5780: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
5790: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
57a0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
57b0: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
57c0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
57d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
57e0: 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20  (p->db, *pz);.  
57f0: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
5800: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5810: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5820: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5830: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
5840: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
5850: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
5860: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
5870: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
5880: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
5890: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
58a0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
58b0: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
58c0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
58d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
58e0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
58f0: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
5900: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
5910: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
5920: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
5930: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
5940: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
5950: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
5960: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
5970: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
5980: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
5990: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
59a0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
59b0: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
59c0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
59d0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
59e0: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
59f0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74   a OOM fault wit
5a00: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
5a10: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
5a20: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
5a30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5a40: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
5a50: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
5a60: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
5a70: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
5a80: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
5a90: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
5aa0: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
5ab0: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
5ac0: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
5ad0: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
5ae0: 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65  .**.** About the
5af0: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
5b00: 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d  MIT_TRACE:  Norm
5b10: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
5b20: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
5b30: 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e  ed.** unless p->
5b40: 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20  nOp>0.  This is 
5b50: 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61  because in the a
5b60: 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45  bsense of SQLITE
5b70: 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20  _OMIT_TRACE,.** 
5b80: 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74  an OP_Trace inst
5b90: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ruction is alway
5ba0: 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71  s inserted by sq
5bb0: 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61  lite3VdbeGet() a
5bc0: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e  s soon as.** a n
5bd0: 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74  ew VDBE is creat
5be0: 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66  ed.  So we are f
5bf0: 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20  ree to set addr 
5c00: 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68  to p->nOp-1 with
5c10: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5c20: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   double-check to
5c30: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5c40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
5c50: 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a  n-negative. But.
5c60: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** if SQLITE_OMI
5c70: 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e  T_TRACE is defin
5c80: 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65  ed, the OP_Trace
5c90: 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
5ca0: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a  we do need to.**
5cb0: 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   check the value
5cc0: 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66   of p->nOp-1 bef
5cd0: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a  ore continuing..
5ce0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
5cf0: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
5d00: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
5d10: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
5d20: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
5d30: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
5d40: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
5d50: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
5d60: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
5d70: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
5d80: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
5d90: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
5da0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
5db0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
5dc0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
5dd0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
5de0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
5df0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
5e00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5e10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5e20: 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65 66  addr<0 ){.#ifdef
5e30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5e40: 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  CE.    if( p->nO
5e50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 56  p==0 ) return (V
5e60: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23  dbeOp*)&dummy;.#
5e70: 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20 3d  endif.    addr =
5e80: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
5e90: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
5ea0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
5eb0: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
5ec0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5ed0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
5ee0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
5ef0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
5f00: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
5f10: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
5f20: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
5f30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5f40: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5f50: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
5f60: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
5f70: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
5f80: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
5f90: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5fa0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
5fb0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
5fc0: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
5fd0: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
5fe0: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
5ff0: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
6000: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
6010: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
6020: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
6030: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
6040: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
6050: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
6060: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
6070: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
6080: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
6090: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
60a0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
60b0: 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73  _STATIC:.    cas
60c0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
60d0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
60e0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
60f0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
6100: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
6110: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6120: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6130: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
6140: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
6150: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ;.      i = sqli
6160: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
6170: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
6180: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
6190: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
61a0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
61b0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
61c0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
61d0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
61e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
61f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6200: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
6210: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
6220: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
6230: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6240: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
6250: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,4);.           
6260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6270: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54    }.          zT
6280: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[i++] = ',';.
6290: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b            if( pK
62a0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
62b0: 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e  er && pKeyInfo->
62c0: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
62d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65  .            zTe
62e0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
62f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6300: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
6310: 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  mp[i], pColl->zN
6320: 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ame,n+1);.      
6330: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
6340: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b      }else if( i+
6350: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  4<nTemp-6 ){.   
6360: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
6370: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34  Temp[i],",nil",4
6380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6390: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
63a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
63b0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  mp[i++] = ')';. 
63c0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20       zTemp[i] = 
63d0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
63e0: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20   i<nTemp );.    
63f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6400: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
6410: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
6420: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
6430: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
6440: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6450: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6460: 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29   "collseq(%.20s)
6470: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
6480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6490: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
64a0: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
64b0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
64c0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
64d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
64e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
64f0: 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20  Temp, "%s(%d)", 
6500: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
6510: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
6520: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6530: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
6540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6550: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6560: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a  zTemp, "%lld", *
6570: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20  pOp->p4.pI64);. 
6580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6590: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
65a0: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T32: {.      sql
65b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
65c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22  emp, zTemp, "%d"
65d0: 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20  , pOp->p4.i);.  
65e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
65f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
6600: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
6610: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6620: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
6630: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61  ", *pOp->p4.pRea
6640: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
6650: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6660: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
6670: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d  Mem *pMem = pOp-
6680: 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20  >p4.pMem;.      
6690: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
66a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
66b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
66c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
66d0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
66e0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
66f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6700: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
6710: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
6720: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6730: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6740: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
6750: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
6760: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6770: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
6780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6790: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
67a0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
67b0: 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d  Mem->r);.      }
67c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
67d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
67e0: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
67f0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28          zP4 = "(
6800: 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a  blob)";.      }.
6810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6820: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6830: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6840: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
6850: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
6860: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
6870: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
6880: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
6890: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
68a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
68b0: 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74  vtab:%p:%p", pVt
68c0: 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ab, pVtab->pModu
68d0: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
68e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
68f0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
6900: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
6910: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6920: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74  emp, zTemp, "int
6930: 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62  array");.      b
6940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6950: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
6960: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
6970: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6980: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67  mp, zTemp, "prog
6990: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
69a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
69b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
69c0: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
69d0: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
69e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
69f0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
6a00: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
6a10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6a20: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
6a30: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
6a40: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
6a50: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
6a60: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
6a70: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
6a80: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
6a90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
6aa0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6ab0: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
6ac0: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
6ad0: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
6ae0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6af0: 73 65 73 20 74 68 61 74 20 74 68 65 79 20 77 69  ses that they wi
6b00: 6c 6c 20 62 65 20 75 73 69 6e 67 2e 20 20 41 20  ll be using.  A 
6b10: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
6b20: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
6b30: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
6b40: 74 72 65 65 4d 61 73 6b 20 61 6e 64 20 69 73 20  treeMask and is 
6b50: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
6b60: 20 61 6e 64 20 6f 74 68 65 72 20 70 75 72 70 6f   and other purpo
6b70: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
6b80: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6b90: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
6ba0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
6bb0: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
6bc0: 62 20 26 26 20 69 3c 73 69 7a 65 6f 66 28 79 44  b && i<sizeof(yD
6bd0: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
6be0: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
6bf0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
6c00: 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65  )*8 );.  p->btre
6c10: 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61  eMask |= ((yDbMa
6c20: 73 6b 29 31 29 3c 3c 69 3b 0a 7d 0a 0a 2f 2a 0a  sk)1)<<i;.}../*.
6c30: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73  ** Compute the s
6c40: 75 6d 20 6f 66 20 61 6c 6c 20 6d 75 74 65 78 20  um of all mutex 
6c50: 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 61 6c 6c  counters for all
6c60: 20 62 74 72 65 65 73 20 69 6e 20 74 68 65 0a 2a   btrees in the.*
6c70: 2a 20 67 69 76 65 6e 20 70 72 65 70 61 72 65 64  * given prepared
6c80: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23   statement..*/.#
6c90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6ca0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
6cb0: 73 74 61 74 69 63 20 75 33 32 20 6d 75 74 65 78  static u32 mutex
6cc0: 43 6f 75 6e 74 65 72 53 75 6d 28 56 64 62 65 20  CounterSum(Vdbe 
6cd0: 2a 70 29 7b 0a 20 20 75 33 32 20 63 6e 74 53 75  *p){.  u32 cntSu
6ce0: 6d 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  m = 0;.#ifdef SQ
6cf0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
6d00: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
6d10: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
6d20: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 44 62 20  b = p->db;.  Db 
6d30: 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a  *aDb = db->aDb;.
6d40: 20 20 69 6e 74 20 6e 44 62 20 3d 20 64 62 2d 3e    int nDb = db->
6d50: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  nDb;.  for(i=0, 
6d60: 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69  mask=1; i<nDb; i
6d70: 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b  ++, mask += mask
6d80: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
6d90: 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 62 74  && (mask & p->bt
6da0: 72 65 65 4d 61 73 6b 29 21 3d 30 20 26 26 20 41  reeMask)!=0 && A
6db0: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
6dc0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  !=0) ){.      cn
6dd0: 74 53 75 6d 20 2b 3d 20 73 71 6c 69 74 65 33 42  tSum += sqlite3B
6de0: 74 72 65 65 4d 75 74 65 78 43 6f 75 6e 74 65 72  treeMutexCounter
6df0: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
6e00: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
6e10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6e20: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  (p);.#endif.  re
6e30: 74 75 72 6e 20 63 6e 74 53 75 6d 3b 0a 7d 0a 23  turn cntSum;.}.#
6e40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
6e50: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
6e60: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
6e70: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
6e80: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
6e90: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
6ea0: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
6eb0: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
6ec0: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
6ed0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
6ee0: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
6ef0: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
6f00: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
6f10: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
6f20: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
6f30: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
6f40: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
6f50: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
6f60: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
6f70: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
6f80: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
6f90: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
6fa0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
6fb0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
6fc0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
6fd0: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
6fe0: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
6ff0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
7000: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
7010: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
7020: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
7030: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
7040: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
7050: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
7060: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
7070: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
7080: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
7090: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
70a0: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
70b0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
70c0: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
70d0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
70e0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
70f0: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
7100: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
7110: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
7120: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
7130: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
7140: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
7150: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
7160: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
7170: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
7180: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
7190: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
71a0: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
71b0: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
71c0: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
71d0: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
71e0: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
71f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7200: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
7210: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
7220: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
7230: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
7240: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
7250: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
7260: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 6e 64 65  Vdbe *p){.#ifnde
7270: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
7280: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 6e 74  ARED_CACHE.  int
7290: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
72a0: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
72b0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 44 62 20  b = p->db;.  Db 
72c0: 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a  *aDb = db->aDb;.
72d0: 20 20 69 6e 74 20 6e 44 62 20 3d 20 64 62 2d 3e    int nDb = db->
72e0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  nDb;.  for(i=0, 
72f0: 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69  mask=1; i<nDb; i
7300: 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b  ++, mask += mask
7310: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
7320: 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 62 74  && (mask & p->bt
7330: 72 65 65 4d 61 73 6b 29 21 3d 30 20 26 26 20 41  reeMask)!=0 && A
7340: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
7350: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
7360: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
7370: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
7380: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69 4d 75 74   }.  }.  p->iMut
7390: 65 78 43 6f 75 6e 74 65 72 20 3d 20 6d 75 74 65  exCounter = mute
73a0: 78 43 6f 75 6e 74 65 72 53 75 6d 28 70 29 3b 0a  xCounterSum(p);.
73b0: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
73c0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
73d0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
73e0: 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62  ock all of the b
73f0: 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79  trees previously
7400: 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c   locked by a cal
7410: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
7420: 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Enter()..*/.void
7430: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
7440: 65 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 6e  e(Vdbe *p){.#ifn
7450: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7460: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
7470: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7480: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7490: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 44  *db = p->db;.  D
74a0: 62 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b *aDb = db->aDb
74b0: 3b 0a 20 20 69 6e 74 20 6e 44 62 20 3d 20 64 62  ;.  int nDb = db
74c0: 2d 3e 6e 44 62 3b 0a 0a 20 20 2f 2a 20 41 73 73  ->nDb;..  /* Ass
74d0: 65 72 74 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ert that the all
74e0: 20 6d 75 74 65 78 65 73 20 68 61 76 65 20 62 65   mutexes have be
74f0: 65 6e 20 68 65 6c 64 20 63 6f 6e 74 69 6e 6f 75  en held continou
7500: 73 6c 79 20 73 69 6e 63 65 0a 20 20 2a 2a 20 74  sly since.  ** t
7510: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
7520: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
7530: 29 20 6f 72 20 73 71 6c 69 74 65 33 56 64 62 65  ) or sqlite3Vdbe
7540: 4d 75 74 65 78 52 65 73 79 6e 63 28 29 2e 0a 20  MutexResync().. 
7550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 75   */.  assert( mu
7560: 74 65 78 43 6f 75 6e 74 65 72 53 75 6d 28 70 29  texCounterSum(p)
7570: 20 3d 3d 20 70 2d 3e 69 4d 75 74 65 78 43 6f 75   == p->iMutexCou
7580: 6e 74 65 72 20 29 3b 0a 0a 20 20 66 6f 72 28 69  nter );..  for(i
7590: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44  =0, mask=1; i<nD
75a0: 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20  b; i++, mask += 
75b0: 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69  mask){.    if( i
75c0: 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70  !=1 && (mask & p
75d0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 21 3d 30 20  ->btreeMask)!=0 
75e0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
75f0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
7600: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
7610: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
7620: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
7630: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7640: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 7d  TER(p);.#endif.}
7650: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
7660: 65 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  e the sum of the
7670: 20 6d 75 74 65 78 20 63 6f 75 6e 74 65 72 73 20   mutex counters 
7680: 6f 6e 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  on all btrees us
7690: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 70 72 65  ed by the.** pre
76a0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
76b0: 70 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  p..**.** Call th
76c0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 69 6c 65  is routine while
76d0: 20 68 6f 6c 64 69 6e 67 20 61 20 73 71 6c 69 74   holding a sqlit
76e0: 65 33 56 64 62 65 45 6e 74 65 72 28 29 20 61 66  e3VdbeEnter() af
76f0: 74 65 72 20 64 6f 69 6e 67 20 73 6f 6d 65 74 68  ter doing someth
7700: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  ing.** that migh
7710: 74 20 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d  t cause one or m
7720: 6f 72 65 20 6f 66 20 74 68 65 20 69 6e 64 69 76  ore of the indiv
7730: 69 64 75 61 6c 20 6d 75 74 65 78 65 73 20 68 65  idual mutexes he
7740: 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20 70 72 65  ld by the.** pre
7750: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
7760: 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2e 20  to be released. 
7770: 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
7780: 42 74 72 65 65 45 6e 74 65 72 28 29 20 6f 6e 20  BtreeEnter() on 
7790: 0a 2a 2a 20 61 6e 79 20 42 74 53 68 61 72 65 64  .** any BtShared
77a0: 20 6d 75 74 65 78 20 77 68 69 63 68 20 69 73 20   mutex which is 
77b0: 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20  not used by the 
77c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
77d0: 6e 74 20 69 73 20 6f 6e 65 0a 2a 2a 20 77 61 79  nt is one.** way
77e0: 20 74 6f 20 63 61 75 73 65 20 6f 6e 65 20 6f 72   to cause one or
77f0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 6d 75 74   more of the mut
7800: 65 78 65 73 20 69 6e 20 74 68 65 20 70 72 65 70  exes in the prep
7810: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a  ared statement.*
7820: 2a 20 74 6f 20 62 65 20 74 65 6d 70 6f 72 61 72  * to be temporar
7830: 69 6c 79 20 72 65 6c 65 61 73 65 64 2e 20 20 54  ily released.  T
7840: 68 65 20 61 6e 74 69 2d 64 65 61 64 6c 6f 63 6b  he anti-deadlock
7850: 69 6e 67 20 6c 6f 67 69 63 20 69 6e 0a 2a 2a 20  ing logic in.** 
7860: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
7870: 72 28 29 20 63 61 6e 20 63 61 75 73 65 20 6d 75  r() can cause mu
7880: 74 65 78 65 73 20 74 6f 20 62 65 20 72 65 6c 65  texes to be rele
7890: 61 73 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79  ased temporarily
78a0: 20 74 68 65 6e 0a 2a 2a 20 72 65 61 63 71 75 69   then.** reacqui
78b0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  red..**.** Calli
78c0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
78d0: 69 73 20 61 6e 20 61 63 6b 6e 6f 77 6c 65 64 67  is an acknowledg
78e0: 65 6d 65 6e 74 20 74 68 61 74 20 73 6f 6d 65 20  ement that some 
78f0: 6f 66 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  of the individua
7900: 6c 0a 2a 2a 20 6d 75 74 65 78 65 73 20 69 6e 20  l.** mutexes in 
7910: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
7920: 74 65 6d 65 6e 74 20 6d 69 67 68 74 20 68 61 76  tement might hav
7930: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
7940: 61 6e 64 20 72 65 61 63 71 75 69 72 65 64 2e 0a  and reacquired..
7950: 2a 2a 20 53 6f 20 63 68 65 63 6b 73 20 74 6f 20  ** So checks to 
7960: 76 65 72 69 66 79 20 74 68 61 74 20 6d 75 74 65  verify that mute
7970: 78 2d 70 72 6f 74 65 63 74 65 64 20 63 6f 6e 74  x-protected cont
7980: 65 6e 74 20 64 69 64 20 6e 6f 74 20 63 68 61 6e  ent did not chan
7990: 67 65 0a 2a 2a 20 75 6e 65 78 70 65 63 74 65 64  ge.** unexpected
79a0: 6c 79 20 73 68 6f 75 6c 64 20 61 63 63 6f 6d 70  ly should accomp
79b0: 61 6e 79 20 61 6e 79 20 63 61 6c 6c 20 74 6f 20  any any call to 
79c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
79d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
79e0: 65 4d 75 74 65 78 52 65 73 79 6e 63 28 56 64 62  eMutexResync(Vdb
79f0: 65 20 2a 70 29 7b 0a 23 69 66 20 21 64 65 66 69  e *p){.#if !defi
7a00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7a10: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
7a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7a30: 44 45 42 55 47 29 0a 20 20 70 2d 3e 69 4d 75 74  DEBUG).  p->iMut
7a40: 65 78 43 6f 75 6e 74 65 72 20 3d 20 6d 75 74 65  exCounter = mute
7a50: 78 43 6f 75 6e 74 65 72 53 75 6d 28 70 29 3b 0a  xCounterSum(p);.
7a60: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
7a70: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
7a80: 64 69 66 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dif.}..#if defin
7a90: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
7aa0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
7ab0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
7ac0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
7ad0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
7ae0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
7af0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
7b00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b10: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
7b20: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
7b30: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
7b40: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
7b50: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
7b60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
7b70: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
7b80: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
7b90: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
7ba0: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
7bb0: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
7bc0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
7bd0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
7be0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
7bf0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
7c00: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
7c10: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
7c20: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
7c30: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
7c40: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
7c50: 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20  pOp->p5,.#ifdef 
7c60: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
7c70: 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74     pOp->zComment
7c80: 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   ? pOp->zComment
7c90: 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20   : "".#else.    
7ca0: 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b    "".#endif.  );
7cb0: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
7cc0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7cd0: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
7ce0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
7cf0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
7d00: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
7d10: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
7d20: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
7d30: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
7d40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
7d50: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75  b = p->db;.    u
7d60: 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  8 malloc_failed 
7d70: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
7d80: 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ed;.    if( db->
7d90: 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a  pnBytesFreed ){.
7da0: 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26        for(pEnd=&
7db0: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
7dc0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
7dd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7de0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
7df0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   }.      return;
7e00: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
7e10: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
7e20: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61  d; p++){.      a
7e30: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
7e40: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
7e50: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20  =p[1].db );..   
7e60: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
7e70: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e   is really an in
7e80: 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  lined version of
7e90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7ea0: 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a  elease().      *
7eb0: 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76  * that takes adv
7ec0: 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61  antage of the fa
7ed0: 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ct that the memo
7ee0: 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73  ry cell value is
7ef0: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67   .      ** being
7f00: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74   set to NULL aft
7f10: 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79  er releasing any
7f20: 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
7f30: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
7f40: 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66     ** The justif
7f50: 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  ication for dupl
7f60: 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20  icating code is 
7f70: 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74  that according t
7f80: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  o .      ** call
7f90: 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73  grind, this caus
7fa0: 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73  es a certain tes
7fb0: 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68  t case to hit th
7fc0: 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20  e CPU 4.7 .     
7fd0: 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73   ** percent less
7fe0: 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63   (x86 linux, gcc
7ff0: 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20   version 4.1.2, 
8000: 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20  -O6) than if .  
8010: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65      ** sqlite3Me
8020: 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20  mRelease() were 
8030: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65  called from here
8040: 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73  . With -O2, this
8050: 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20   jumps.      ** 
8060: 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20  to 6.6 percent. 
8070: 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73  The test case is
8080: 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20   inserting 1000 
8090: 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c  rows into a tabl
80a0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  e .      ** with
80b0: 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e   no indexes usin
80c0: 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61  g a single prepa
80d0: 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  red INSERT state
80e0: 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20  ment, bind() .  
80f0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
8100: 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20  (). Inserts are 
8110: 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74  grouped into a t
8120: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
8130: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
8140: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
8150: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61  |MEM_Dyn|MEM_Fra
8160: 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29  me|MEM_RowSet) )
8170: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8180: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
8190: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
81a0: 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  if( p->zMalloc )
81b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
81c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
81d0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
81e0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b   p->zMalloc = 0;
81f0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8200: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  p->flags = MEM_N
8210: 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ull;.    }.    d
8220: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8230: 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b  = malloc_failed;
8240: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
8250: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
8260: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
8270: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
8280: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
8290: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
82a0: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
82b0: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
82c0: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
82d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
82e0: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
82f0: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
8300: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
8310: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
8320: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
8330: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
8340: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
8350: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
8360: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
8370: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
8380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
8390: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
83a0: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
83b0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
83c0: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
83d0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  m);.  sqlite3DbF
83e0: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
83f0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
8400: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8410: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
8420: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
8430: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
8440: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
8450: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
8460: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
8470: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
8480: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
8490: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
84a0: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
84b0: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
84c0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
84d0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
84e0: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
84f0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
8500: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
8510: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
8520: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
8530: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
8540: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
8550: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
8560: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
8570: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
8580: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
8590: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
85a0: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
85b0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
85c0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
85d0: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
85e0: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20  ERY PLAN..**.** 
85f0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
8600: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
8610: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
8620: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
8630: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
8640: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
8650: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
8660: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
8670: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
8680: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
8690: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
86a0: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
86b0: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
86e0: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
86f0: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
8700: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
8730: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
8740: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
8750: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8770: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
8780: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
8790: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87b0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
87c0: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
87d0: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
87e0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8800: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
8810: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
8820: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8850: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
8860: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8880: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
8890: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70  Mem *pMem = p->p
88a0: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
88b0: 61 4d 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46 69 72  aMem[1];  /* Fir
88c0: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
88d0: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72   set */..  asser
88e0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
88f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
8900: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
8910: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
8920: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
8930: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
8940: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
8950: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
8960: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
8970: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
8980: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
8990: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
89a0: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
89b0: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
89c0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
89d0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
89e0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
89f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
8a00: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
8a10: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
8a20: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
8a30: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
8a40: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a  rray(pMem, 8);..
8a50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8a60: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
8a70: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
8a80: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
8a90: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
8aa0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
8ab0: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
8ac0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
8ad0: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
8ae0: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
8af0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
8b00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b10: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
8b20: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
8b30: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
8b40: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
8b50: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
8b60: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
8b70: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
8b80: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
8b90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ba0: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
8bb0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
8bc0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
8bd0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
8be0: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
8bf0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
8c00: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
8c10: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
8c20: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
8c30: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
8c40: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
8c50: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
8c60: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
8c70: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
8c80: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
8c90: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
8ca0: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
8cb0: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
8cc0: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
8cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61  ;.  if( p->expla
8ce0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  in==1 ){.    /* 
8cf0: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
8d00: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
8d10: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
8d20: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
8d30: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
8d40: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
8d50: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
8d60: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
8d70: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
8d80: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
8d90: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
8da0: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
8db0: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
8dc0: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
8dd0: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
8de0: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
8df0: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
8e00: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
8e10: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
8e20: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
8e30: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
8e40: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
8e50: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
8e60: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
8e70: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
8e80: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
8e90: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
8ea0: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
8eb0: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
8ec0: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
8ed0: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
8ee0: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
8ef0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
8f00: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
8f10: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
8f20: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
8f30: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
8f40: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
8f50: 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
8f60: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
8f70: 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26  while( i<nRow &&
8f80: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
8f90: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
8fa0: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
8fb0: 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20  ;.  if( i>=nRow 
8fc0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
8fd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
8fe0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
8ff0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
9000: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
9010: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9020: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
9030: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
9040: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
9050: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
9060: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
9070: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
9080: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
9090: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
90a0: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  ;.    Op *pOp;. 
90b0: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
90c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
90d0: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
90e0: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
90f0: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
9100: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
9110: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
9120: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
9130: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
9140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9150: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
9160: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
9170: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
9180: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
9190: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
91a0: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
91b0: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
91c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
91d0: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
91e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d      for(j=0; i>=
91f0: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a  apSub[j]->nOp; j
9200: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d  ++){.        i -
9210: 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  = apSub[j]->nOp;
9220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9230: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
9240: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aOp[i];.    }.  
9250: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
9260: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
9270: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
9280: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
9290: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
92a0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
92b0: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
92e0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
92f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
9300: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
9310: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
9320: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
9330: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
9340: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
9350: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
9360: 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70  >opcode);  /* Op
9370: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
9380: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
9390: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
93a0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
93b0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
93c0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
93d0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
93e0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
93f0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
9400: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9410: 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f    /* When an OP_
9420: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
9430: 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65  s encounter (the
9440: 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61   only opcode tha
9450: 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61  t has.      ** a
9460: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61   P4_SUBPROGRAM a
9470: 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64  rgument), expand
9480: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
9490: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
94a0: 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b  grams.      ** k
94b0: 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39  ept in p->aMem[9
94c0: 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ].z to hold the 
94d0: 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73  new program - as
94e0: 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70  suming this subp
94f0: 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20  rogram.      ** 
9500: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
9510: 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20  been seen..     
9520: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
9530: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
9540: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
9550: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
9560: 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  (nSub+1)*sizeof(
9570: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
9580: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
9590: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
95a0: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
95b0: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
95c0: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
95d0: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
95e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
95f0: 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53  if( j==nSub && S
9600: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
9610: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
9620: 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29 7b 0a  b, nByte, 1) ){.
9630: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
9640: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
9650: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
9660: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
9670: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
9680: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
9690: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
96a0: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
96b0: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
96c0: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
96d0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
96e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
96f0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9700: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
9710: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
9720: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9740: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
9750: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
9760: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
9770: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
9780: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
9790: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
97a0: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
97d0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
97e0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
97f0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
9800: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
9810: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
9820: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
9850: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9860: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
9870: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9880: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
9890: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
98a0: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
98b0: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
98c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
98d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
98e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
98f0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
9900: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
9910: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
9920: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
9930: 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70   z = displayP4(p
9940: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
9950: 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65  ;.    if( z!=pMe
9960: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  m->z ){.      sq
9970: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
9980: 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20  tr(pMem, z, -1, 
9990: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
99a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
99b0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
99c0: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
99d0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
99e0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
99f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
9a00: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9a10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
9a20: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
9a30: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  EXT;.    pMem++;
9a40: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
9a50: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
9a60: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9a70: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c  MemGrow(pMem, 4,
9a80: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   0) ){.        a
9a90: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
9aa0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9ab0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9ac0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
9ad0: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
9ae0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
9af0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
9b00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
9b10: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
9b20: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
9b30: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
9b40: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
9b50: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
9b60: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
9b70: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
9b80: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
9b90: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
9ba0: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
9bb0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
9bc0: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
9bd0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
9be0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
9bf0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
9c00: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
9c10: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
9c20: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
9c30: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
9c40: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
9c50: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
9c60: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
9c70: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9c80: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
9c90: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
9ca0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
9cb0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9cc0: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9ce0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
9cf0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9d00: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
9d10: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
9d20: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
9d30: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
9d40: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
9d50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9d60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
9d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9d80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9d90: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9da0: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
9db0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
9dc0: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
9dd0: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
9de0: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
9df0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
9e00: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
9e10: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
9e20: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
9e30: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
9e40: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
9e50: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
9e60: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
9e70: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
9e80: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
9e90: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
9ea0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
9eb0: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
9ec0: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
9ed0: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
9ee0: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b    printf("SQL: [
9ef0: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a  %s]\n", z);.  }.
9f00: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
9f10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9f20: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
9f30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9f40: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
9f50: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
9f60: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
9f70: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
9f80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9f90: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
9fa0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
9fb0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
9fc0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
9fd0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
9fe0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
9ff0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
a000: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
a010: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
a020: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
a030: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
a040: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
a050: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
a060: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
a070: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
a080: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
a090: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
a0a0: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
a0b0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
a0c0: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
a0d0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
a0e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
a0f0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
a100: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
a110: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
a120: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
a130: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
a140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a150: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
a160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a170: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
a180: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
a190: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
a1a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
a1b0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
a1c0: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
a1d0: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
a1e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
a1f0: 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65  pace from a fixe
a200: 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e  d size buffer an
a210: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
a220: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70  er to.** that sp
a230: 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ace.  If insuffi
a240: 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61  cient space is a
a250: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
a260: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
a270: 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20   pBuf parameter 
a280: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
a290: 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65  alue of a pointe
a2a0: 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20  r which will.** 
a2b0: 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20  receive the new 
a2c0: 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73  memory.  pBuf is
a2d0: 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20   normally NULL. 
a2e0: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a   If pBuf is not.
a2f0: 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ** NULL, it mean
a300: 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70  s that memory sp
a310: 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ace has already 
a320: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
a330: 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  nd that.** this 
a340: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
a350: 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20  ot allocate any 
a360: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  new memory.  Whe
a370: 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  n pBuf is not.**
a380: 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74   NULL simply ret
a390: 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20  urn pBuf.  Only 
a3a0: 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d  allocate new mem
a3b0: 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70  ory space when p
a3c0: 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a  Buf.** is NULL..
a3d0: 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74  **.** nByte is t
a3e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a3f0: 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64  es of space need
a400: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f  ed..**.** *ppFro
a410: 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69  m points to avai
a420: 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20  lable space and 
a430: 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74  pEnd points to t
a440: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
a450: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
a460: 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73  .  When space is
a470: 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46   allocated, *ppF
a480: 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20  rom is advanced 
a490: 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  past.** the end 
a4a0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
a4b0: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70   space..**.** *p
a4c0: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74  nByte is a count
a4d0: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
a4e0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
a4f0: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
a500: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
a510: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
a520: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
a530: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74  ace in *ppFrom t
a540: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
a550: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
a560: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
a570: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
a580: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
a590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61  /.static void *a
a5a0: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69  llocSpace(.  voi
a5b0: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
a5c0: 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72    /* Where retur
a5d0: 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62  n pointer will b
a5e0: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  e stored */.  in
a5f0: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
a600: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a610: 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  bytes to allocat
a620: 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72  e */.  u8 **ppFr
a630: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  om,         /* I
a640: 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20  N/OUT: Allocate 
a650: 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a  from *ppFrom */.
a660: 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20    u8 *pEnd,     
a670: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
a680: 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74  r to 1 byte past
a690: 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46   the end of *ppF
a6a0: 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  rom buffer */.  
a6b0: 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20  int *pnByte     
a6c0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63       /* If alloc
a6d0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
a6e0: 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20  made, increment 
a6f0: 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20  *pnByte */.){.  
a700: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
a710: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70  TE_ALIGNMENT(*pp
a720: 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70  From) );.  if( p
a730: 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75  Buf ) return pBu
a740: 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  f;.  nByte = ROU
a750: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  ND8(nByte);.  if
a760: 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79  ( &(*ppFrom)[nBy
a770: 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20  te] <= pEnd ){. 
a780: 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
a790: 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70  )*ppFrom;.    *p
a7a0: 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a  pFrom += nByte;.
a7b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e    }else{.    *pn
a7c0: 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Byte += nByte;. 
a7d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66   }.  return pBuf
a7e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
a7f0: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
a800: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
a810: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  on.  This involv
a820: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
a830: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
a840: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
a850: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
a860: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
a870: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
a880: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
a890: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
a8a0: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
a8b0: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
a8c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
a8d0: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
a8e0: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
a8f0: 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45  y to move a VDBE
a900: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
a910: 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45  _INIT to.** VDBE
a920: 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a  _MAGIC_RUN..**.*
a930: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a940: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f  may be called mo
a950: 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20  re than once on 
a960: 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61 6c  a single virtual
a970: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65   machine..** The
a980: 20 66 69 72 73 74 20 63 61 6c 6c 20 69 73 20 6d   first call is m
a990: 61 64 65 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c  ade while compil
a9a0: 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 61 74  ing the SQL stat
a9b0: 65 6d 65 6e 74 2e 20 53 75 62 73 65 71 75 65 6e  ement. Subsequen
a9c0: 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d  t.** calls are m
a9d0: 61 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74  ade as part of t
a9e0: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 72 65  he process of re
a9f0: 73 65 74 74 69 6e 67 20 61 20 73 74 61 74 65 6d  setting a statem
aa00: 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d  ent to be.** re-
aa10: 65 78 65 63 75 74 65 64 20 28 66 72 6f 6d 20 61  executed (from a
aa20: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
aa30: 5f 72 65 73 65 74 28 29 29 2e 20 54 68 65 20 6e  _reset()). The n
aa40: 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73  Var, nMem, nCurs
aa50: 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70  or .** and isExp
aa60: 6c 61 69 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lain parameters 
aa70: 61 72 65 20 6f 6e 6c 79 20 70 61 73 73 65 64 20  are only passed 
aa80: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 73 20 74  correct values t
aa90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
aaa0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
aab0: 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73   called. On subs
aac0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72  equent calls, fr
aad0: 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  om sqlite3_reset
aae0: 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70  (), nVar.** is p
aaf0: 61 73 73 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65  assed -1 and nMe
ab00: 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e 64 20 69  m, nCursor and i
ab10: 73 45 78 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c  sExplain are all
ab20: 20 70 61 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f   passed zero..*/
ab30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
ab40: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
ab50: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab70: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  The VDBE */.  in
ab80: 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20  t nVar,         
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aba0: 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65  Number of '?' se
abb0: 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61  e in the SQL sta
abc0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
abd0: 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20  nMem,           
abe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
abf0: 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63  mber of memory c
ac00: 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ells to allocate
ac10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
ac20: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
ac30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ac40: 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  f cursors to all
ac50: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
ac60: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
ac70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
ac80: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
ac90: 72 67 73 20 69 6e 20 53 75 62 50 72 6f 67 72 61  rgs in SubProgra
aca0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78  ms */.  int isEx
acb0: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
acc0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
acd0: 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  f the EXPLAIN ke
ace0: 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e  ywords is presen
acf0: 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 73 53  t */.  int usesS
ad00: 74 6d 74 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20  tmtJournal      
ad10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
ad20: 20 73 65 74 20 56 64 62 65 2e 75 73 65 73 53 74   set Vdbe.usesSt
ad30: 6d 74 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a  mtJournal */.){.
ad40: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
ad50: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
ad60: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
ad70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ad80: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
ad90: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
ada0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
adb0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
adc0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
add0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
ade0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
adf0: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
ae00: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
ae10: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
ae20: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
ae30: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
ae40: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63  .  /* For each c
ae50: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20  ursor required, 
ae60: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  also allocate a 
ae70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d  memory cell. Mem
ae80: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28  ory.  ** cells (
ae90: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e  nMem+1-nCursor).
aea0: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65  .nMem, inclusive
aeb0: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  , will never be 
aec0: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  used by.  ** the
aed0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49   vdbe program. I
aee0: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20  nstead they are 
aef0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
af00: 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20   space for.  ** 
af10: 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72  VdbeCursor/BtCur
af20: 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  sor structures. 
af30: 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  The blob of memo
af40: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
af50: 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20  th .  ** cursor 
af60: 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  0 is stored in m
af70: 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e  emory cell nMem.
af80: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d   Memory cell (nM
af90: 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65  em-1).  ** store
afa0: 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  s the blob of me
afb0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
afc0: 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65  with cursor 1, e
afd0: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65  tc..  **.  ** Se
afe0: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
aff0: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
b000: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
b010: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
b020: 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
b030: 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c  y registers, SQL
b040: 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45   variables, VDBE
b050: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20   cursors and .  
b060: 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d  ** an array to m
b070: 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74  arshal SQL funct
b080: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  ion arguments in
b090: 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64  . This is only d
b0a0: 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72  one the.  ** fir
b0b0: 73 74 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e  st time this fun
b0c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
b0d0: 66 6f 72 20 61 20 67 69 76 65 6e 20 56 44 42 45  for a given VDBE
b0e0: 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73  , not when it is
b0f0: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c  .  ** being call
b100: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
b110: 72 65 73 65 74 28 29 20 74 6f 20 72 65 73 65 74  reset() to reset
b120: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
b130: 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hine..  */.  if(
b140: 20 6e 56 61 72 3e 3d 30 20 26 26 20 41 4c 57 41   nVar>=0 && ALWA
b150: 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  YS(db->mallocFai
b160: 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75  led==0) ){.    u
b170: 38 20 2a 7a 43 73 72 20 3d 20 28 75 38 20 2a 29  8 *zCsr = (u8 *)
b180: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
b190: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
b1a0: 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61   avaliable for a
b1b0: 6c 6c 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  lloation */.    
b1c0: 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75 38 20 2a  u8 *zEnd = (u8 *
b1d0: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41  )&p->aOp[p->nOpA
b1e0: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
b1f0: 20 62 79 74 65 20 70 61 73 74 20 61 76 61 69 6c   byte past avail
b200: 61 62 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 20 20  able mem */.    
b210: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d          /* How m
b240: 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79  uch extra memory
b250: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 20 20   needed */..    
b260: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
b270: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 70  p, &nArg);.    p
b280: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
b290: 6c 20 3d 20 28 75 38 29 75 73 65 73 53 74 6d 74  l = (u8)usesStmt
b2a0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 69 66 28  Journal;.    if(
b2b0: 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d   isExplain && nM
b2c0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e  em<10 ){.      n
b2d0: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a  Mem = 10;.    }.
b2e0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c      memset(zCsr,
b2f0: 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a   0, zEnd-zCsr);.
b300: 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73      zCsr += (zCs
b310: 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20  r - (u8*)0)&7;. 
b320: 20 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54     assert( EIGHT
b330: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
b340: 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  zCsr) );..    /*
b350: 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69   Memory for regi
b360: 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72  sters, parameter
b370: 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20  s, cursor, etc, 
b380: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  is allocated in 
b390: 74 77 6f 0a 20 20 20 20 2a 2a 20 70 61 73 73 65  two.    ** passe
b3a0: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
b3b0: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
b3c0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
b3d0: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 20 20  ace at the .    
b3e0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
b3f0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
b400: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
b410: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
b420: 6f 72 79 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  ory.    ** requi
b430: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
b440: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
b450: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
b460: 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
b470: 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20   pass will fill 
b480: 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e  in the rest usin
b490: 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61  g a fresh alloca
b4a0: 74 69 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  tion.  .    **. 
b4b0: 20 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70     ** This two-p
b4c0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
b4d0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
b4e0: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
b4f0: 62 6c 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ble from.    ** 
b500: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61  the leftover spa
b510: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
b520: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
b530: 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e  y can significan
b540: 74 6c 79 0a 20 20 20 20 2a 2a 20 72 65 64 75 63  tly.    ** reduc
b550: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
b560: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
b570: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
b580: 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
b590: 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  do {.      nByte
b5a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
b5b0: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
b5c0: 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73  (p->aMem, nMem*s
b5d0: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
b5e0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b5f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20  ;.      p->aVar 
b600: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b610: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
b620: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
b630: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b640: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
b650: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41  llocSpace(p->apA
b660: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
b670: 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  Mem*), &zCsr, zE
b680: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b690: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c     p->azVar = al
b6a0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61  locSpace(p->azVa
b6b0: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  r, nVar*sizeof(c
b6c0: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  har*), &zCsr, zE
b6d0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b6e0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
b6f0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73  locSpace(p->apCs
b700: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
b710: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a  f(VdbeCursor*),.
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
b740: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b750: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74  ;.      if( nByt
b760: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e ){.        p->
b770: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
b780: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
b790: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nByte);.      }.
b7a0: 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e        zCsr = p->
b7b0: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a 45 6e  pFree;.      zEn
b7c0: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d  d = &zCsr[nByte]
b7d0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 42  ;.    }while( nB
b7e0: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
b7f0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20  ocFailed );..   
b800: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
b810: 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20  16)nCursor;.    
b820: 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20  if( p->aVar ){. 
b830: 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28       p->nVar = (
b840: 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
b850: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
b860: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; n++){.       
b870: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
b880: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
b890: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b8a0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
b8b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
b8c0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 20  p->aMem ){.     
b8d0: 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20   p->aMem--;     
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20   /* aMem[] goes 
b900: 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a  from 1..nMem */.
b910: 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
b920: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
b930: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
b940: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
b950: 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e  1 */.      for(n
b960: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
b970: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d  ){.        p->aM
b980: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
b990: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
b9a0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
b9b0: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
b9c0: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
b9d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
b9e0: 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20  n=1; n<p->nMem; 
b9f0: 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  n++){.    assert
ba00: 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d  ( p->aMem[n].db=
ba10: 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  =db );.  }.#endi
ba20: 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  f..  p->pc = -1;
ba30: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
ba40: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
ba50: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
ba60: 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  t;.  p->explain 
ba70: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
ba80: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
ba90: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
baa0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
bab0: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
bac0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
bad0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
bae0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
baf0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
bb00: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
bb10: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
bb20: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
bb30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
bb40: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
bb50: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
bb60: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
bb70: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
bb80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
bb90: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
bba0: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
bbb0: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
bbc0: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
bbd0: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
bbe0: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
bbf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bc00: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
bc10: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
bc20: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
bc30: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
bc40: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  n;.  }.  if( pCx
bc50: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
bc60: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
bc70: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
bc80: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
bc90: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
bca0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
bcb0: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
bcc0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
bcd0: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
bce0: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
bcf0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
bd00: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
bd10: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
bd20: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
bd30: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
bd40: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
bd50: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
bd60: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
bd70: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
bd80: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
bd90: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
bda0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
bdb0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
bdc0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
bdd0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
bde0: 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d   1;.    pModule-
bdf0: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
be00: 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  sor);.    p->inV
be10: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
be20: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
be30: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
be40: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
be50: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
be60: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
be70: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
be80: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
be90: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
bea0: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
beb0: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
bec0: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
bed0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
bee0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
bef0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
bf00: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
bf10: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
bf20: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61  Frame->v;.  v->a
bf30: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
bf40: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
bf50: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
bf60: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
bf70: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
bf80: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
bf90: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
bfa0: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
bfb0: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
bfc0: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
bfd0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
bfe0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
bff0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
c000: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
c010: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
c020: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
c030: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
c040: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
c050: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
c060: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
c070: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
c080: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
c090: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
c0a0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
c0b0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
c0c0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
c0d0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
c0e0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
c0f0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
c100: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
c110: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
c120: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
c130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c140: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
c150: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
c160: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
c170: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
c180: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
c190: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
c1a0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
c1b0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
c1c0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
c1d0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
c1e0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a  re(pFrame);.  }.
c1f0: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
c200: 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30  .  p->nFrame = 0
c210: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ;..  if( p->apCs
c220: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
c230: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c240: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
c250: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
c260: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
c270: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
c280: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
c290: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
c2a0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
c2b0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
c2c0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
c2d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
c2e0: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
c2f0: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
c300: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
c310: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
c320: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
c330: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
c340: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
c350: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
c360: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
c370: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
c380: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
c390: 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pDel);.  }.}../*
c3a0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
c3b0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
c3c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
c3d0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
c3e0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
c3f0: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
c400: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
c410: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
c420: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
c430: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
c440: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
c450: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
c460: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
c470: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
c480: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
c490: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c4a0: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  >db;..#ifdef SQL
c4b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
c4c0: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
c4d0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
c4e0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
c4f0: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
c500: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
c510: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
c520: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
c530: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  d up.  */.  int 
c540: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c550: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
c560: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
c570: 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72  r==0 || p->apCsr
c580: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  [i]==0 );.  for(
c590: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  i=1; i<=p->nMem;
c5a0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
c5b0: 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61  >aMem==0 || p->a
c5c0: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
c5d0: 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66  M_Null );.#endif
c5e0: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
c5f0: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
c600: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
c610: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
c620: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
c630: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
c640: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
c650: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
c660: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
c670: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
c680: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
c690: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
c6a0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
c6b0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
c6c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
c6d0: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
c6e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c6f0: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
c700: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
c710: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
c720: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
c730: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
c740: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c750: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
c760: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
c770: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
c780: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
c790: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
c7a0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c7b0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
c7c0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c7d0: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
c7e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
c7f0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
c800: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c810: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
c820: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
c830: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
c840: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
c850: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
c860: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c870: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
c880: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
c890: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
c8a0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
c8b0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
c8c0: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
c8d0: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
c8e0: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
c8f0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
c900: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
c910: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c920: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
c930: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
c940: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
c950: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
c960: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
c970: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
c980: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
c990: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
c9a0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
c9b0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
c9c0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
c9d0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
c9e0: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
c9f0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
ca00: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
ca10: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
ca20: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
ca30: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
ca40: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
ca50: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
ca60: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
ca70: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
ca80: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
ca90: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
caa0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
cab0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
cac0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cad0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
cb00: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
cb10: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
cb40: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
cb50: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
cb60: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb80: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
cb90: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
cba0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
cbb0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
cbc0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
cbd0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
cbe0: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
cbf0: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
cc00: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
cc10: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
cc20: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
cc30: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
cc40: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
cc50: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
cc60: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
cc70: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
cc80: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
cc90: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
cca0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ccb0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
ccc0: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
ccd0: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
cce0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ccf0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
cd00: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
cd10: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
cd20: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
cd30: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
cd40: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
cd50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
cd60: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
cd70: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
cd80: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
cd90: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
cda0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
cdb0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
cdc0: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
cdd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cde0: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
cdf0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
ce00: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
ce10: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
ce20: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
ce30: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
ce40: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
ce50: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
ce60: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
ce70: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
ce80: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
ce90: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
cea0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
ceb0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
cec0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ced0: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
cee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
cef0: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
cf00: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
cf10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
cf20: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
cf30: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
cf40: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
cf50: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
cf60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
cf70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cf80: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
cf90: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
cfa0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
cfb0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
cfc0: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
cfd0: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
cfe0: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
cff0: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
d000: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
d010: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
d020: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d030: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
d040: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
d050: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
d060: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
d070: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
d080: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
d090: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
d0a0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
d0b0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
d0c0: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
d0d0: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
d0e0: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
d0f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d100: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
d110: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
d120: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
d130: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
d140: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
d150: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
d160: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
d170: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
d180: 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20  &p->zErrMsg);.. 
d190: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
d1a0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
d1b0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
d1c0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
d1d0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
d1e0: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
d1f0: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
d200: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
d210: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
d220: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
d230: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
d240: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
d250: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
d260: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
d270: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
d280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
d290: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
d2a0: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
d2b0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
d2c0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
d2d0: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
d2e0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d2f0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d300: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
d310: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d320: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
d330: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
d340: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
d350: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
d360: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
d370: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
d380: 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  +;.      rc = sq
d390: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
d3a0: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
d3b0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
d3c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d3d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d3e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d3f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d400: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
d410: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
d420: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
d430: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
d440: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
d450: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
d460: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
d470: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
d480: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
d490: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
d4a0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
d4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
d4c0: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20  STRAINT;.    }. 
d4d0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
d4e0: 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
d4f0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
d500: 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
d510: 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
d520: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
d530: 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
d540: 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
d550: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
d560: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
d570: 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
d580: 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
d590: 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
d5a0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
d5b0: 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
d5c0: 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
d5d0: 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
d5e0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
d5f0: 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
d600: 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
d610: 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
d620: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
d630: 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
d640: 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
d650: 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
d660: 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
d670: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
d680: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d690: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d6a0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
d6b0: 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
d6c0: 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
d6d0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d6e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d6f0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d700: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d710: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d720: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d730: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d740: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d750: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
d760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d770: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
d780: 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
d790: 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
d7a0: 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
d7b0: 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
d7c0: 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
d7d0: 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
d7e0: 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
d7f0: 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
d800: 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
d810: 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
d820: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d830: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
d840: 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
d850: 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
d860: 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
d870: 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
d880: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
d890: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
d8a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
d8b0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
d8c0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
d8d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
d8e0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d8f0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d900: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
d910: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d920: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d930: 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
d940: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d950: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d960: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d970: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
d980: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d990: 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
d9a0: 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
d9b0: 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
d9c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
d9d0: 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
d9e0: 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
d9f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
da00: 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
da10: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
da20: 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c  ommitted atomicl
da30: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
da40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
da50: 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
da60: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
da70: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
da80: 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
da90: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  0;.    char *zMa
daa0: 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
dab0: 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
dac0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
dad0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
dae0: 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
daf0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
db00: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
db10: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
db20: 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
db30: 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
db40: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
db50: 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20  nt res;..    /* 
db60: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
db70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
db80: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
db90: 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
dba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
dbb0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
dbc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dbd0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
dbe0: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
dbf0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
dc00: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
dc10: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
dc20: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
dc30: 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66  e, iRandom&0x7ff
dc40: 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66  fffff);.      if
dc50: 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !zMaster ){.  
dc60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
dc70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
dc80: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
dc90: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
dca0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
dcb0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
dcc0: 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
dcd0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
dce0: 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
dcf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
dd10: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
dd20: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
dd30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dd40: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
dd50: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
dd60: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
dd70: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
dd80: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
dd90: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
dda0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
ddb0: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
ddc0: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
ddd0: 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
dde0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
ddf0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
de00: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
de10: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
de20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
de30: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
de40: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
de50: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
de60: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
de70: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
de80: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
de90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
dea0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
deb0: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
dec0: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
ded0: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
dee0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
def0: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
df00: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
df10: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
df20: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
df30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
df40: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
df50: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
df60: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
df70: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
df80: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
df90: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
dfa0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
dfb0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
dfc0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
dfd0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
dfe0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
dff0: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
e000: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
e010: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
e020: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
e030: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
e040: 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
e050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
e060: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
e070: 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
e080: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
e090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e0a0: 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
e0b0: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
e0c0: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
e0d0: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
e0e0: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
e0f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
e100: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
e110: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
e120: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
e130: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
e140: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
e150: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
e160: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
e170: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
e180: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
e190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e1a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e1b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e1c0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
e1d0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
e1e0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
e1f0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
e200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e210: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e220: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
e230: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e250: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
e260: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
e270: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
e280: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
e290: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
e2a0: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
e2b0: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
e2c0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
e2d0: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
e2e0: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
e2f0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
e300: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
e310: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
e320: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
e330: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
e340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
e350: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
e360: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
e370: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
e380: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
e390: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
e3a0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e3b0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
e3c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
e3d0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e3e0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
e3f0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
e400: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
e410: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
e420: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
e430: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
e440: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
e450: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e460: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
e470: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
e480: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
e490: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e4a0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
e4b0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e4c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e4d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
e4e0: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
e4f0: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
e500: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
e510: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
e520: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
e530: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
e540: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
e550: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
e560: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
e570: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
e580: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
e590: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
e5a0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
e5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
e5c0: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
e5d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e5e0: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
e5f0: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
e600: 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
e610: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
e620: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
e630: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
e640: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e650: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e660: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
e670: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e680: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
e690: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
e6a0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
e6b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e6c0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
e6d0: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
e6e0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
e6f0: 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
e700: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e710: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e720: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e730: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e740: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e750: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
e760: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
e770: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
e780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
e790: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
e7a0: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
e7b0: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
e7c0: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
e7d0: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
e7e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
e7f0: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
e800: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
e810: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
e820: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
e830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e840: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e850: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
e860: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
e870: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
e880: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
e890: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
e8a0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
e8b0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
e8c0: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
e8d0: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
e8e0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
e8f0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
e900: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
e910: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
e920: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
e930: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
e940: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
e950: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
e960: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
e970: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
e980: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
e990: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
e9a0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
e9b0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
e9c0: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
e9d0: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
e9e0: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
e9f0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
ea00: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
ea10: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
ea20: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
ea30: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
ea40: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
ea50: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
ea60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
ea70: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
ea80: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
ea90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
eaa0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
eab0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
eac0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ead0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
eae0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
eaf0: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
eb00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
eb10: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
eb20: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
eb30: 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
eb40: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
eb50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
eb60: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
eb70: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
eb80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
eb90: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
eba0: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
ebb0: 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e  te3.activeVdbeCn
ebc0: 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  t count variable
ebd0: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
ebe0: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
ebf0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
ec00: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
ec10: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
ec20: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
ec30: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
ec40: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
ec50: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
ec60: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
ec70: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
ec80: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
ec90: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
eca0: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
ecb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
ecc0: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
ecd0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
ece0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
ecf0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
ed00: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
ed10: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
ed20: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
ed30: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  = 0;.  int nWrit
ed40: 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  e = 0;.  p = db-
ed50: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
ed60: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
ed70: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
ed80: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
ed90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
eda0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
edb0: 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57  readOnly==0 ) nW
edc0: 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rite++;.    }.  
edd0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
ede0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
edf0: 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t==db->activeVdb
ee00: 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  eCnt );.  assert
ee10: 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72  ( nWrite==db->wr
ee20: 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a  iteVdbeCnt );.}.
ee30: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
ee40: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
ee50: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
ee60: 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65  * For every Btre
ee70: 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61  e that in databa
ee80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
ee90: 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62   which .** has b
eea0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74  een modified, "t
eeb0: 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61  rip" or invalida
eec0: 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69  te each cursor i
eed0: 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20  n.** that Btree 
eee0: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
eef0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74  modified so that
ef00: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
ef10: 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  an never be used
ef20: 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61   again.  This ha
ef30: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c  ppens when a rol
ef40: 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73  lback.*** occurs
ef50: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72  .  We have to tr
ef60: 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  ip all the other
ef70: 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a   cursors, even.*
ef80: 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74  * cursor from ot
ef90: 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65  her VMs in diffe
efa0: 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f  rent database co
efb0: 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f  nnections,.** so
efc0: 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
efd0: 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  em try to use th
efe0: 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20  e data at which 
eff0: 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69  they.** were poi
f000: 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20  nting and which 
f010: 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65  now may have bee
f020: 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a  n changed due.**
f030: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
f040: 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ..**.** Remember
f050: 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b   that a rollback
f060: 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c   can delete tabl
f070: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a  es complete and.
f080: 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70  ** reorder rootp
f090: 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20  ages.  So it is 
f0a0: 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a  not sufficient j
f0b0: 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74  ust to save.** t
f0c0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
f0d0: 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65  cursor.  We have
f0e0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74   to invalidate t
f0f0: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20  he cursor.** so 
f100: 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72  that it is never
f110: 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a   used again..*/.
f120: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
f130: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
f140: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71  odifiedBtrees(sq
f150: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
f160: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
f170: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f180: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
f190: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
f1a0: 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c      if( p && sql
f1b0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
f1c0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ns(p) ){.      s
f1d0: 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
f1e0: 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c  llCursors(p, SQL
f1f0: 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  ITE_ABORT);.    
f200: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
f210: 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  f the Vdbe passe
f220: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
f230: 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61  rgument opened a
f240: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
f250: 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65  action,.** close
f260: 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e   it now. Argumen
f270: 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69  t eOp must be ei
f280: 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
f290: 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41  OLLBACK or.** SA
f2a0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
f2b0: 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
f2c0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
f2d0: 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
f2e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
f2f0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
f300: 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f  If eOp is SAVEPO
f310: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
f320: 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d  n the .** statem
f330: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
f340: 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a  is commtted..**.
f350: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
f360: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
f370: 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
f380: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f390: 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
f3a0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
f3b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f3c0: 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
f3d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
f3e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
f3f0: 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
f400: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f410: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  E_OK;..  /* If p
f420: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  ->iStatement is 
f430: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
f440: 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62  o, then this Vdb
f450: 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a  e opened a .  **
f460: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f470: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75  action that shou
f480: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72  ld be closed her
f490: 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65  e. The only exce
f4a0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68  ption.  ** is th
f4b0: 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d  at an IO error m
f4c0: 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c  ay have occured,
f4d0: 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
f4e0: 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
f4f0: 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
f500: 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
f510: 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
f520: 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
f530: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
f540: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
f550: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
f560: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
f570: 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
f580: 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
f590: 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
f5a0: 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
f5b0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
f5c0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f5d0: 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
f5e0: 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
f5f0: 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
f600: 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
f610: 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
f620: 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
f630: 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
f640: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f650: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
f660: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
f670: 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
f680: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f690: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f6a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
f6b0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
f6c0: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
f6d0: 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
f6e0: 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
f6f0: 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
f700: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
f710: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
f720: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
f730: 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
f740: 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
f750: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
f760: 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
f770: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
f780: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
f790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f7a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f7b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
f7c0: 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
f7d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f7e0: 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
f7f0: 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
f800: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
f810: 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
f820: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f830: 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
f840: 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
f850: 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
f860: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
f870: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
f880: 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
f890: 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
f8a0: 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
f8b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f8c0: 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
f8d0: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
f8e0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f8f0: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
f900: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
f910: 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
f920: 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cons;.    }.  }.
f930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f950: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
f960: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
f970: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
f980: 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
f990: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
f9a0: 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
f9b0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
f9c0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
f9d0: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
f9e0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f9f0: 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
fa00: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
fa10: 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
fa20: 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
fa30: 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
fa40: 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
fa50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
fa60: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
fa70: 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
fa80: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
fa90: 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
faa0: 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
fab0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
fac0: 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
fad0: 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74  STRAINT and writ
fae0: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65  e.** an error me
faf0: 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
fb00: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
fb10: 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
fb20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
fb30: 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
fb40: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
fb50: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
fb60: 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
fb70: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
fb80: 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
fb90: 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
fba0: 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66  Cons>0) || (!def
fbb0: 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
fbc0: 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a  onstraint>0) ){.
fbd0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
fbe0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
fbf0: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
fc00: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
fc10: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
fc20: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
fc30: 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  db, "foreign key
fc40: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
fc50: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
fc60: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
fc70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
fc80: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
fc90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fca0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
fcb0: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
fcc0: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
fcd0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
fce0: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
fcf0: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
fd00: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
fd10: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
fd20: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
fd30: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
fd40: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
fd50: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
fd60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
fd70: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
fd80: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
fd90: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
fda0: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
fdb0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
fdc0: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
fdd0: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
fde0: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
fdf0: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
fe00: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
fe10: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
fe20: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
fe30: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
fe40: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
fe50: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
fe60: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
fe70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
fe80: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
fe90: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
fea0: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
feb0: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
fec0: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
fed0: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
fee0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
fef0: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
ff00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
ff30: 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
ff40: 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
ff50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
ff60: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
ff70: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
ff80: 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
ff90: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
ffa0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
ffb0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
ffc0: 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
ffd0: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
ffe0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
fff0: 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
10000 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
10010 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
10020 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
10030 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
10040 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
10050 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
10060 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
10070 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
10080 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
10090 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
100a0 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
100b0 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
100c0 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
100d0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
100e0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
100f0 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
10100 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
10110 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
10120 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10130 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
10140 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
10150 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
10160 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
10170 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
10180 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
10190 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
101a0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
101b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
101c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  NOMEM;.  }.  clo
101d0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
101e0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
101f0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
10200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
10220 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10230 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
10240 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
10250 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
10260 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
10270 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
10280 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
10290 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
102a0 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
102b0 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
102c0 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
102d0 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
102e0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
102f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10300 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
10310 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
10320 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
10330 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
10340 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
10350 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10360 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
10370 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
10380 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
10390 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
103a0 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
103b0 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ff;.    assert( 
103c0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  p->rc!=SQLITE_IO
103d0 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20  ERR_BLOCKED );  
103e0 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f  /* This error no
103f0 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a   longer exists *
10400 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  /.    isSpecialE
10410 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
10420 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
10430 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
10460 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
10470 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
10480 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
10490 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
104a0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
104b0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
104c0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
104d0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
104e0 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
104f0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
10500 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
10510 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
10520 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
10530 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10540 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
10550 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
10560 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
10570 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
10580 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
10590 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
105a0 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
105b0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
105c0 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
105d0 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
105e0 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
105f0 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
10600 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
10610 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
10620 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
10630 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  cured while writ
10640 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
10650 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
10660 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
10670 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
10680 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
10690 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
106a0 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
106b0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
106c0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
106d0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
106e0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
106f0 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
10700 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
10710 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
10720 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
10730 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
10740 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
10750 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
10760 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
10770 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
10780 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
10790 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
107a0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
107b0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
107c0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
107d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
107e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
107f0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
10800 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
10810 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
10820 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
10830 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
10840 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
10850 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
10860 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
10870 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
10880 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
10890 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
108a0 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
108b0 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
108c0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
108d0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
108e0 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
108f0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
10900 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
10910 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
10920 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
10930 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10940 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
10950 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
10960 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
10970 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
10980 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
109a0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
109b0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
109c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
109d0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
109e0 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
109f0 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
10a00 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
10a10 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
10a20 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
10a30 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
10a40 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
10a50 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
10a60 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
10a70 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
10a80 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
10a90 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
10aa0 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
10ab0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
10ac0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
10ad0 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
10ae0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
10af0 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
10b00 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72   .     && db->wr
10b10 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e  iteVdbeCnt==(p->
10b20 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
10b30 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
10b40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10b50 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
10b60 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
10b70 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
10b80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10b90 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
10ba0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
10bb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
10bd0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
10be0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
10bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10c00 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
10c10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10c20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
10c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10c50 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
10c60 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20     }else{ .     
10c70 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
10c80 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
10c90 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70  true, the vdbe p
10ca0 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
10cb0 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20  ssful .         
10cc0 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f   ** or hit an 'O
10cd0 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
10ce0 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  nt and there are
10cf0 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72   no deferred for
10d00 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  eign.          *
10d10 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  * key constraint
10d20 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65  s to hold up the
10d30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
10d40 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
10d50 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
10d60 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
10d70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
10d80 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
10d90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10da0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10db0 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65  TE_BUSY && p->re
10dc0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
10dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
10de0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
10df0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10e00 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
10e10 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
10e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10e30 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
10e40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10e50 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
10e60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10e70 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
10e80 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
10e90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10ea0 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
10eb0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
10ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10ed0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10ee0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10ef0 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
10f00 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
10f10 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
10f20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
10f30 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
10f40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10f50 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
10f60 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
10f70 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
10f80 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
10f90 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
10fa0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
10fb0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
10fc0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
10fd0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
10fe0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10ff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11000 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
11010 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
11020 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
11030 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11040 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
11050 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
11060 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
11070 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
11080 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
110a0 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
110b0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
110c0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
110d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
110e0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
110f0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
11100 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
11110 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
11120 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
11130 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
11140 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
11150 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
11160 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
11170 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
11180 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
11190 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
111a0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
111b0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
111c0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
111d0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
111e0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  r code..    **. 
111f0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
11200 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
11210 53 74 61 74 65 6d 65 6e 74 28 29 20 63 61 6e 20  Statement() can 
11220 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 65 53 74  only fail if eSt
11230 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a  atementOp.    **
11240 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
11250 4c 4c 42 41 43 4b 2e 20 20 42 75 74 20 69 66 20  LLBACK.  But if 
11260 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11270 20 74 68 65 6e 20 65 53 74 61 74 65 6d 65 6e 74   then eStatement
11280 4f 70 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 62  Op.    ** must b
11290 65 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  e SAVEPOINT_RELE
112a0 41 53 45 2e 20 20 48 65 6e 63 65 20 74 68 65 20  ASE.  Hence the 
112b0 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c  NEVER(p->rc==SQL
112c0 49 54 45 5f 4f 4b 29 20 69 6e 20 0a 20 20 20 20  ITE_OK) in .    
112d0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
112e0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
112f0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
11300 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
11310 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
11320 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
11330 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
11340 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
11350 20 20 20 20 20 61 73 73 65 72 74 28 20 65 53 74       assert( eSt
11360 61 74 65 6d 65 6e 74 4f 70 3d 3d 53 41 56 45 50  atementOp==SAVEP
11370 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
11380 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56  .        if( NEV
11390 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ER(p->rc==SQLITE
113a0 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  _OK) || p->rc==S
113b0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
113c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
113d0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
113e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
113f0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
11400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
11410 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
11420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
11430 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
11440 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
11450 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
11460 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
11470 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
11480 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
11490 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
114a0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
114b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
114c0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
114d0 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
114e0 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
114f0 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
11500 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
11510 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
11520 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
11530 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
11540 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
11550 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
11560 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11570 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
11580 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
11590 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
115a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
115b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
115c0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
115d0 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
115e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
115f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
11600 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
11620 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
11630 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
11640 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ollback or commi
11650 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61  t any schema cha
11660 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72  nges that occurr
11670 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
11680 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
11690 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  && db->flags&SQL
116a0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
116b0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
116c0 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
116d0 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
116e0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
116f0 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c  (db->flags | SQL
11700 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
11710 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
11720 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
11730 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
11740 65 33 56 64 62 65 4d 75 74 65 78 52 65 73 79 6e  e3VdbeMutexResyn
11750 63 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  c(p);.    sqlite
11760 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11770 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
11780 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
11790 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
117a0 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
117b0 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
117c0 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
117d0 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64      db->activeVd
117e0 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  beCnt--;.    if(
117f0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b   !p->readOnly ){
11800 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65  .      db->write
11810 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d  VdbeCnt--;.    }
11820 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
11830 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d  >activeVdbeCnt>=
11840 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
11850 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
11860 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
11870 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
11880 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
11890 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
118a0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
118b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
118c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
118d0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
118e0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
118f0 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
11900 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
11910 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
11920 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
11930 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
11940 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
11950 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
11960 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
11970 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
11980 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
11990 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
119a0 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
119b0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
119c0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
119d0 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
119e0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
119f0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c  ctiveVdbeCnt>0 |
11a00 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
11a10 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
11a20 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
11a30 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  turn (p->rc==SQL
11a40 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54  ITE_BUSY ? SQLIT
11a50 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f  E_BUSY : SQLITE_
11a60 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  OK);.}.../*.** E
11a70 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74  ach VDBE holds t
11a80 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
11a90 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
11aa0 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
11ab0 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54  .** in p->rc.  T
11ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
11ad0 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63   that result bac
11ae0 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  k to SQLITE_OK..
11af0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11b00 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
11b10 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  lt(Vdbe *p){.  p
11b20 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
11b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
11b40 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
11b50 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
11b60 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11b70 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
11b80 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
11b90 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
11ba0 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
11bb0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
11bc0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
11bd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11be0 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
11bf0 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
11c00 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
11c10 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
11c20 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
11c30 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
11c40 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
11c50 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
11c60 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11c70 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
11c80 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
11c90 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
11ca0 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
11cb0 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
11cc0 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
11cd0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
11ce0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
11cf0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
11d00 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
11d10 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
11d20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
11d30 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
11d40 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
11d50 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
11d60 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
11d70 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
11d80 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
11d90 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
11da0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
11db0 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
11dc0 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
11dd0 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
11de0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
11df0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
11e00 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
11e10 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
11e20 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
11e30 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
11e40 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
11e50 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
11e60 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
11e70 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
11e80 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
11e90 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
11ea0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11eb0 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
11ec0 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
11ed0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11ee0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
11ef0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
11f00 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
11f10 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11f20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
11f30 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31  tStr(db->pErr,-1
11f40 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49  ,p->zErrMsg,SQLI
11f50 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
11f60 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
11f70 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11f80 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
11f90 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
11fa0 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->rc;.      sqli
11fb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
11fc0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
11fd0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
11fe0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11ff0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
12000 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
12010 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
12020 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
12030 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
12040 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
12050 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
12060 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
12070 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
12080 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
12090 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
120a0 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
120b0 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
120c0 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
120d0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
120e0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
120f0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
12100 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
12110 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
12120 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
12130 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
12140 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
12150 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
12160 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
12170 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
12180 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
12190 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
121a0 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
121b0 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
121c0 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
121d0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
121e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
121f0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
12200 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
12210 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
12220 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
12230 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
12240 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
12250 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
12260 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
12270 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
12280 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
12290 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
122a0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
122b0 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
122c0 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
122d0 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
122e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
122f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
12300 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
12310 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12320 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
12330 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
12340 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
12350 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
12360 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
12370 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
12380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12390 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
123a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
123b0 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c  "%6d %10lld %8ll
123c0 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
123d0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
123e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
123f0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
12400 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
12410 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
12420 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
12430 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
12440 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73      );.        s
12450 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
12460 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
12470 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
12480 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
12490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
124a0 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
124b0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
124c0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
124d0 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
124e0 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
124f0 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
12500 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
12510 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
12520 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
12530 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
12540 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
12550 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
12560 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
12570 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12580 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
12590 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
125a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
125b0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
125c0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
125d0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
125e0 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
125f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
12600 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
12610 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
12620 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
12630 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
12640 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
12650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12660 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
12670 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
12680 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
12690 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
126a0 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
126b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
126c0 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
126d0 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
126e0 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
126f0 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
12700 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
12710 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
12720 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
12730 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
12740 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
12750 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12760 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
12770 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
12780 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
12790 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
127a0 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
127b0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
127c0 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
127d0 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
127e0 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
127f0 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
12800 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29  k&(((u32)1)<<i))
12810 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20  ) && pAux->pAux 
12820 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  ){.      if( pAu
12830 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
12840 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
12850 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
12860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
12870 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  Aux->pAux = 0;. 
12880 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12890 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
128a0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
128b0 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
128c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
128d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65  argument..** The
128e0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
128f0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
12900 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
12910 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
12920 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
12930 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
12940 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
12950 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
12960 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
12970 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
12980 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
12990 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
129a0 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  teObject(sqlite3
129b0 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
129c0 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
129d0 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73  ub, *pNext;.  as
129e0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
129f0 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
12a00 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
12a10 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
12a20 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
12a30 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
12a40 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
12a50 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
12a60 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
12a70 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
12a80 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
12a90 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
12aa0 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
12ab0 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
12ac0 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
12ad0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12ae0 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
12af0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
12b00 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
12b10 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
12b20 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12b30 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
12b40 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
12b50 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
12b60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12b70 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >zSql);.  sqlite
12b80 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
12b90 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Free);.  sqlite3
12ba0 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
12bb0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
12bc0 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
12bd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
12be0 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
12bf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12c00 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
12c10 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
12c20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
12c30 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
12c40 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
12c50 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
12c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
12c70 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
12c80 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
12c90 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
12ca0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
12cb0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
12cc0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
12cd0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
12ce0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
12cf0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
12d00 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
12d10 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 64 62 2c  DeleteObject(db,
12d20 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   p);.}../*.** Ma
12d30 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
12d40 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
12d50 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
12d60 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
12d70 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
12d80 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
12d90 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
12da0 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
12db0 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
12dc0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
12dd0 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
12de0 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
12df0 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
12e00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
12e10 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
12e20 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
12e30 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
12e40 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
12e50 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
12e60 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
12e70 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
12e80 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
12e90 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
12ea0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
12eb0 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
12ec0 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
12ed0 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
12ee0 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
12ef0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
12f00 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
12f10 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
12f20 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
12f30 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
12f40 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
12f50 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
12f60 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
12f70 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12f80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12f90 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
12fa0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
12fb0 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
12fc0 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
12fd0 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
12fe0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
12ff0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
13000 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
13010 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
13020 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
13030 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
13040 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
13050 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f  packed(p->pCurso
13060 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
13070 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b  arget, 0, &res);
13080 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
13090 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e  turn rc;.    p->
130a0 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d  lastRowid = p->m
130b0 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20  ovetoTarget;.   
130c0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
130d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
130e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d  UPT_BKPT;.    p-
130f0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
13100 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
13110 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
13120 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
13130 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e  ;.#endif.    p->
13140 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
13150 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
13160 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
13170 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TALE;.  }else if
13180 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72  ( ALWAYS(p->pCur
13190 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  sor) ){.    int 
131a0 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e  hasMoved;.    in
131b0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
131c0 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
131d0 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68  d(p->pCursor, &h
131e0 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66  asMoved);.    if
131f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13200 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76  ;.    if( hasMov
13210 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  ed ){.      p->c
13220 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
13230 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20  HE_STALE;.      
13240 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
13250 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13270 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
13280 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
13290 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
132a0 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
132b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
132c0 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
132d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
132e0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
132f0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
13300 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
13310 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
13320 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
13330 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
13340 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
13350 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
13360 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
13370 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
13380 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
13390 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
133a0 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
133b0 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
133c0 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
133d0 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
133e0 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
133f0 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
13400 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
13410 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
13420 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
13430 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
13440 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
13450 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
13460 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
13470 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
13480 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
13490 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
134a0 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
134b0 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
134c0 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
134d0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
134e0 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
134f0 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
13500 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
13510 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
13520 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
13530 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
13540 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65  ta blob seperate
13550 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
13560 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
13570 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
13580 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
13590 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
135a0 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
135b0 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
135c0 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
135d0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
135e0 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
13600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
13610 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13620 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
13630 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
13640 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13650 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
13660 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13670 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
136a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
136b0 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
136d0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
136e0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
136f0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
13700 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
13710 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13720 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
13750 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13760 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
13770 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
13780 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13790 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
137a0 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
137b0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
137c0 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
137d0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
137e0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
137f0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
13800 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
13810 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
13820 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
13830 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
13840 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
13850 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
13880 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
13890 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
138a0 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
138b0 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
138c0 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
138d0 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
138e0 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
138f0 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
13900 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
13910 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
13920 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
13930 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
13940 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
13950 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
13960 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
13970 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13980 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
13990 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
139a0 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
139b0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
139c0 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
139d0 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
139e0 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
139f0 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
13a00 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
13a10 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
13a20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
13a30 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
13a40 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
13a50 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
13a60 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
13a70 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
13a80 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
13a90 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
13aa0 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
13ab0 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
13ac0 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
13ad0 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
13ae0 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ( file_format>=4
13af0 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a   && (i&1)==i ){.
13b00 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
13b10 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u32)i;.    }.   
13b20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
13b30 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42    if( i<(-MAX_6B
13b40 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b  YTE) ) return 6;
13b50 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  .      /* Previo
13b60 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73  us test prevents
13b70 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37  :  u = -(-922337
13b80 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a  2036854775808) *
13b90 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a  /.      u = -i;.
13ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13bb0 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
13bc0 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72    if( u<=127 ) r
13bd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
13be0 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
13bf0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
13c00 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
13c10 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
13c20 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
13c30 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
13c40 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
13c50 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
13c60 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
13c70 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
13c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
13c90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
13ca0 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
13cb0 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
13cc0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
13cd0 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e   );.  n = pMem->
13ce0 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
13cf0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
13d00 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
13d10 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ero;.  }.  asser
13d20 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74  t( n>=0 );.  ret
13d30 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20  urn ((n*2) + 12 
13d40 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74  + ((flags&MEM_St
13d50 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r)!=0));.}../*.*
13d60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
13d70 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
13d80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
13d90 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
13da0 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
13db0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
13dc0 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
13dd0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
13de0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
13df0 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
13e00 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
13e10 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
13e20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13e30 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
13e40 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
13e50 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
13e60 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
13e70 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
13e80 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
13e90 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
13ea0 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
13eb0 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
13ec0 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
13ed0 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
13ee0 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
13ef0 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
13f00 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
13f10 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
13f20 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
13f30 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
13f40 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
13f50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
13f60 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
13f70 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
13f80 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
13f90 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
13fa0 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
13fb0 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
13fc0 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
13fd0 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
13fe0 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
13ff0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
14000 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
14010 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
14020 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
14030 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
14040 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
14050 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
14060 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
14070 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
14080 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
14090 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
140a0 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
140b0 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
140c0 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
140d0 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
140e0 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
140f0 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
14100 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
14110 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
14120 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
14130 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
14140 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
14150 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
14160 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
14170 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
14180 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
14190 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
141a0 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
141b0 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
141c0 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
141d0 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
141e0 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
141f0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
14200 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
14210 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
14220 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
14230 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
14240 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
14250 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
14260 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
14270 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
14280 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
14290 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
142a0 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
142b0 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
142c0 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
142d0 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
142e0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
142f0 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
14300 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
14310 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
14320 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
14330 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
14340 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
14350 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
14360 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
14370 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
14380 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
14390 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
143a0 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
143b0 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
143c0 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
143d0 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
143e0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
143f0 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
14400 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
14410 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
14420 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
14430 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
14440 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
14450 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
14460 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
14470 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
14480 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
14490 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
144a0 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
144b0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
144c0 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
144d0 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
144e0 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
144f0 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
14500 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
14510 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14520 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
14530 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
14540 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
14550 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
14560 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
14570 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
14580 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
14590 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
145a0 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
145b0 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
145c0 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
145d0 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
145e0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
145f0 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
14600 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
14610 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
14620 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
14630 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
14640 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
14650 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
14660 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
14670 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
14680 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
14690 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
146a0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
146b0 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
146c0 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
146d0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
146e0 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
146f0 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
14700 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
14710 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
14720 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61    nBuf must alwa
14730 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65  ys be.** large e
14740 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
14750 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20  e entire field. 
14760 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
14770 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c  field is.** a bl
14780 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66  ob with a zero-f
14790 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e  illed tail, then
147a0 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20   buf[] might be 
147b0 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a  just the right.*
147c0 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65  * size to hold e
147d0 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70 74  verything except
147e0 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69   for the zero-fi
147f0 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62  lled tail.  If b
14800 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  uf[].** is only 
14810 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
14820 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ld the non-zero 
14830 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c  prefix, then onl
14840 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20  y write that.** 
14850 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b  prefix into buf[
14860 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d  ].  But if buf[]
14870 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
14880 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68   to hold both th
14890 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20  e.** prefix and 
148a0 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72  the tail then wr
148b0 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20 61  ite the prefix a
148c0 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c 20  nd set the tail 
148d0 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e  to all.** zeros.
148e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
148f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14900 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
14910 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
14920 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
14930 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
14940 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
14950 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
14960 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
14970 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
14980 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
14990 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
149a0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
149b0 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
149c0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20  , int nBuf, Mem 
149d0 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
149e0 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73  format){.  u32 s
149f0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c  erial_type = sql
14a00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14a10 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f  pe(pMem, file_fo
14a20 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e  rmat);.  u32 len
14a30 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
14a40 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
14a50 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
14a60 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
14a70 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
14a80 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
14a90 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
14aa0 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
14ab0 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
14ac0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b  zeof(pMem->r) );
14ad0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
14ae0 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65  , &pMem->r, size
14af0 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
14b00 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14b10 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
14b20 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
14b30 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
14b40 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
14b50 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
14b60 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
14b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 65  ;.    assert( le
14b80 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a  n<=(u32)nBuf );.
14b90 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
14ba0 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
14bb0 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
14bc0 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
14bd0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
14be0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
14bf0 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
14c00 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14c10 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
14c20 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
14c30 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
14c40 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
14c50 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
14c60 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
14c70 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14c80 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
14c90 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
14ca0 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
14cb0 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
14cc0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
14cd0 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
14ce0 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
14cf0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
14d00 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
14d10 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  en += pMem->u.nZ
14d20 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ero;.      asser
14d30 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20  t( nBuf>=0 );.  
14d40 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75      if( len > (u
14d50 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  32)nBuf ){.     
14d60 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42     len = (u32)nB
14d70 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  uf;.      }.    
14d80 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d    memset(&buf[pM
14d90 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70  em->n], 0, len-p
14da0 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20  Mem->n);.    }. 
14db0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
14dc0 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
14dd0 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
14de0 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
14df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
14e00 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
14e10 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
14e20 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
14e30 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
14e40 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
14e50 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
14e60 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
14e70 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
14e80 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  ad..*/ .u32 sqli
14e90 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
14ea0 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
14eb0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
14ec0 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
14ed0 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
14ee0 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
14ef0 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
14f00 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
14f10 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
14f20 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
14f50 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
14f60 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
14f70 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
14f80 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
14f90 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
14fa0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
14fb0 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
14fc0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
14fd0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
14fe0 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
14ff0 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
15000 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15010 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
15020 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15030 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
15040 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15050 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
15060 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63  >u.i = (signed c
15070 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20  har)buf[0];.    
15080 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15090 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
150a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
150b0 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
150c0 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
150d0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
150e0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
150f0 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
15100 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
15110 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15120 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15130 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
15140 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
15150 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
15160 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
15170 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
15180 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
15190 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75  f[0])<<16) | (bu
151a0 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32  f[1]<<8) | buf[2
151b0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
151c0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
151d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
151e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
151f0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
15200 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
15210 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15220 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
15230 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
15240 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
15250 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[3];.      pMem
15260 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15270 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
15280 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
15290 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
152a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
152b0 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d  */.      u64 x =
152c0 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
152d0 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
152e0 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20  f[1];.      u32 
152f0 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29  y = (buf[2]<<24)
15300 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20   | (buf[3]<<16) 
15310 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20  | (buf[4]<<8) | 
15320 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20  buf[5];.      x 
15330 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
15340 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
15350 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
15360 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15370 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
15380 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
15390 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
153a0 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
153b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
153c0 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
153d0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
153e0 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20  .      u64 x;.  
153f0 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21      u32 y;.#if !
15400 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
15410 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15420 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
15430 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a  _POINT).      /*
15440 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
15450 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
15460 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
15470 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
15480 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
15490 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
154a0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
154b0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
154c0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e  s.      ** defin
154d0 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
154e0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
154f0 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
15500 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65  mixed.      ** e
15510 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ndian..      */.
15520 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
15530 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
15540 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
15550 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  2;.      static 
15560 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
15570 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34  = 1.0;.      u64
15580 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20   t2 = t1;.      
15590 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
155a0 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20  loat(t2);.      
155b0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
155c0 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
155d0 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
155e0 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
155f0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  0 );.#endif..   
15600 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c     x = (buf[0]<<
15610 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
15620 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
15630 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
15640 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34   y = (buf[4]<<24
15650 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29  ) | (buf[5]<<16)
15660 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c   | (buf[6]<<8) |
15670 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78   buf[7];.      x
15680 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
15690 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
156a0 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
156b0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
156c0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
156d0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
156e0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
156f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
15700 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
15710 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
15720 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  em->r)==8 );.   
15730 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
15740 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
15750 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d        memcpy(&pM
15760 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
15770 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70  f(x));.        p
15780 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
15790 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
157a0 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
157b0 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20  MEM_Real;.      
157c0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  }.      return 8
157d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
157e0 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
157f0 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
15800 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
15810 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d   1 */.      pMem
15820 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
15830 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
15840 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
15850 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
15860 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
15870 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75  fault: {.      u
15880 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c  32 len = (serial
15890 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
158a0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
158b0 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
158c0 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20  pMem->n = len;. 
158d0 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
158e0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
158f0 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20  erial_type&0x01 
15900 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
15910 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
15920 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
15930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15940 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15950 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
15960 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  Ephem;.      }. 
15970 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b       return len;
15980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15990 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
159a0 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
159b0 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
159c0 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
159d0 79 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a  y[], parse the.*
159e0 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20  * record into a 
159f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
15a00 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
15a10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
15a20 2a 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  * that structure
15a30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
15a40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67  ing function mig
15a50 68 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61  ht provide szSpa
15a60 63 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ce bytes of memo
15a70 72 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70  ry.** space at p
15a80 53 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61  Space.  This spa
15a90 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ce can be used t
15aa0 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
15ab0 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65  ned.** VDbeParse
15ac0 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
15ad0 65 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65  e if it is large
15ae0 20 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20   enough.  If it 
15af0 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e  is.** not big en
15b00 6f 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f  ough, space is o
15b10 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
15b20 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
15b30 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
15b40 64 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75  d structure shou
15b50 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20  ld be closed by 
15b60 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  a call to.** sql
15b70 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
15b80 70 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a  packedRecord()..
15b90 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  */ .UnpackedReco
15ba0 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52  rd *sqlite3VdbeR
15bb0 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
15bc0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15bd0 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
15be0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
15bf0 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
15c00 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
15c10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15c20 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
15c30 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
15c40 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
15c50 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
15c60 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
15c70 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
15c80 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
15c90 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
15ca0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65  to hold the obje
15cb0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  ct */.  int szSp
15cc0 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ace            /
15cd0 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
15ce0 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  [] in bytes */.)
15cf0 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
15d00 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
15d10 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
15d20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55  char *)pKey;.  U
15d30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
15d40 3b 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b  ;  /* The unpack
15d50 65 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 77  ed record that w
15d60 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f  e will return */
15d70 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
15d80 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
15d90 20 73 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f   space needed to
15da0 20 68 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65   hold p, in byte
15db0 73 20 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20  s */.  int d;.  
15dc0 75 33 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75  u32 idx;.  u16 u
15dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15de0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
15df0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
15e00 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
15e10 4d 65 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  Mem;.  int nOff;
15e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15e30 63 72 65 61 73 65 20 70 53 70 61 63 65 20 62 79  crease pSpace by
15e40 20 74 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d   this much to 8-
15e50 62 79 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f  byte align it */
15e60 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  .  .  /*.  ** We
15e70 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
15e80 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
15e90 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
15ea0 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
15eb0 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
15ec0 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
15ed0 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
15ee0 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
15ef0 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
15f00 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
15f10 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
15f20 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
15f30 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
15f40 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
15f50 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
15f60 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
15f70 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
15f80 20 70 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b   pSpace += nOff;
15f90 0a 20 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f  .  szSpace -= nO
15fa0 66 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  ff;.  nByte = RO
15fb0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
15fc0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
15fd0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
15fe0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
15ff0 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
16000 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20  pace ){.    p = 
16010 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
16020 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
16030 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
16040 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
16050 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
16060 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46   UNPACKED_NEED_F
16070 52 45 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e  REE | UNPACKED_N
16080 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
16090 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
160a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70  npackedRecord*)p
160b0 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c  Space;.    p->fl
160c0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
160d0 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
160e0 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
160f0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
16100 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
16110 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
16120 20 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20   p->aMem = pMem 
16130 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
16140 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
16150 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
16160 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ))];.  assert( E
16170 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
16180 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
16190 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
161a0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
161b0 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
161c0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
161d0 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
161e0 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
161f0 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
16200 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
16210 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
16220 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
16230 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
16240 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
16250 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
16260 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
16270 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d  fo->db;.    pMem
16280 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ->flags = 0;.   
16290 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pMem->zMalloc =
162a0 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
162b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
162c0 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
162d0 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
162e0 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
162f0 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  u++;.  }.  asser
16300 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
16310 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  nField + 1 );.  
16320 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20  p->nField = u;. 
16330 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
16340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16350 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73  routine destroys
16360 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72   a UnpackedRecor
16370 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  d object..*/.voi
16380 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16390 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
163a0 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  d(UnpackedRecord
163b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
163c0 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61   Mem *pMem;..  a
163d0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
163e0 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
163f0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
16400 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66  D_DESTROY );.  f
16410 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e  or(i=0, pMem=p->
16420 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c  aMem; i<p->nFiel
16430 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b  d; i++, pMem++){
16440 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61  .    /* The unpa
16450 63 6b 65 64 20 72 65 63 6f 72 64 20 69 73 20 61  cked record is a
16460 6c 77 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65  lways constructe
16470 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  d by the.    ** 
16480 73 71 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63  sqlite3VdbeUnpac
16490 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69  kRecord() functi
164a0 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20  on above, which 
164b0 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a  makes all.    **
164c0 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
164d0 62 73 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20  bs static.  And 
164e0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d  none of the elem
164f0 65 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ents are.    ** 
16500 65 76 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64  ever transformed
16510 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
16520 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ver anything to 
16530 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20  delete..    */. 
16540 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65     if( NEVER(pMe
16550 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71  m->zMalloc) ) sq
16560 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
16570 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20  ase(pMem);.  }. 
16580 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
16590 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52  UNPACKED_NEED_FR
165a0 45 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EE ){.    sqlite
165b0 33 44 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49  3DbFree(p->pKeyI
165c0 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  nfo->db, p);.  }
165d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
165e0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
165f0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
16600 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
16610 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
16620 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
16630 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
16640 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
16650 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
16660 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
16670 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
16680 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
16690 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
166a0 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
166b0 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
166c0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
166d0 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
166e0 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  y th OP_MakeReco
166f0 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
16700 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
16710 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
16720 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
16730 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
16740 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
16750 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
16760 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
16770 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
16780 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
16790 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
167a0 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79  elds..** The key
167b0 20 77 69 74 68 20 66 65 77 65 72 20 66 69 65 6c   with fewer fiel
167c0 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f  ds is usually co
167d0 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e  mpares less than
167e0 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20   the .** longer 
167f0 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66  key.  However if
16800 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e   the UNPACKED_IN
16810 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70  CRKEY flags in p
16820 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20  PKey2 is set.** 
16830 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  and the common p
16840 72 65 66 69 78 65 73 20 61 72 65 20 65 71 75 61  refixes are equa
16850 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20  l, then key1 is 
16860 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a  less than key2..
16870 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50  ** Or if the UNP
16880 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46  ACKED_MATCH_PREF
16890 49 58 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  IX flag is set a
168a0 6e 64 20 74 68 65 20 70 72 65 66 69 78 65 73 20  nd the prefixes 
168b0 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68  are.** equal, th
168c0 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  en the keys are 
168d0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
168e0 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68   equal and.** th
168f0 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74  e parts beyond t
16900 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
16910 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a   are ignored..**
16920 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43  .** If the UNPAC
16930 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
16940 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
16950 65 6e 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  en the last byte
16960 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   of.** the heade
16970 72 20 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67  r of pKey1 is ig
16980 6e 6f 72 65 64 2e 20 20 49 74 20 69 73 20 61 73  nored.  It is as
16990 73 75 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31  sumed that pKey1
169a0 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20   is.** an index 
169b0 6b 65 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e  key, and thus en
169c0 64 73 20 77 69 74 68 20 61 20 72 6f 77 69 64 20  ds with a rowid 
169d0 76 61 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74  value.  The last
169e0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
169f0 68 65 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72  header will ther
16a00 65 66 6f 72 65 20 62 65 20 74 68 65 20 73 65 72  efore be the ser
16a10 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
16a20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66  rowid:.** one of
16a30 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20   1, 2, 3, 4, 5, 
16a40 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65  6, 8, or 9 - the
16a50 20 69 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20   integer serial 
16a60 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65  types..** The se
16a70 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
16a80 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c   final rowid wil
16a90 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 73 69  l always be a si
16aa0 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79  ngle byte..** By
16ab0 20 69 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c   ignoring this l
16ac0 61 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  ast byte of the 
16ad0 68 65 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65  header, we force
16ae0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
16af0 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
16b00 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
16b10 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e  d of key1..*/.in
16b20 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
16b30 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
16b40 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
16b50 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
16b60 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
16b70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
16b80 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
16b90 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
16ba0 69 6e 74 20 64 31 3b 20 20 20 20 20 20 20 20 20  int d1;         
16bb0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
16bc0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
16bd0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
16be0 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
16bf0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
16c00 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
16c10 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
16c20 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
16c30 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
16c40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
16c50 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
16c60 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
16c70 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
16c80 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
16c90 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
16ca0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
16cb0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
16cc0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
16cd0 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
16ce0 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
16cf0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
16d00 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
16d10 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
16d20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
16d30 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
16d40 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
16d50 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
16d60 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
16d70 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
16d80 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
16d90 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  m1.zMalloc = 0; 
16da0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
16db0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
16dc0 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
16dd0 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
16de0 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
16df0 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
16e00 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
16e10 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
16e20 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
16e30 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
16e40 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
16e50 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
16e60 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
16e70 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
16e80 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
16e90 73 65 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  sed initialized,
16ea0 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a   and doing .  **
16eb0 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
16ec0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
16ed0 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65  has a measurable
16ee0 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72   negative perfor
16ef0 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63  mance.  ** impac
16f00 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  t, since this ro
16f10 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20  utine is a very 
16f20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e  high runner.  An
16f30 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a  d so, we choose.
16f40 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74    ** to ignore t
16f50 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
16f60 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74  ings and leave t
16f70 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69  his variable uni
16f80 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
16f90 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20  .  /*  mem1.u.i 
16fa0 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65  = 0;  // not nee
16fb0 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c  ded, here to sil
16fc0 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ence compiler wa
16fd0 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64  rning */.  .  id
16fe0 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
16ff0 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
17000 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
17010 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
17020 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
17030 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20  GNORE_ROWID ){. 
17040 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d     szHdr1--;.  }
17050 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
17060 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
17070 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
17080 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
17090 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
170a0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
170b0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
170c0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
170d0 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
170e0 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
170f0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
17100 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
17110 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
17120 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
17130 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
17140 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17150 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
17160 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
17170 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
17180 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
17190 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
171a0 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
171b0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
171c0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
171d0 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
171e0 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
171f0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
17200 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
17210 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
17220 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
17230 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
17260 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
17270 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
17280 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
17290 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
172a0 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
172b0 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
172c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72  ..      /* Inver
172d0 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66 20  t the result if 
172e0 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45 53  we are using DES
172f0 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
17300 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
17310 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
17320 26 26 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70  && i<nField && p
17330 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
17340 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
17350 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
17360 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f    }.    .      /
17370 2a 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f  * If the PREFIX_
17380 53 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73  SEARCH flag is s
17390 65 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64  et and all field
173a0 73 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e  s except the fin
173b0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  al.      ** rowi
173c0 64 20 66 69 65 6c 64 20 77 65 72 65 20 65 71 75  d field were equ
173d0 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74  al, then clear t
173e0 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48  he PREFIX_SEARCH
173f0 20 66 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20   flag and set . 
17400 20 20 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e       ** pPKey2->
17410 72 6f 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c  rowid to the val
17420 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ue of the rowid 
17430 66 69 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c  field in (pKey1,
17440 20 6e 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a   nKey1)..      *
17450 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  * This is used b
17460 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75  y the OP_IsUniqu
17470 65 20 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20  e opcode..      
17480 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  */.      if( (pP
17490 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
174a0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
174b0 41 52 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b  ARCH) && i==(pPK
174c0 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29  ey2->nField-1) )
174d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
174e0 28 20 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26  ( idx1==szHdr1 &
174f0 26 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20  & rc );.        
17500 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61  assert( mem1.fla
17510 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
17520 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
17530 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b  flags &= ~UNPACK
17540 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
17550 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79 32  ;.        pPKey2
17560 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75  ->rowid = mem1.u
17570 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  .i;.      }.    
17580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
175a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  .  }..  /* No me
175b0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
175c0 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
175d0 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
175e0 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
175f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
17600 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
17610 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
17620 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
17630 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
17640 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
17650 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
17660 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
17670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
17680 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
17690 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
176a0 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
176b0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
176c0 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
176d0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
176e0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
176f0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
17700 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  l. If the UNPACK
17710 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20  ED_INCRKEY.  ** 
17720 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
17730 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
17740 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
17750 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a   as larger..  **
17760 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
17770 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
17780 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
17790 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
177a0 70 72 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72  prefixes.  ** ar
177b0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
177c0 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72  be equal.  Other
177d0 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72  wise, the longer
177e0 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a   key is the .  *
177f0 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74  * larger.  As it
17800 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50   happens, the pP
17810 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73  Key2 will always
17820 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20   be the longer. 
17830 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20   ** if there is 
17840 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  a difference..  
17850 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  */.  assert( rc=
17860 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65  =0 );.  if( pPKe
17870 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
17880 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a  CKED_INCRKEY ){.
17890 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d      rc = -1;.  }
178a0 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
178b0 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
178c0 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29  D_PREFIX_MATCH )
178d0 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72  {.    /* Leave r
178e0 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  c==0 */.  }else 
178f0 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
17900 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
17910 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17920 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  }. ../*.** pCur 
17930 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
17940 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
17950 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
17960 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
17970 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
17980 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
17990 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
179a0 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
179b0 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
179c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
179d0 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
179e0 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
179f0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
17a00 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
17a10 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
17a20 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
17a30 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
17a40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
17a50 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
17a60 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
17a70 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
17a80 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
17a90 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
17aa0 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
17ab0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
17ac0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
17ad0 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
17ae0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
17af0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
17b00 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
17b10 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
17b20 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
17b30 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
17b40 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
17b50 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
17b60 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
17b70 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
17b80 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
17b90 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
17ba0 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a  METER(db);..  /*
17bb0 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
17bc0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
17bd0 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
17be0 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
17bf0 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
17c00 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
17c10 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
17c20 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
17c30 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
17c40 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
17c50 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
17c60 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
17c70 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
17c80 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
17c90 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
17ca0 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
17cb0 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
17cc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
17cd0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17ce0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
17cf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17d00 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
17d10 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
17d20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
17d30 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20  TE_OK );     /* 
17d40 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
17d50 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
17d60 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
17d70 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b   assert( (nCellK
17d80 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ey & SQLITE_MAX_
17d90 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c  U32)==(u64)nCell
17da0 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  Key );..  /* Rea
17db0 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  d in the complet
17dc0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
17dd0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
17de0 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20    memset(&m, 0, 
17df0 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63  sizeof(m));.  rc
17e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
17e10 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
17e20 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
17e30 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
17e40 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
17e50 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17e60 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
17e70 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
17e80 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
17e90 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
17ea0 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
17eb0 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
17ec0 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
17ed0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
17ee0 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
17ef0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
17f00 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
17f10 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
17f20 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
17f30 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
17f40 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
17f50 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
17f60 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
17f70 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
17f80 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
17f90 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
17fa0 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
17fb0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
17fc0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
17fd0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
17fe0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
17ff0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
18000 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
18010 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
18020 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
18030 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
18040 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
18050 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
18060 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
18070 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
18080 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
18090 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
180a0 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
180b0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
180c0 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
180d0 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
180e0 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
180f0 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
18100 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
18110 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
18120 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
18130 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
18140 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18150 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74  (typeRowid);.  t
18160 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
18170 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
18180 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
18190 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
181a0 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
181b0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
181c0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
181d0 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
181e0 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
181f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
18200 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
18210 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18220 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
18230 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
18240 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
18250 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
18260 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18270 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
18280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18290 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
182a0 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
182b0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
182c0 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
182d0 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
182e0 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
182f0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
18300 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18310 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
18320 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
18330 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f  stcase( m.zMallo
18340 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
18350 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
18360 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
18370 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18380 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
18390 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
183a0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
183b0 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
183c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
183d0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
183e0 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
183f0 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
18400 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
18410 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
18420 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
18430 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
18440 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
18450 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
18460 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
18470 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
18480 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
18490 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
184a0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
184b0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
184c0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
184d0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
184e0 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
184f0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
18500 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
18510 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
18520 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
18530 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
18540 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
18550 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
18560 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
18570 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
18580 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
18590 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
185a0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
185b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
185c0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64  KeyCompare(.  Vd
185d0 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
185e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
185f0 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
18600 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
18610 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
18620 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55  pUnpacked,  /* U
18630 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
18640 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  of key to compar
18650 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69  e against */.  i
18660 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
18670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
18680 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
18690 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
186a0 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
186b0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
186c0 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
186d0 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
186e0 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
186f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
18700 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
18710 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
18720 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
18730 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
18740 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
18750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18760 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
18770 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
18780 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
18790 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
187a0 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
187b0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
187c0 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
187d0 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
187e0 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
187f0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
18800 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
18810 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
18820 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
18830 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
18840 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
18850 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
18860 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
18870 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18880 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
18890 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
188a0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
188b0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
188c0 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
188d0 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
188e0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
188f0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
18900 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
18910 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
18920 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
18930 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20  GNORE_ROWID );. 
18940 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
18950 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
18960 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
18970 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
18980 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
18990 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
189a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
189b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
189c0 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
189d0 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
189e0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
189f0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
18a00 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
18a10 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
18a20 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
18a30 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
18a40 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
18a50 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
18a60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18a70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
18a80 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
18a90 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
18aa0 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
18ab0 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
18ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
18ad0 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
18ae0 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
18af0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
18b00 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
18b10 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
18b20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18b30 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
18b40 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
18b50 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
18b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
18b70 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
18b80 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
18b90 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
18ba0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
18bb0 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
18bc0 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
18bd0 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
18be0 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
18bf0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
18c00 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
18c10 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
18c20 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
18c30 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
18c40 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
18c50 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
18c60 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
18c70 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
18c80 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
18c90 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
18ca0 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
18cb0 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
18cc0 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
18cd0 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
18ce0 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
18cf0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
18d00 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
18d10 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
18d20 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
18d30 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
18d40 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
18d50 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
18d60 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
18d70 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
18d80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
18d90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
18da0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
18db0 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
18dc0 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
18dd0 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
18de0 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
18df0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
18e00 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
18e10 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
18e20 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
18e30 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
18e40 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
18e50 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
18e60 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
18e70 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
18e80 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
18e90 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
18ea0 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
18eb0 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
18ec0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
18ed0 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
18ee0 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
18ef0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18f00 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
18f10 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
18f20 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
18f30 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
18f40 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
18f50 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
18f60 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
18f70 65 47 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a  eGetValue(Vdbe *
18f80 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
18f90 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
18fa0 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
18fb0 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
18fc0 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
18fd0 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
18fe0 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
18ff0 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
19000 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
19010 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
19020 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
19030 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
19040 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19050 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
19060 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
19070 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19080 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
19090 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
190a0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
190b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
190c0 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d  eMemStoreType((M
190d0 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  em *)pRet);.    
190e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
190f0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
19100 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
19110 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
19120 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
19130 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
19140 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
19150 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
19160 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
19170 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
19180 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
19190 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
191a0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
191b0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
191c0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
191d0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
191e0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
191f0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
19200 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
19210 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
19220 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
19230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
19240 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
19250 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
19260 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.